/ Hex Artifact Content
Login

Artifact 97fd0bb853e01e6890ad9aae97e7f9155330ebdc:


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 37  : pager.c,v 1.37
0350: 39 20 32 30 30 37 2f 30 38 2f 32 38 20 32 32 3a  9 2007/08/28 22:
0360: 32 34 3a 33 35 20 64 72 68 20 45 78 70 20 24 0a  24:35 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 3c 61  t.h".#include <a
03b0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03c0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03d0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03e0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03f0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0400: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0410: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62  efine sqlite3Deb
0420: 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a  ugPrintf printf.
0430: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0440: 43 45 31 28 58 29 20 20 20 20 20 20 20 73 71 6c  CE1(X)       sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
0460: 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  X).#define PAGER
0470: 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20  TRACE2(X,Y)     
0480: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0490: 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  tf(X,Y).#define 
04a0: 50 41 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c  PAGERTRACE3(X,Y,
04b0: 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  Z)   sqlite3Debu
04c0: 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23  gPrintf(X,Y,Z).#
04d0: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
04e0: 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69  E4(X,Y,Z,W) sqli
04f0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0500: 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20  ,Y,Z,W).#define 
0510: 50 41 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c  PAGERTRACE5(X,Y,
0520: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0530: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0540: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0550: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0560: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0570: 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69  RACE2(X,Y).#defi
0580: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
0590: 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Y,Z).#define PA
05a0: 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c  GERTRACE4(X,Y,Z,
05b0: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
05c0: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
05d0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
05e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
05f0: 6f 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65  o macros are use
0600: 64 20 77 69 74 68 69 6e 20 74 68 65 20 50 41 47  d within the PAG
0610: 45 52 54 52 41 43 45 58 28 29 20 6d 61 63 72 6f  ERTRACEX() macro
0620: 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 70 72  s above.** to pr
0630: 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64 65 73  int out file-des
0640: 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a  criptors. .**.**
0650: 20 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73   PAGERID() takes
0660: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
0670: 50 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20  Pager struct as 
0680: 69 74 27 73 20 61 72 67 75 6d 65 6e 74 2e 20 54  it's argument. T
0690: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
06a0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
06b0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49   is returned. FI
06c0: 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b  LEHANDLEID() tak
06d0: 65 73 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69  es an sqlite3_fi
06e0: 6c 65 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20  le.** struct as 
06f0: 69 74 27 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  it's argument..*
0700: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 49  /.#define PAGERI
0710: 44 28 70 29 20 28 28 69 6e 74 29 28 70 2d 3e 66  D(p) ((int)(p->f
0720: 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45  d)).#define FILE
0730: 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69  HANDLEID(fd) ((i
0740: 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  nt)fd)../*.** Th
0750: 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73 20  e page cache as 
0760: 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79  a whole is alway
0770: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
0780: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
0790: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  tes:.**.**   PAG
07a0: 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20  ER_UNLOCK       
07b0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
07c0: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
07d0: 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20   reading or .** 
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74 68        writing th
0800: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0810: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a    There is no.**
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c 64         data held
0840: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
0850: 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
0860: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0870: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 2e            state.
0880: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53  .**.**   PAGER_S
0890: 48 41 52 45 44 20 20 20 20 20 20 20 20 54 68 65  HARED        The
08a0: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 72   page cache is r
08b0: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
08c0: 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ase..**         
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72                Wr
08e0: 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72  iting is not per
08f0: 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20 63  mitted.  There c
0900: 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  an be.**        
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
0920: 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
0930: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
0940: 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  me database.**  
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68 65       file at the
0970: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   same time..**.*
0980: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
0990: 45 44 20 20 20 20 20 20 54 68 69 73 20 70 72 6f  ED      This pro
09a0: 63 65 73 73 20 68 61 73 20 72 65 73 65 72 76 65  cess has reserve
09b0: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
09c0: 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20  or writing.**   
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20      but has not 
09f0: 79 65 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61  yet made any cha
0a00: 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20  nges.  Only one 
0a10: 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20  process.**      
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a30: 20 61 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72   at a time can r
0a40: 65 73 65 72 76 65 20 74 68 65 20 64 61 74 61 62  eserve the datab
0a50: 61 73 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e  ase.  The origin
0a60: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0a80: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f  base file has no
0a90: 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  t been modified 
0aa0: 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20  so other.**     
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 20 20 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20    processes may 
0ad0: 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
0ae0: 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20   the on-disk.** 
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
0b10: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ile..**.**   PAG
0b20: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20  ER_EXCLUSIVE    
0b30: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0b40: 69 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  is writing the d
0b50: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20  atabase..**     
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 20 20 41 63 63 65 73 73 20 69 73 20 65 78 63 6c    Access is excl
0b80: 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72  usive.  No other
0b90: 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a   processes or.**
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20 63         threads c
0bc0: 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72  an be reading or
0bd0: 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f   writing while o
0be0: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ne.**           
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63              proc
0c00: 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a  ess is writing..
0c10: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59  **.**   PAGER_SY
0c20: 4e 43 45 44 20 20 20 20 20 20 20 20 54 68 65 20  NCED        The 
0c30: 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74  pager moves to t
0c40: 68 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50  his state from P
0c50: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a  AGER_EXCLUSIVE.*
0c60: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0c70: 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61 6c          after al
0c80: 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68 61  l dirty pages ha
0c90: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
0ca0: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
0cd0: 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 62  d the file has b
0ce0: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a  een synced to.**
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c         disk. All
0d10: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f   that remains to
0d20: 20 64 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65   do is to remove
0d30: 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   or.**          
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 75               tru
0d50: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
0d60: 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 74  l file and the t
0d70: 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20  ransaction .**  
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d       will be com
0da0: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
0db0: 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d  e page cache com
0dc0: 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55  es up in PAGER_U
0dd0: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0de0: 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69  t time a.** sqli
0df0: 74 65 33 50 61 67 65 72 47 65 74 28 29 20 6f 63  te3PagerGet() oc
0e00: 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65 20  curs, the state 
0e10: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50  transitions to P
0e20: 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20  AGER_SHARED..** 
0e30: 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20  After all pages 
0e40: 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73  have been releas
0e50: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f  ed using sqlite_
0e60: 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a  page_unref(),.**
0e70: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0e80: 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50  itions back to P
0e90: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0ea0: 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20  e first time.** 
0eb0: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
0ec0: 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
0ed0: 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  ed, the state tr
0ee0: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20  ansitions to.** 
0ef0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20  PAGER_RESERVED. 
0f00: 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69   (Note that sqli
0f10: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
0f20: 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63  can only be.** c
0f30: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73  alled on an outs
0f40: 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69  tanding page whi
0f50: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ch means that th
0f60: 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20  e pager must.** 
0f70: 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52  be in PAGER_SHAR
0f80: 45 44 20 62 65 66 6f 72 65 20 69 74 20 74 72 61  ED before it tra
0f90: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45  nsitions to PAGE
0fa0: 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20  R_RESERVED.).** 
0fb0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 6d  PAGER_RESERVED m
0fc0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20  eans that there 
0fd0: 69 73 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62  is an open rollb
0fe0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  ack journal..** 
0ff0: 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74  The transition t
1000: 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  o PAGER_EXCLUSIV
1010: 45 20 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20  E occurs before 
1020: 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61  any changes.** a
1030: 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
1040: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
1050: 6f 75 67 68 20 77 72 69 74 65 73 20 74 6f 20 74  ough writes to t
1060: 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a  he rollback.** j
1070: 6f 75 72 6e 61 6c 20 6f 63 63 75 72 73 20 77 69  ournal occurs wi
1080: 74 68 20 6a 75 73 74 20 50 41 47 45 52 5f 52 45  th just PAGER_RE
1090: 53 45 52 56 45 44 2e 20 20 41 66 74 65 72 20 61  SERVED.  After a
10a0: 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  n sqlite3PagerRo
10b0: 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73  llback().** or s
10c0: 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
10d0: 74 50 68 61 73 65 54 77 6f 28 29 2c 20 74 68 65  tPhaseTwo(), the
10e0: 20 73 74 61 74 65 20 63 61 6e 20 67 6f 20 62 61   state can go ba
10f0: 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
1100: 45 44 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e  ED,.** or it can
1110: 20 73 74 61 79 20 61 74 20 50 41 47 45 52 5f 45   stay at PAGER_E
1120: 58 43 4c 55 53 49 56 45 20 69 66 20 77 65 20 61  XCLUSIVE if we a
1130: 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  re in exclusive 
1140: 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a  access mode..*/.
1150: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e  #define PAGER_UN
1160: 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66  LOCK      0.#def
1170: 69 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45 44  ine PAGER_SHARED
1180: 20 20 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d        1   /* sam
1190: 65 20 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b  e as SHARED_LOCK
11a0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
11b0: 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 32 20  R_RESERVED    2 
11c0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53    /* same as RES
11d0: 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64  ERVED_LOCK */.#d
11e0: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c  efine PAGER_EXCL
11f0: 55 53 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73  USIVE   4   /* s
1200: 61 6d 65 20 61 73 20 45 58 43 4c 55 53 49 56 45  ame as EXCLUSIVE
1210: 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65  _LOCK */.#define
1220: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
1230: 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74     5../*.** If t
1240: 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  he SQLITE_BUSY_R
1250: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63  ESERVED_LOCK mac
1260: 72 6f 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ro is set to tru
1270: 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  e at compile-tim
1280: 65 2c 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65  e,.** then faile
1290: 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65  d attempts to ge
12a0: 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  t a reserved loc
12b0: 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68  k will invoke th
12c0: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e  e busy callback.
12d0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20  .** This is off 
12e0: 62 79 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20  by default.  To 
12f0: 73 65 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65  see why, conside
1300: 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
1310: 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a  scenario:.** .**
1320: 20 53 75 70 70 6f 73 65 20 74 68 72 65 61 64 20   Suppose thread 
1330: 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
1340: 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20  shared lock and 
1350: 77 61 6e 74 73 20 61 20 72 65 73 65 72 76 65 64  wants a reserved
1360: 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64   lock..** Thread
1370: 20 42 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   B already has a
1380: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61   reserved lock a
1390: 6e 64 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c  nd wants an excl
13a0: 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a  usive lock.  If.
13b0: 2a 2a 20 62 6f 74 68 20 74 68 72 65 61 64 73 20  ** both threads 
13c0: 61 72 65 20 75 73 69 6e 67 20 74 68 65 69 72 20  are using their 
13d0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20  busy callbacks, 
13e0: 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f  it might be a lo
13f0: 6e 67 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f  ng time.** be fo
1400: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72  r one of the thr
1410: 65 61 64 73 20 67 69 76 65 20 75 70 20 61 6e 64  eads give up and
1420: 20 61 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65   allows the othe
1430: 72 20 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a  r to proceed..**
1440: 20 42 75 74 20 69 66 20 74 68 65 20 74 68 72 65   But if the thre
1450: 61 64 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74  ad trying to get
1460: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f   the reserved lo
1470: 63 6b 20 67 69 76 65 73 20 75 70 20 71 75 69 63  ck gives up quic
1480: 6b 6c 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65  kly.** (if it ne
1490: 76 65 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20  ver invokes its 
14a0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74  busy callback) t
14b0: 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69  hen the contenti
14c0: 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65  on will be.** re
14d0: 73 6f 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a  solved quickly..
14e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
14f0: 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
1500: 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51  LOCK.# define SQ
1510: 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56  LITE_BUSY_RESERV
1520: 45 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66  ED_LOCK 0.#endif
1530: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63  ../*.** This mac
1540: 72 6f 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73  ro rounds values
1550: 20 75 70 20 73 6f 20 74 68 61 74 20 69 66 20 74   up so that if t
1560: 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61  he value is an a
1570: 64 64 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20  ddress it.** is 
1580: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1590: 20 61 6e 20 61 64 64 72 65 73 73 20 74 68 61 74   an address that
15a0: 20 69 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61   is aligned to a
15b0: 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72  n 8-byte boundar
15c0: 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f  y..*/.#define FO
15d0: 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29  RCE_ALIGNMENT(X)
15e0: 20 20 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a     (((X)+7)&~7).
15f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1600: 50 67 48 64 72 20 50 67 48 64 72 3b 0a 0a 2f 2a  PgHdr PgHdr;../*
1610: 0a 2a 2a 20 45 61 63 68 20 70 61 67 65 72 20 73  .** Each pager s
1620: 74 6f 72 65 73 20 61 6c 6c 20 63 75 72 72 65 6e  tores all curren
1630: 74 6c 79 20 75 6e 72 65 66 65 72 65 6e 63 65 64  tly unreferenced
1640: 20 70 61 67 65 73 20 69 6e 20 61 20 6c 69 73 74   pages in a list
1650: 20 73 6f 72 74 65 64 0a 2a 2a 20 69 6e 20 6c 65   sorted.** in le
1660: 61 73 74 2d 72 65 63 65 6e 74 6c 79 2d 75 73 65  ast-recently-use
1670: 64 20 28 4c 52 55 29 20 6f 72 64 65 72 20 28 69  d (LRU) order (i
1680: 2e 65 2e 20 74 68 65 20 66 69 72 73 74 20 69 74  .e. the first it
1690: 65 6d 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 68  em on the list h
16a0: 61 73 20 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20  as .** not been 
16b0: 72 65 66 65 72 65 6e 63 65 64 20 69 6e 20 61 20  referenced in a 
16c0: 6c 6f 6e 67 20 74 69 6d 65 2c 20 74 68 65 20 6c  long time, the l
16d0: 61 73 74 20 69 74 65 6d 20 68 61 73 20 62 65 65  ast item has bee
16e0: 6e 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 75 73  n recently.** us
16f0: 65 64 29 2e 20 41 6e 20 69 6e 73 74 61 6e 63 65  ed). An instance
1700: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
1710: 72 65 20 69 73 20 69 6e 63 6c 75 64 65 64 20 61  re is included a
1720: 73 20 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a  s part of each.*
1730: 2a 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  * pager structur
1740: 65 20 66 6f 72 20 74 68 69 73 20 70 75 72 70 6f  e for this purpo
1750: 73 65 20 28 76 61 72 69 61 62 6c 65 20 50 61 67  se (variable Pag
1760: 65 72 2e 6c 72 75 29 2e 0a 2a 2a 0a 2a 2a 20 41  er.lru)..**.** A
1770: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20  dditionally, if 
1780: 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e  memory-managemen
1790: 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c  t is enabled, al
17a0: 6c 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70  l unreferenced p
17b0: 61 67 65 73 20 0a 2a 2a 20 61 72 65 20 73 74 6f  ages .** are sto
17c0: 72 65 64 20 69 6e 20 61 20 67 6c 6f 62 61 6c 20  red in a global 
17d0: 4c 52 55 20 6c 69 73 74 20 28 67 6c 6f 62 61 6c  LRU list (global
17e0: 20 76 61 72 69 61 62 6c 65 20 73 71 6c 69 74 65   variable sqlite
17f0: 33 4c 72 75 50 61 67 65 4c 69 73 74 29 2e 0a 2a  3LruPageList)..*
1800: 2a 0a 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73  *.** In both cas
1810: 65 73 2c 20 74 68 65 20 50 61 67 65 72 4c 72 75  es, the PagerLru
1820: 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65  List.pFirstSynce
1830: 64 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74  d variable point
1840: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 66 69 72 73  s to.** the firs
1850: 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 6f  t page in the co
1860: 72 72 65 73 70 6f 6e 64 69 6e 67 20 6c 69 73 74  rresponding list
1870: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
1880: 65 71 75 69 72 65 20 61 6e 0a 2a 2a 20 66 73 79  equire an.** fsy
1890: 6e 63 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 62  nc() operation b
18a0: 65 66 6f 72 65 20 69 74 27 73 20 6d 65 6d 6f 72  efore it's memor
18b0: 79 20 63 61 6e 20 62 65 20 72 65 63 6c 61 69 6d  y can be reclaim
18c0: 65 64 2e 20 49 66 20 6e 6f 20 73 75 63 68 0a 2a  ed. If no such.*
18d0: 2a 20 70 61 67 65 20 65 78 69 73 74 73 2c 20 50  * page exists, P
18e0: 61 67 65 72 4c 72 75 4c 69 73 74 2e 70 46 69 72  agerLruList.pFir
18f0: 73 74 53 79 6e 63 65 64 20 69 73 20 73 65 74 20  stSynced is set 
1900: 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 74 79 70 65  to NULL..*/.type
1910: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
1920: 4c 72 75 4c 69 73 74 20 50 61 67 65 72 4c 72 75  LruList PagerLru
1930: 4c 69 73 74 3b 0a 73 74 72 75 63 74 20 50 61 67  List;.struct Pag
1940: 65 72 4c 72 75 4c 69 73 74 20 7b 0a 20 20 50 67  erLruList {.  Pg
1950: 48 64 72 20 2a 70 46 69 72 73 74 3b 20 20 20 20  Hdr *pFirst;    
1960: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
1970: 67 65 20 69 6e 20 4c 52 55 20 6c 69 73 74 20 2a  ge in LRU list *
1980: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 61 73 74  /.  PgHdr *pLast
1990: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  ;          /* La
19a0: 73 74 20 70 61 67 65 20 69 6e 20 4c 52 55 20 6c  st page in LRU l
19b0: 69 73 74 20 28 74 68 65 20 6d 6f 73 74 20 72 65  ist (the most re
19c0: 63 65 6e 74 6c 79 20 75 73 65 64 29 20 2a 2f 0a  cently used) */.
19d0: 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 53    PgHdr *pFirstS
19e0: 79 6e 63 65 64 3b 20 20 20 2f 2a 20 46 69 72 73  ynced;   /* Firs
19f0: 74 20 70 61 67 65 20 69 6e 20 6c 69 73 74 20 77  t page in list w
1a00: 69 74 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79  ith PgHdr.needSy
1a10: 6e 63 3d 3d 30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  nc==0 */.};../*.
1a20: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1a30: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
1a40: 69 6e 73 20 74 68 65 20 6e 65 78 74 20 61 6e 64  ins the next and
1a50: 20 70 72 65 76 69 6f 75 73 20 70 6f 69 6e 74 65   previous pointe
1a60: 72 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 69  rs used.** to li
1a70: 6e 6b 20 61 20 50 67 48 64 72 20 73 74 72 75 63  nk a PgHdr struc
1a80: 74 75 72 65 20 69 6e 74 6f 20 61 20 50 61 67 65  ture into a Page
1a90: 72 4c 72 75 4c 69 73 74 20 6c 69 6e 6b 65 64 20  rLruList linked 
1aa0: 6c 69 73 74 2e 20 0a 2a 2f 0a 74 79 70 65 64 65  list. .*/.typede
1ab0: 66 20 73 74 72 75 63 74 20 50 61 67 65 72 4c 72  f struct PagerLr
1ac0: 75 4c 69 6e 6b 20 50 61 67 65 72 4c 72 75 4c 69  uLink PagerLruLi
1ad0: 6e 6b 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72  nk;.struct Pager
1ae0: 4c 72 75 4c 69 6e 6b 20 7b 0a 20 20 50 67 48 64  LruLink {.  PgHd
1af0: 72 20 2a 70 4e 65 78 74 3b 0a 20 20 50 67 48 64  r *pNext;.  PgHd
1b00: 72 20 2a 70 50 72 65 76 3b 0a 7d 3b 0a 0a 2f 2a  r *pPrev;.};../*
1b10: 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f  .** Each in-memo
1b20: 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61  ry image of a pa
1b30: 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  ge begins with t
1b40: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61  he following hea
1b50: 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61  der..** This hea
1b60: 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69  der is only visi
1b70: 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  ble to this page
1b80: 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63  r module.  The c
1b90: 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68  lient.** code th
1ba0: 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73  at calls pager s
1bb0: 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74  ees only the dat
1bc0: 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74  a that follows t
1bd0: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
1be0: 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f   Client code sho
1bf0: 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  uld call sqlite3
1c00: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
1c10: 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  a page prior to 
1c20: 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f  making.** any mo
1c30: 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74  difications to t
1c40: 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66  hat page.  The f
1c50: 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65  irst time sqlite
1c60: 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
1c70: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1c80: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
1c90: 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69 74 74  ntents are writt
1ca0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c  en into the roll
1cb0: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
1cc0: 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72  and PgHdr.inJour
1cd0: 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65  nal and PgHdr.ne
1ce0: 65 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20  edSync are set. 
1cf0: 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20   Later, once.** 
1d00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  the journal page
1d10: 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74   has made it ont
1d20: 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
1d30: 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79  ce, PgHdr.needSy
1d40: 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64  nc.** is cleared
1d50: 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20  .  The modified 
1d60: 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77  page cannot be w
1d70: 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
1d80: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1d90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
1da0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
1db0: 20 70 61 67 65 73 20 68 61 73 20 62 65 65 6e 20   pages has been 
1dc0: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61  synced to disk a
1dd0: 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e  nd the.** PgHdr.
1de0: 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62 65 65  needSync has bee
1df0: 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  n cleared..**.**
1e00: 20 54 68 65 20 50 67 48 64 72 2e 64 69 72 74 79   The PgHdr.dirty
1e10: 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65   flag is set whe
1e20: 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
1e30: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1e40: 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  and.** is cleare
1e50: 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65  d again when the
1e60: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
1e70: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
1e80: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1ea0: 2a 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66  **.** Details of
1eb0: 20 69 6d 70 6f 72 74 61 6e 74 20 73 74 72 75 63   important struc
1ec0: 74 75 72 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a  ture elements:.*
1ed0: 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a  *.** needSync.**
1ee0: 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 69 73 20  .**     If this 
1ef0: 69 73 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65  is true, this me
1f00: 61 6e 73 20 74 68 61 74 20 69 74 20 69 73 20 6e  ans that it is n
1f10: 6f 74 20 73 61 66 65 20 74 6f 20 77 72 69 74 65  ot safe to write
1f20: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20   the page.**    
1f30: 20 63 6f 6e 74 65 6e 74 20 74 6f 20 74 68 65 20   content to the 
1f40: 64 61 74 61 62 61 73 65 20 62 65 63 61 75 73 65  database because
1f50: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f   the original co
1f60: 6e 74 65 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20  ntent needed.** 
1f70: 20 20 20 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b      for rollback
1f80: 20 68 61 73 20 6e 6f 74 20 62 79 20 73 79 6e 63   has not by sync
1f90: 65 64 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 72  ed to the main r
1fa0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
1fb0: 0a 2a 2a 20 20 20 20 20 54 68 65 20 6f 72 69 67  .**     The orig
1fc0: 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79  inal content may
1fd0: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
1fe0: 65 6e 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61  en to the rollba
1ff0: 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  ck journal.**   
2000: 20 20 62 75 74 20 69 74 20 68 61 73 20 6e 6f 74    but it has not
2010: 20 79 65 74 20 62 65 65 6e 20 73 79 6e 63 65 64   yet been synced
2020: 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20  .  So we cannot 
2030: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74  write to the dat
2040: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c  abase.**     fil
2050: 65 20 62 65 63 61 75 73 65 20 70 6f 77 65 72 20  e because power 
2060: 66 61 69 6c 75 72 65 20 6d 69 67 68 74 20 63 61  failure might ca
2070: 75 73 65 20 74 68 65 20 70 61 67 65 20 69 6e 20  use the page in 
2080: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2090: 0a 2a 2a 20 20 20 20 20 74 6f 20 6e 65 76 65 72  .**     to never
20a0: 20 72 65 61 63 68 20 74 68 65 20 64 69 73 6b 2e   reach the disk.
20b0: 20 20 49 74 20 69 73 20 61 73 20 69 66 20 74 68    It is as if th
20c0: 65 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  e write to the j
20d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
20e0: 20 20 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75     does not occu
20f0: 72 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72  r until the jour
2100: 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
2110: 65 64 2e 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20  ed..**     .**  
2120: 20 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20     This flag is 
2130: 66 61 6c 73 65 20 69 66 20 74 68 65 20 70 61 67  false if the pag
2140: 65 20 63 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c  e content exactl
2150: 79 20 6d 61 74 63 68 65 73 20 77 68 61 74 0a 2a  y matches what.*
2160: 2a 20 20 20 20 20 63 75 72 72 65 6e 74 6c 79 20  *     currently 
2170: 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 64 61  exists in the da
2180: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
2190: 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
21a0: 69 73 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66  is also.**     f
21b0: 61 6c 73 65 20 69 66 20 74 68 65 20 6f 72 69 67  alse if the orig
21c0: 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  inal content has
21d0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
21e0: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
21f0: 63 6b 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  ck.**     journa
2200: 6c 20 61 6e 64 20 73 79 6e 63 65 64 2e 20 20 49  l and synced.  I
2210: 66 20 74 68 65 20 70 61 67 65 20 72 65 70 72 65  f the page repre
2220: 73 65 6e 74 73 20 61 20 6e 65 77 20 70 61 67 65  sents a new page
2230: 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 20 20 20   that has.**    
2240: 20 62 65 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f   been added onto
2250: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2260: 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
2270: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20  the current.**  
2280: 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20     transaction, 
2290: 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61  the needSync fla
22a0: 67 20 69 73 20 74 72 75 65 20 75 6e 74 69 6c 20  g is true until 
22b0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
22c0: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a  abase.**     siz
22d0: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
22e0: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
22f0: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
2300: 0a 2a 2a 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c  .**.** inJournal
2310: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20  .**.**     This 
2320: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
2330: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 68 61 73  riginal page has
2340: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e   been written in
2350: 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20  to the main.**  
2360: 20 20 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72     rollback jour
2370: 6e 61 6c 2e 20 20 54 68 69 73 20 69 73 20 61 6c  nal.  This is al
2380: 77 61 79 73 20 66 61 6c 73 65 20 66 6f 72 20 6e  ways false for n
2390: 65 77 20 70 61 67 65 73 20 61 64 64 65 64 20 74  ew pages added t
23a0: 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 65 6e 64  o.**     the end
23b0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
23c0: 20 66 69 6c 65 20 64 75 72 69 6e 67 20 74 68 65   file during the
23d0: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
23e0: 74 69 6f 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64  tion..**     And
23f0: 20 74 68 69 73 20 66 6c 61 67 20 73 61 79 73 20   this flag says 
2400: 6e 6f 74 68 69 6e 67 20 61 62 6f 75 74 20 77 68  nothing about wh
2410: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
2420: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
2430: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
2440: 74 6f 20 64 69 73 6b 2e 20 20 46 6f 72 20 70 61  to disk.  For pa
2450: 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20  ges that are in 
2460: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
2470: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
2480: 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
2490: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 68 6f 75   expression shou
24a0: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 72 75  ld always be tru
24b0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69  e:.**.**       i
24c0: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67  nJournal = (pPag
24d0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 28  er->aInJournal[(
24e0: 70 67 6e 6f 2d 31 29 2f 38 5d 20 26 20 28 31 3c  pgno-1)/8] & (1<
24f0: 3c 28 28 70 67 6e 6f 2d 31 29 25 38 29 29 21 3d  <((pgno-1)%8))!=
2500: 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65 20  0.**.**     The 
2510: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
2520: 61 6c 5b 5d 20 61 72 72 61 79 20 69 73 20 6f 6e  al[] array is on
2530: 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65  ly valid for the
2540: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   original.**    
2550: 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 64 61   pages of the da
2560: 74 61 62 61 73 65 2c 20 6e 6f 74 20 6e 65 77 20  tabase, not new 
2570: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
2580: 64 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64 0a  dded to the end.
2590: 2a 2a 20 20 20 20 20 6f 66 20 74 68 65 20 64 61  **     of the da
25a0: 74 61 62 61 73 65 2c 20 73 6f 20 6f 62 76 69 6f  tabase, so obvio
25b0: 75 73 6c 79 20 74 68 65 20 61 62 6f 76 65 20 65  usly the above e
25c0: 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 6e 6f 74  xpression cannot
25d0: 20 62 65 0a 2a 2a 20 20 20 20 20 76 61 6c 69 64   be.**     valid
25e0: 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73 2e 20   for new pages. 
25f0: 20 46 6f 72 20 6e 65 77 20 70 61 67 65 73 20 69   For new pages i
2600: 6e 4a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77 61  nJournal is alwa
2610: 79 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72 74  ys 0..**.** dirt
2620: 79 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 6e  y.**.**     When
2630: 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e   true, this mean
2640: 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  s that the conte
2650: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  nt of the page h
2660: 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20 6d  as been.**     m
2670: 6f 64 69 66 69 65 64 20 61 6e 64 20 6e 65 65 64  odified and need
2680: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
2690: 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61  back to the data
26a0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
26b0: 20 20 49 66 20 66 61 6c 73 65 2c 20 69 74 20 6d    If false, it m
26c0: 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72  eans that either
26d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
26e0: 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20 20  the page is.**  
26f0: 20 20 20 75 6e 63 68 61 6e 67 65 64 20 6f 72 20     unchanged or 
2700: 65 6c 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  else the content
2710: 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74 20   is unimportant 
2720: 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a  and we do not.**
2730: 20 20 20 20 20 63 61 72 65 20 77 68 65 74 68 65       care whethe
2740: 72 20 6f 72 20 6e 6f 74 20 69 74 20 69 73 20 70  r or not it is p
2750: 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  reserved..**.** 
2760: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 2a  alwaysRollback.*
2770: 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 6d 65  *.**     This me
2780: 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  ans that the sql
2790: 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
27a0: 6c 62 61 63 6b 28 29 20 41 50 49 20 73 68 6f 75  lback() API shou
27b0: 6c 64 20 62 65 0a 2a 2a 20 20 20 20 20 69 67 6e  ld be.**     ign
27c0: 6f 72 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  ored for this pa
27d0: 67 65 2e 20 20 54 68 65 20 44 6f 6e 74 52 6f 6c  ge.  The DontRol
27e0: 6c 62 61 63 6b 28 29 20 41 50 49 20 61 74 74 65  lback() API atte
27f0: 6d 70 74 73 20 74 6f 20 73 61 79 0a 2a 2a 20 20  mpts to say.**  
2800: 20 20 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74     that the cont
2810: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
2820: 6f 6e 20 64 69 73 6b 20 69 73 20 75 6e 69 6d 70  on disk is unimp
2830: 6f 72 74 61 6e 74 20 28 69 74 20 69 73 20 61 6e  ortant (it is an
2840: 0a 2a 2a 20 20 20 20 20 75 6e 75 73 65 64 20 70  .**     unused p
2850: 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  age on the freel
2860: 69 73 74 29 20 73 6f 20 74 68 61 74 20 69 74 20  ist) so that it 
2870: 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 74  is unnecessary t
2880: 6f 20 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62 61  o .**     rollba
2890: 63 6b 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ck changes to th
28a0: 69 73 20 70 61 67 65 20 62 65 63 61 75 73 65 20  is page because 
28b0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
28c0: 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63  he page.**     c
28d0: 61 6e 20 63 68 61 6e 67 65 20 77 69 74 68 6f 75  an change withou
28e0: 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6d  t changing the m
28f0: 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  eaning of the da
2900: 74 61 62 61 73 65 2e 20 20 54 68 69 73 0a 2a 2a  tabase.  This.**
2910: 20 20 20 20 20 66 6c 61 67 20 6f 76 65 72 72 69       flag overri
2920: 64 65 73 20 61 6e 79 20 44 6f 6e 74 52 6f 6c 6c  des any DontRoll
2930: 62 61 63 6b 28 29 20 61 74 74 65 6d 70 74 2e 20  back() attempt. 
2940: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65   This flag is se
2950: 74 0a 2a 2a 20 20 20 20 20 77 68 65 6e 20 61 20  t.**     when a 
2960: 70 61 67 65 20 74 68 61 74 20 6f 72 69 67 69 6e  page that origin
2970: 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 76  ally contained v
2980: 61 6c 69 64 20 64 61 74 61 20 69 73 20 61 64 64  alid data is add
2990: 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  ed to.**     the
29a0: 20 66 72 65 65 6c 69 73 74 2e 20 20 4c 61 74 65   freelist.  Late
29b0: 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74 72  r in the same tr
29c0: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20  ansaction, this 
29d0: 70 61 67 65 20 6d 69 67 68 74 0a 2a 2a 20 20 20  page might.**   
29e0: 20 20 62 65 20 70 75 6c 6c 65 64 20 66 72 6f 6d    be pulled from
29f0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e   the freelist an
2a00: 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d  d reused for som
2a10: 65 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ething different
2a20: 0a 2a 2a 20 20 20 20 20 61 6e 64 20 61 74 20 74  .**     and at t
2a30: 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20 44 6f  hat point the Do
2a40: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50 49  ntRollback() API
2a50: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
2a60: 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20 70  because.**     p
2a70: 61 67 65 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  ages taken from 
2a80: 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 6f 20  the freelist do 
2a90: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70  not need to be p
2aa0: 72 6f 74 65 63 74 65 64 20 62 79 0a 2a 2a 20 20  rotected by.**  
2ab0: 20 20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20     the rollback 
2ac0: 6a 6f 75 72 6e 61 6c 2e 20 20 42 75 74 20 74 68  journal.  But th
2ad0: 69 73 20 66 6c 61 67 20 73 61 79 73 20 74 68 61  is flag says tha
2ae0: 74 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a  t the page was.*
2af0: 2a 20 20 20 20 20 6e 6f 74 20 6f 72 69 67 69 6e  *     not origin
2b00: 61 6c 6c 79 20 70 61 72 74 20 6f 66 20 74 68 65  ally part of the
2b10: 20 66 72 65 65 6c 69 73 74 20 73 6f 20 74 68 61   freelist so tha
2b20: 74 20 69 74 20 73 74 69 6c 6c 20 6e 65 65 64 73  t it still needs
2b30: 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65 20 72 6f   to.**     be ro
2b40: 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69  lled back in spi
2b50: 74 65 20 6f 66 20 61 6e 79 20 73 75 62 73 65 71  te of any subseq
2b60: 75 65 6e 74 20 44 6f 6e 74 52 6f 6c 6c 62 61 63  uent DontRollbac
2b70: 6b 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  k() calls..**.**
2b80: 20 6e 65 65 64 52 65 61 64 20 0a 2a 2a 0a 2a 2a   needRead .**.**
2b90: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 6d       This flag m
2ba0: 65 61 6e 73 20 28 77 68 65 6e 20 74 72 75 65 29  eans (when true)
2bb0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
2bc0: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 61  t of the page ha
2bd0: 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 79 65 74  s.**     not yet
2be0: 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 66 72 6f   been loaded fro
2bf0: 6d 20 64 69 73 6b 2e 20 20 54 68 65 20 69 6e 2d  m disk.  The in-
2c00: 6d 65 6d 6f 72 79 20 63 6f 6e 74 65 6e 74 20 69  memory content i
2c10: 73 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 67 61  s just.**     ga
2c20: 72 62 61 67 65 2e 20 20 28 41 63 74 75 61 6c 6c  rbage.  (Actuall
2c30: 79 2c 20 77 65 20 7a 65 72 6f 20 74 68 65 20 63  y, we zero the c
2c40: 6f 6e 74 65 6e 74 2c 20 62 75 74 20 79 6f 75 20  ontent, but you 
2c50: 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20  should not.**   
2c60: 20 20 6d 61 6b 65 20 61 6e 79 20 61 73 73 75 6d    make any assum
2c70: 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 74 68 65  ptions about the
2c80: 20 63 6f 6e 74 65 6e 74 20 6e 65 76 65 72 74 68   content neverth
2c90: 65 6c 65 73 73 2e 29 20 20 49 66 20 74 68 65 0a  eless.)  If the.
2ca0: 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 69  **     content i
2cb0: 73 20 6e 65 65 64 65 64 20 69 6e 20 74 68 65 20  s needed in the 
2cc0: 66 75 74 75 72 65 2c 20 69 74 20 73 68 6f 75 6c  future, it shoul
2cd0: 64 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  d be read from t
2ce0: 68 65 0a 2a 2a 20 20 20 20 20 6f 72 69 67 69 6e  he.**     origin
2cf0: 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
2d00: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 67 48 64  ..*/.struct PgHd
2d10: 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  r {.  Pager *pPa
2d20: 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ger;            
2d30: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
2d40: 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20  r to which this 
2d50: 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a  page belongs */.
2d60: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d80: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
2d90: 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  ber for this pag
2da0: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  e */.  PgHdr *pN
2db0: 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76 48  extHash, *pPrevH
2dc0: 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f  ash;  /* Hash co
2dd0: 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f  llision chain fo
2de0: 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a  r PgHdr.pgno */.
2df0: 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 66    PagerLruLink f
2e00: 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ree;            
2e10: 20 2f 2a 20 4e 65 78 74 20 61 6e 64 20 70 72 65   /* Next and pre
2e20: 76 69 6f 75 73 20 66 72 65 65 20 70 61 67 65 73  vious free pages
2e30: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
2e40: 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  xtAll;          
2e50: 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f       /* A list o
2e60: 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20  f all pages */. 
2e70: 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20   u8 inJournal;  
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62  /* TRUE if has b
2ea0: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
2eb0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
2ec0: 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  irty;           
2ed0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
2ee0: 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  UE if we need to
2ef0: 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e   write back chan
2f00: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64  ges */.  u8 need
2f10: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
2f20: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20          /* Sync 
2f30: 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77  journal before w
2f40: 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67 65  riting this page
2f50: 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52   */.  u8 alwaysR
2f60: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  ollback;        
2f70: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
2f80: 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66  DontRollback() f
2f90: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
2fa0: 20 20 75 38 20 6e 65 65 64 52 65 61 64 3b 20 20    u8 needRead;  
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 20 2f 2a 20 52 65 61 64 20 63 6f 6e 74 65 6e 74   /* Read content
2fd0: 20 69 66 20 50 61 67 65 72 57 72 69 74 65 28 29   if PagerWrite()
2fe0: 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20   is called */.  
2ff0: 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b 20  short int nRef; 
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3010: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72  * Number of user
3020: 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a  s of this page *
3030: 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74  /.  PgHdr *pDirt
3040: 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79 3b 20  y, *pPrevDirty; 
3050: 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65     /* Dirty page
3060: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
3070: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
3080: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61  _MANAGEMENT.  Pa
3090: 67 65 72 4c 72 75 4c 69 6e 6b 20 67 66 72 65 65  gerLruLink gfree
30a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
30b0: 47 6c 6f 62 61 6c 20 6c 69 73 74 20 6f 66 20 6e  Global list of n
30c0: 52 65 66 3d 3d 30 20 70 61 67 65 73 20 2a 2f 0a  Ref==0 pages */.
30d0: 23 65 6e 64 69 66 0a 20 20 75 33 32 20 6e 6f 74  #endif.  u32 not
30e0: 55 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  Used;           
30f0: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
3100: 72 20 73 70 61 63 65 20 2a 2f 0a 23 69 66 64 65  r space */.#ifde
3110: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
3120: 41 47 45 53 0a 20 20 75 33 32 20 70 61 67 65 48  AGES.  u32 pageH
3130: 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  ash;.#endif.  /*
3140: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
3150: 65 20 62 79 74 65 73 20 6f 66 20 70 61 67 65 20  e bytes of page 
3160: 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73  data follow this
3170: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20   header */.  /* 
3180: 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74  Pager.nExtra byt
3190: 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61  es of local data
31a0: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67 65   follow the page
31b0: 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   data */.};../*.
31c0: 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ** For an in-mem
31d0: 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62 61 73  ory only databas
31e0: 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20 69 6e  e, some extra in
31f0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 63  formation is rec
3200: 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65  orded about.** e
3210: 61 63 68 20 70 61 67 65 20 73 6f 20 74 68 61 74  ach page so that
3220: 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20   changes can be 
3230: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a  rolled back.  (J
3240: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65  ournal files are
3250: 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72   not.** used for
3260: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
3270: 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c  ases.)  The foll
3280: 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  owing informatio
3290: 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a  n is added to.**
32a0: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
32b0: 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f  y EXTRA block fo
32c0: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
32d0: 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bases..**.** Thi
32e0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f  s information co
32f0: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 61 64  uld have been ad
3300: 64 65 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ded directly to 
3310: 74 68 65 20 50 67 48 64 72 20 73 74 72 75 63 74  the PgHdr struct
3320: 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e  ure..** But then
3330: 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 75   it would take u
3340: 70 20 61 6e 20 65 78 74 72 61 20 38 20 62 79 74  p an extra 8 byt
3350: 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e  es of storage on
3360: 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a 2a 20   every PgHdr.** 
3370: 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61  even for disk-ba
3380: 73 65 64 20 64 61 74 61 62 61 73 65 73 2e 20 20  sed databases.  
3390: 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f 75 74  Splitting it out
33a0: 20 73 61 76 65 73 20 38 20 62 79 74 65 73 2e 20   saves 8 bytes. 
33b0: 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79   This.** is only
33c0: 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20 30 2e   a savings of 0.
33d0: 38 25 20 62 75 74 20 74 68 6f 73 65 20 70 65 72  8% but those per
33e0: 63 65 6e 74 61 67 65 73 20 61 64 64 20 75 70 2e  centages add up.
33f0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
3400: 63 74 20 50 67 48 69 73 74 6f 72 79 20 50 67 48  ct PgHistory PgH
3410: 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74 20 50  istory;.struct P
3420: 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75 38 20  gHistory {.  u8 
3430: 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f  *pOrig;     /* O
3440: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74 65 78  riginal page tex
3450: 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f 20 74  t.  Restore to t
3460: 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f  his on a full ro
3470: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a  llback */.  u8 *
3480: 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65  pStmt;     /* Te
3490: 78 74 20 61 73 20 69 74 20 77 61 73 20 61 74 20  xt as it was at 
34a0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
34b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
34c0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 50 67 48 64  tement */.  PgHd
34d0: 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70  r *pNextStmt, *p
34e0: 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69  PrevStmt;  /* Li
34f0: 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  st of pages in t
3500: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
3510: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53  rnal */.  u8 inS
3520: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
3530: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
3540: 20 69 66 20 69 6e 20 74 68 65 20 73 74 61 74 65   if in the state
3550: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  ment subjournal 
3560: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d  */.};../*.** A m
3570: 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e  acro used for in
3580: 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63  voking the codec
3590: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
35a0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
35b0: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65  E_HAS_CODEC.# de
35c0: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
35d0: 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64  N,X) if( P->xCod
35e0: 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64  ec!=0 ){ P->xCod
35f0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
3600: 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69  D,N,X); }.# defi
3610: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
3620: 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d 3e 78  X) ((char*)(P->x
3630: 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64  Codec!=0?P->xCod
3640: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
3650: 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65  D,N,X):D)).#else
3660: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
3670: 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d  (P,D,N,X) /* NO-
3680: 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43  OP */.# define C
3690: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28  ODEC2(P,D,N,X) (
36a0: 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64 69 66  (char*)D).#endif
36b0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
36c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50  a pointer to a P
36d0: 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e  gHdr into a poin
36e0: 74 65 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a  ter to its data.
36f0: 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69  ** and back agai
3700: 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47  n..*/.#define PG
3710: 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20  HDR_TO_DATA(P)  
3720: 28 28 76 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d  ((void*)(&(P)[1]
3730: 29 29 0a 23 64 65 66 69 6e 65 20 44 41 54 41 5f  )).#define DATA_
3740: 54 4f 5f 50 47 48 44 52 28 44 29 20 20 28 26 28  TO_PGHDR(D)  (&(
3750: 28 50 67 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d  (PgHdr*)(D))[-1]
3760: 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f  ).#define PGHDR_
3770: 54 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28  TO_EXTRA(G,P) ((
3780: 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29 28  void*)&((char*)(
3790: 26 28 47 29 5b 31 5d 29 29 5b 28 50 29 2d 3e 70  &(G)[1]))[(P)->p
37a0: 61 67 65 53 69 7a 65 5d 29 0a 23 64 65 66 69 6e  ageSize]).#defin
37b0: 65 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  e PGHDR_TO_HIST(
37c0: 50 2c 50 47 52 29 20 20 5c 0a 20 20 20 20 20 20  P,PGR)  \.      
37d0: 20 20 20 20 20 20 28 28 50 67 48 69 73 74 6f 72        ((PgHistor
37e0: 79 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50  y*)&((char*)(&(P
37f0: 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e 70 61  )[1]))[(PGR)->pa
3800: 67 65 53 69 7a 65 2b 28 50 47 52 29 2d 3e 6e 45  geSize+(PGR)->nE
3810: 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  xtra])../*.** A 
3820: 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20  open page cache 
3830: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
3840: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
3850: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
3860: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 6d   Pager.errCode m
3870: 61 79 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c  ay be set to SQL
3880: 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
3890: 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a  E_CORRUPT, or.**
38a0: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e   or SQLITE_FULL.
38b0: 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65   Once one of the
38c0: 20 66 69 72 73 74 20 74 68 72 65 65 20 65 72 72   first three err
38d0: 6f 72 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70  ors occurs, it p
38e0: 65 72 73 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69  ersists.** and i
38f0: 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 74 68  s returned as th
3900: 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76 65 72  e result of ever
3910: 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20 41 50  y major pager AP
3920: 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20  I call.  The.** 
3930: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72 65 74 75  SQLITE_FULL retu
3940: 72 6e 20 63 6f 64 65 20 69 73 20 73 6c 69 67 68  rn code is sligh
3950: 74 6c 79 20 64 69 66 66 65 72 65 6e 74 2e 20 49  tly different. I
3960: 74 20 70 65 72 73 69 73 74 73 20 6f 6e 6c 79 20  t persists only 
3970: 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78  until the.** nex
3980: 74 20 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c  t successful rol
3990: 6c 62 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d  lback is perform
39a0: 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ed on the pager 
39b0: 63 61 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20  cache. Also,.** 
39c0: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73  SQLITE_FULL does
39d0: 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20   not affect the 
39e0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
39f0: 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  ) and sqlite3Pag
3a00: 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50  erLookup().** AP
3a10: 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69  Is, they may sti
3a20: 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65  ll be used succe
3a30: 73 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75  ssfully..*/.stru
3a40: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
3a50: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
3a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
3a70: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
3a80: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 6a  for IO */.  u8 j
3a90: 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20  ournalOpen;     
3aa0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3ab0: 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  if journal file 
3ac0: 64 65 73 63 72 69 70 74 6f 72 73 20 69 73 20 76  descriptors is v
3ad0: 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  alid */.  u8 jou
3ae0: 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20  rnalStarted;    
3af0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3b00: 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e   header of journ
3b10: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a  al is synced */.
3b20: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b40: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
3b50: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
3b60: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52  file */.  u8 noR
3b70: 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20  eadlock;        
3b80: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
3b90: 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e  bother to obtain
3ba0: 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20   readlocks */.  
3bb0: 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20  u8 stmtOpen;    
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3bd0: 72 75 65 20 69 66 20 74 68 65 20 73 74 61 74 65  rue if the state
3be0: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  ment subjournal 
3bf0: 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20  is open */.  u8 
3c00: 73 74 6d 74 49 6e 55 73 65 3b 20 20 20 20 20 20  stmtInUse;      
3c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3c20: 20 77 65 20 61 72 65 20 69 6e 20 61 20 73 74 61   we are in a sta
3c30: 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
3c40: 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74  ction */.  u8 st
3c50: 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20  mtAutoopen;     
3c60: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73         /* Open s
3c70: 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  tmt journal when
3c80: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73   main journal is
3c90: 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e   opened*/.  u8 n
3ca0: 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  oSync;          
3cb0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
3cc0: 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  t sync the journ
3cd0: 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  al if true */.  
3ce0: 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20  u8 fullSync;    
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3d00: 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66  o extra syncs of
3d10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
3d20: 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20   robustness */. 
3d30: 20 75 38 20 73 79 6e 63 5f 66 6c 61 67 73 3b 20   u8 sync_flags; 
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3d50: 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e 4f 52 4d  One of SYNC_NORM
3d60: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
3d70: 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20  */.  u8 state;  
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d90: 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   /* PAGER_UNLOCK
3da0: 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45  , _SHARED, _RESE
3db0: 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20  RVED, etc. */.  
3dc0: 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20  u8 tempFile;    
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
3de0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65  Filename is a te
3df0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mporary file */.
3e00: 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20    u8 readOnly;  
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3e20: 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
3e30: 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
3e40: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e60: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66 73  /* True if an fs
3e70: 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64 20  ync() is needed 
3e80: 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  on the journal *
3e90: 2f 0a 20 20 75 38 20 64 69 72 74 79 43 61 63 68  /.  u8 dirtyCach
3ea0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3eb0: 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65  /* True if cache
3ec0: 64 20 70 61 67 65 73 20 68 61 76 65 20 63 68 61  d pages have cha
3ed0: 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77  nged */.  u8 alw
3ee0: 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20  aysRollback;    
3ef0: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
3f00: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
3f10: 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f  for all pages */
3f20: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3f40: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
3f50: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
3f60: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
3f70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3f80: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
3f90: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
3fa0: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
3fb0: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63  /.  u8 doNotSync
3fc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3fd0: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c  /* Boolean. Whil
3fe0: 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73  e true, do not s
3ff0: 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a  pill the cache *
4000: 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65  /.  u8 exclusive
4010: 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Mode;           
4020: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65  /* Boolean. True
4030: 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   if locking_mode
4040: 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20  ==EXCLUSIVE */. 
4050: 20 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44   u8 changeCountD
4060: 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  one;         /* 
4070: 53 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d  Set after increm
4080: 65 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67  enting the chang
4090: 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  e-counter */.  i
40a0: 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20  nt errCode;     
40b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
40c0: 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e  e of several kin
40d0: 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a  ds of errors */.
40e0: 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20    int dbSize;   
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4100: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
4110: 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   in the file */.
4120: 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65    int origDbSize
4130: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4140: 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74   dbSize before t
4150: 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67  he current chang
4160: 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53  e */.  int stmtS
4170: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
4180: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61     /* Size of da
4190: 74 61 62 61 73 65 20 28 69 6e 20 70 61 67 65 73  tabase (in pages
41a0: 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28  ) at stmt_begin(
41b0: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b  ) */.  int nRec;
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
41e0: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
41f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
4200: 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b    u32 cksumInit;
4210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4220: 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61   Quasi-random va
4230: 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65  lue added to eve
4240: 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  ry checksum */. 
4250: 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20   int stmtNRec;  
4260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4270: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
4280: 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75  s in stmt subjou
4290: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  rnal */.  int nE
42a0: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
42b0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
42c0: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
42d0: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
42e0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  age */.  int pag
42f0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
4300: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4310: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
4320: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
4330: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4340: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
4350: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
4360: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  pages */.  int n
4370: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
4380: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4390: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
43a0: 67 65 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e  ges with PgHdr.n
43b0: 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d  Ref>0 */.  int m
43c0: 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  xPage;          
43d0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
43e0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  m number of page
43f0: 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63  s to hold in cac
4400: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  he */.  Pgno mxP
4410: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
4420: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
4430: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
4440: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
4450: 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b   u8 *aInJournal;
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4470: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
4480: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
4490: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
44a0: 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20  u8 *aInStmt;    
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
44c0: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
44d0: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
44e0: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  base */.  char *
44f0: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
4500: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
4510: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
4520: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
4530: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
4540: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
4550: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
4560: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65  */.  char *zDire
4570: 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20  ctory;          
4580: 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f   /* Directory ho
4590: 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ld database and 
45a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
45b0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
45c0: 2a 66 64 2c 20 2a 6a 66 64 3b 20 20 20 20 20 2f  *fd, *jfd;     /
45d0: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
45e0: 72 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  rs for database 
45f0: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  and journal */. 
4600: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73   sqlite3_file *s
4610: 74 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  tfd;         /* 
4620: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
4630: 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e  for the statemen
4640: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20  t subjournal*/. 
4650: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42   BusyHandler *pB
4660: 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20  usyHandler;  /* 
4670: 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
4680: 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f  e.busyHandler */
4690: 0a 20 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20  .  PagerLruList 
46a0: 6c 72 75 3b 20 20 20 20 20 20 20 20 20 20 20 2f  lru;           /
46b0: 2a 20 4c 52 55 20 6c 69 73 74 20 6f 66 20 66 72  * LRU list of fr
46c0: 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ee pages */.  Pg
46d0: 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20  Hdr *pAll;      
46e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
46f0: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a  t of all pages *
4700: 2f 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74  /.  PgHdr *pStmt
4710: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4720: 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73  /* List of pages
4730: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
4740: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
4750: 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b    PgHdr *pDirty;
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4770: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64 69 72   List of all dir
4780: 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 36  ty pages */.  i6
4790: 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20  4 journalOff;   
47a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
47b0: 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74  rent byte offset
47c0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
47d0: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  file */.  i64 jo
47e0: 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20  urnalHdr;       
47f0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
4800: 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73  fset to previous
4810: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
4820: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72  */.  i64 stmtHdr
4830: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
4840: 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61   /* First journa
4850: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
4860: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
4870: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73  */.  i64 stmtCks
4880: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
4890: 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68   /* cksumInit wh
48a0: 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  en statement was
48b0: 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 36   started */.  i6
48c0: 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20  4 stmtJSize;    
48d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
48e0: 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20  e of journal at 
48f0: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
4900: 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65    int sectorSize
4910: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4920: 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   Assumed sector 
4930: 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  size during roll
4940: 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53  back */.#ifdef S
4950: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
4960: 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20   nHit, nMiss;   
4970: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68           /* Cach
4980: 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69  e hits and missi
4990: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61  ng */.  int nRea
49a0: 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  d, nWrite;      
49b0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
49c0: 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74  pages read/writt
49d0: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76  en */.#endif.  v
49e0: 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f  oid (*xDestructo
49f0: 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b  r)(DbPage*,int);
4a00: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
4a10: 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69  utine when freei
4a20: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f  ng pages */.  vo
4a30: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
4a40: 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20 20 20  DbPage*,int);   
4a50: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
4a60: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
4a70: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
4a80: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
4a90: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
4aa0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
4ab0: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
4ac0: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
4ad0: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
4ae0: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
4af0: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rg;            /
4b00: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
4b10: 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a   to xCodec() */.
4b20: 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e 48 61  #endif.  int nHa
4b30: 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sh;             
4b40: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
4b50: 74 68 65 20 70 61 67 65 72 20 68 61 73 68 20 74  the pager hash t
4b60: 61 62 6c 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  able */.  PgHdr 
4b70: 2a 2a 61 48 61 73 68 3b 20 20 20 20 20 20 20 20  **aHash;        
4b80: 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61        /* Hash ta
4b90: 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20  ble to map page 
4ba0: 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20  number to PgHdr 
4bb0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4bc0: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
4bd0: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61 67 65  ANAGEMENT.  Page
4be0: 72 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  r *pNext;       
4bf0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 75 62 6c          /* Doubl
4c00: 79 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  y linked list of
4c10: 20 70 61 67 65 72 73 20 6f 6e 20 77 68 69 63 68   pagers on which
4c20: 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 72   */.  Pager *pPr
4c30: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
4c40: 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 72 65 6c    /* sqlite3_rel
4c50: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 77 69  ease_memory() wi
4c60: 6c 6c 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 6e 74  ll work */.  int
4c70: 20 69 49 6e 55 73 65 4d 4d 3b 20 20 20 20 20 20   iInUseMM;      
4c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d           /* Non-
4c90: 7a 65 72 6f 20 69 66 20 75 6e 61 76 61 69 6c 61  zero if unavaila
4ca0: 62 6c 65 20 74 6f 20 4d 4d 20 2a 2f 0a 20 20 69  ble to MM */.  i
4cb0: 6e 74 20 69 49 6e 55 73 65 44 42 3b 20 20 20 20  nt iInUseDB;    
4cc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
4cd0: 6e 2d 7a 65 72 6f 20 69 66 20 69 6e 20 73 71 6c  n-zero if in sql
4ce0: 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
4cf0: 6f 72 79 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a  ory() */.#endif.
4d00: 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63    char *pTmpSpac
4d10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
4d20: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
4d30: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
4d40: 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20  or tmp use */.  
4d50: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
4d60: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
4d70: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
4d80: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
4d90: 61 6e 67 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  anges */.};../*.
4da0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
4db0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
4dc0: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
4dd0: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
4de0: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
4df0: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
4e00: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
4e10: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
4e20: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
4e30: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
4e40: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
4e50: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
4e60: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
4e70: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
4e80: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
4e90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
4ea0: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
4eb0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
4ec0: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
4ed0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
4ee0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
4ef0: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
4f00: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
4f10: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
4f20: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
4f30: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
4f40: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
4f50: 6e 61 6c 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nal */.int sqlit
4f60: 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f  e3_pager_pgfree_
4f70: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
4f80: 20 4e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65   Number of cache
4f90: 20 70 61 67 65 73 20 66 72 65 65 64 20 2a 2f 0a   pages freed */.
4fa0: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
4fb0: 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73  NCR(v)  v++.#els
4fc0: 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  e.# define PAGER
4fd0: 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a  _INCR(v).#endif.
4fe0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
4ff0: 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 70 6f  wing variable po
5000: 69 6e 74 73 20 74 6f 20 74 68 65 20 68 65 61 64  ints to the head
5010: 20 6f 66 20 61 20 64 6f 75 62 6c 65 2d 6c 69 6e   of a double-lin
5020: 6b 65 64 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61  ked list.** of a
5030: 6c 6c 20 70 61 67 65 72 73 20 74 68 61 74 20 61  ll pagers that a
5040: 72 65 20 65 6c 69 67 69 62 6c 65 20 66 6f 72 20  re eligible for 
5050: 70 61 67 65 20 73 74 65 61 6c 69 6e 67 20 62 79  page stealing by
5060: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
5070: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29  release_memory()
5080: 20 69 6e 74 65 72 66 61 63 65 2e 20 20 41 63 63   interface.  Acc
5090: 65 73 73 20 74 6f 20 74 68 69 73 20 6c 69 73 74  ess to this list
50a0: 20 69 73 0a 2a 2a 20 70 72 6f 74 65 63 74 65 64   is.** protected
50b0: 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   by the SQLITE_M
50c0: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32  UTEX_STATIC_MEM2
50d0: 20 6d 75 74 65 78 2e 0a 2a 2f 0a 23 69 66 64 65   mutex..*/.#ifde
50e0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
50f0: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
5100: 54 0a 73 74 61 74 69 63 20 50 61 67 65 72 20 2a  T.static Pager *
5110: 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74  sqlite3PagerList
5120: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 50 61 67   = 0;.static Pag
5130: 65 72 4c 72 75 4c 69 73 74 20 73 71 6c 69 74 65  erLruList sqlite
5140: 33 4c 72 75 50 61 67 65 4c 69 73 74 20 3d 20 7b  3LruPageList = {
5150: 30 2c 20 30 2c 20 30 7d 3b 0a 23 65 6e 64 69 66  0, 0, 0};.#endif
5160: 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c  .../*.** Journal
5170: 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74   files begin wit
5180: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
5190: 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54  magic string.  T
51a0: 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f  he data.** was o
51b0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65  btained from /de
51c0: 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73  v/random.  It is
51d0: 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20   used only as a 
51e0: 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a  sanity check..**
51f0: 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f  .** Since versio
5200: 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75  n 2.8.0, the jou
5210: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74  rnal format cont
5220: 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  ains additional 
5230: 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69  sanity.** checki
5240: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ng information. 
5250: 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61   If the power fa
5260: 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  ils while the jo
5270: 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a  urnal is begin.*
5280: 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d  * written, semi-
5290: 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64  random garbage d
52a0: 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72  ata might appear
52b0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
52c0: 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f  ** file after po
52d0: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e  wer is restored.
52e0: 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20    If an attempt 
52f0: 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20  is then made.** 
5300: 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72  to roll the jour
5310: 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61  nal back, the da
5320: 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20  tabase could be 
5330: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20  corrupted.  The 
5340: 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61  additional.** sa
5350: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61  nity checking da
5360: 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  ta is an attempt
5370: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
5380: 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a   garbage in the.
5390: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ** journal and i
53a0: 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  gnore it..**.** 
53b0: 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  The sanity check
53c0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
53d0: 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72  for the new jour
53e0: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69  nal format consi
53f0: 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62  sts.** of a 32-b
5400: 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65  it checksum on e
5410: 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61  ach page of data
5420: 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20  .  The checksum 
5430: 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74  covers both.** t
5440: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
5450: 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  nd the pPager->p
5460: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
5470: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   data for the pa
5480: 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75  ge..** This cksu
5490: 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  m is initialized
54a0: 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e   to a 32-bit ran
54b0: 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61  dom value that a
54c0: 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a  ppears in the.**
54d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69   journal file ri
54e0: 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65  ght after the he
54f0: 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f  ader.  The rando
5500: 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73  m initializer is
5510: 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62   important,.** b
5520: 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64  ecause garbage d
5530: 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
5540: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
5550: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65   journal is like
5560: 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20  ly.** data that 
5570: 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65  was once in othe
5580: 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76  r files that hav
5590: 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74  e now been delet
55a0: 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67  ed.  If the.** g
55b0: 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65  arbage data came
55c0: 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74   from an obsolet
55d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
55e0: 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69  the checksums mi
55f0: 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63  ght.** be correc
5600: 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69  t.  But by initi
5610: 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63  alizing the chec
5620: 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76  ksum to random v
5630: 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  alue which.** is
5640: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
5650: 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65  very journal, we
5660: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72   minimize that r
5670: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  isk..*/.static c
5680: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
5690: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
56a0: 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30  [] = {.  0xd9, 0
56b0: 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c  xd5, 0x05, 0xf9,
56c0: 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36   0x20, 0xa1, 0x6
56d0: 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a  3, 0xd7,.};../*.
56e0: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
56f0: 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66  he header and of
5700: 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68   each page in th
5710: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74  e journal is det
5720: 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68  ermined.** by th
5730: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
5740: 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  os..*/.#define J
5750: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
5760: 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e  ger)  ((pPager->
5770: 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a  pageSize) + 8)..
5780: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
5790: 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f  l header size fo
57a0: 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e  r this pager. In
57b0: 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 69   the future, thi
57c0: 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65  s could be.** se
57d0: 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20  t to some value 
57e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69  read from the di
57f0: 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54  sk controller. T
5800: 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20  he important.** 
5810: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20 69  characteristic i
5820: 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65  s that it is the
5830: 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20   same size as a 
5840: 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a  disk sector..*/.
5850: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
5860: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28  HDR_SZ(pPager) (
5870: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
5880: 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  ze)../*.** The m
5890: 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72  acro MEMDB is tr
58a0: 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61  ue if we are dea
58b0: 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d  ling with an in-
58c0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
58d0: 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61  .** We do this a
58e0: 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61  s a macro so tha
58f0: 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f  t if the SQLITE_
5900: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61  OMIT_MEMORYDB ma
5910: 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74  cro is set,.** t
5920: 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44  he value of MEMD
5930: 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73  B will be a cons
5940: 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d  tant and the com
5950: 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d  piler will optim
5960: 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20  ize.** out code 
5970: 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72  that would never
5980: 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66   execute..*/.#if
5990: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
59a0: 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e  MEMORYDB.# defin
59b0: 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a  e MEMDB 0.#else.
59c0: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70  # define MEMDB p
59d0: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e  Pager->memDb.#en
59e0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20  dif../*.** Page 
59f0: 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f  number PAGER_MJ_
5a00: 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73  PGNO is never us
5a10: 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20  ed in an SQLite 
5a20: 64 61 74 61 62 61 73 65 20 28 69 74 20 69 73 0a  database (it is.
5a30: 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  ** reserved for 
5a40: 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61  working around a
5a50: 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69   windows/posix i
5a60: 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e  ncompatibility).
5a70: 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69   It is.** used i
5a80: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  n the journal to
5a90: 20 73 69 67 6e 69 66 79 20 74 68 61 74 20 74 68   signify that th
5aa0: 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
5ab0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ac0: 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74  .** is devoted t
5ad0: 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74  o storing a mast
5ae0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
5af0: 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  - there are no m
5b00: 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20  ore pages to.** 
5b10: 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63  roll back. See c
5b20: 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63  omments for func
5b30: 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72  tion writeMaster
5b40: 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65  Journal() for de
5b50: 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65  tails..*/./* #de
5b60: 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47  fine PAGER_MJ_PG
5b70: 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42  NO(x) (PENDING_B
5b80: 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69  YTE/((x)->pageSi
5b90: 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ze)) */.#define 
5ba0: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29  PAGER_MJ_PGNO(x)
5bb0: 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f   ((PENDING_BYTE/
5bc0: 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29  ((x)->pageSize))
5bd0: 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  +1)../*.** The m
5be0: 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67  aximum legal pag
5bf0: 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33  e number is (2^3
5c00: 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69  1 - 1)..*/.#defi
5c10: 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  ne PAGER_MAX_PGN
5c20: 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a  O 2147483647../*
5c30: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 45 6e 74  .** The pagerEnt
5c40: 65 72 28 29 20 61 6e 64 20 70 61 67 65 72 4c 65  er() and pagerLe
5c50: 61 76 65 28 29 20 72 6f 75 74 69 6e 65 73 20 61  ave() routines a
5c60: 63 71 75 69 72 65 20 61 6e 64 20 72 65 6c 65 61  cquire and relea
5c70: 73 65 0a 2a 2a 20 61 20 6d 75 74 65 78 20 6f 6e  se.** a mutex on
5c80: 20 65 61 63 68 20 70 61 67 65 72 2e 20 20 54 68   each pager.  Th
5c90: 65 20 6d 75 74 65 78 20 69 73 20 72 65 63 75 72  e mutex is recur
5ca0: 73 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  sive..**.** This
5cb0: 20 69 73 20 61 20 73 70 65 63 69 61 6c 2d 70 75   is a special-pu
5cc0: 72 70 6f 73 65 20 6d 75 74 65 78 2e 20 20 49 74  rpose mutex.  It
5cd0: 20 6f 6e 6c 79 20 70 72 6f 76 69 64 65 73 20 6d   only provides m
5ce0: 75 74 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e 0a  utual exclusion.
5cf0: 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20 42  ** between the B
5d00: 74 72 65 65 20 61 6e 64 20 74 68 65 20 4d 65 6d  tree and the Mem
5d10: 6f 72 79 20 4d 61 6e 61 67 65 6d 65 6e 74 20 73  ory Management s
5d20: 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d  qlite3_release_m
5d30: 65 6d 6f 72 79 28 29 0a 2a 2a 20 66 75 6e 63 74  emory().** funct
5d40: 69 6f 6e 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ion.  It does no
5d50: 74 20 70 72 65 76 65 6e 74 2c 20 66 6f 72 20 65  t prevent, for e
5d60: 78 61 6d 70 6c 65 2c 20 74 77 6f 20 42 74 72 65  xample, two Btre
5d70: 65 73 20 66 72 6f 6d 20 61 63 63 65 73 73 69 6e  es from accessin
5d80: 67 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20 70 61  g.** the same pa
5d90: 67 65 72 20 61 74 20 74 68 65 20 73 61 6d 65 20  ger at the same 
5da0: 74 69 6d 65 2e 20 20 4f 74 68 65 72 20 67 65 6e  time.  Other gen
5db0: 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 6d 75 74  eral-purpose mut
5dc0: 65 78 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 62  exes in.** the b
5dd0: 74 72 65 65 20 6c 61 79 65 72 20 68 61 6e 64 6c  tree layer handl
5de0: 65 20 74 68 61 74 20 63 68 6f 72 65 2e 0a 2a 2f  e that chore..*/
5df0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5e00: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
5e10: 41 47 45 4d 45 4e 54 0a 20 20 73 74 61 74 69 63  AGEMENT.  static
5e20: 20 76 6f 69 64 20 70 61 67 65 72 45 6e 74 65 72   void pagerEnter
5e30: 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 20 20  (Pager *p){.    
5e40: 70 2d 3e 69 49 6e 55 73 65 44 42 2b 2b 3b 0a 20  p->iInUseDB++;. 
5e50: 20 20 20 69 66 28 20 70 2d 3e 69 49 6e 55 73 65     if( p->iInUse
5e60: 4d 4d 20 26 26 20 70 2d 3e 69 49 6e 55 73 65 44  MM && p->iInUseD
5e70: 42 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  B==1 ){.      sq
5e80: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
5e90: 65 78 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 20  ex;.      mutex 
5ea0: 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
5eb0: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
5ec0: 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b  EX_STATIC_MEM2);
5ed0: 0a 20 20 20 20 20 20 70 2d 3e 69 49 6e 55 73 65  .      p->iInUse
5ee0: 44 42 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  DB = 0;.      sq
5ef0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
5f00: 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  r(mutex);.      
5f10: 70 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 31 3b  p->iInUseDB = 1;
5f20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
5f30: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
5f40: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
5f50: 65 72 74 28 20 70 2d 3e 69 49 6e 55 73 65 4d 4d  ert( p->iInUseMM
5f60: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73 74 61  ==0 );.  }.  sta
5f70: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 4c 65  tic void pagerLe
5f80: 61 76 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ave(Pager *p){. 
5f90: 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 2d 2d     p->iInUseDB--
5fa0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
5fb0: 3e 69 49 6e 55 73 65 44 42 3e 3d 30 20 29 3b 0a  >iInUseDB>=0 );.
5fc0: 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69    }.#else.# defi
5fd0: 6e 65 20 70 61 67 65 72 45 6e 74 65 72 28 58 29  ne pagerEnter(X)
5fe0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 4c  .# define pagerL
5ff0: 65 61 76 65 28 58 29 0a 23 65 6e 64 69 66 0a 0a  eave(X).#endif..
6000: 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66  /*.** Enable ref
6010: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61  erence count tra
6020: 63 6b 69 6e 67 20 28 66 6f 72 20 64 65 62 75 67  cking (for debug
6030: 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23  ging) here:.*/.#
6040: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
6050: 55 47 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f  UG.  int pager3_
6060: 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d  refinfo_enable =
6070: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69   0;.  static voi
6080: 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28  d pager_refinfo(
6090: 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73  PgHdr *p){.    s
60a0: 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20  tatic int cnt = 
60b0: 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  0;.    if( !page
60c0: 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  r3_refinfo_enabl
60d0: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
60e0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
60f0: 74 66 28 0a 20 20 20 20 20 20 20 22 52 45 46 43  tf(.       "REFC
6100: 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20  NT: %4d addr=%p 
6110: 6e 52 65 66 3d 25 2d 33 64 20 74 6f 74 61 6c 3d  nRef=%-3d total=
6120: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d  %d\n",.       p-
6130: 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f  >pgno, PGHDR_TO_
6140: 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66  DATA(p), p->nRef
6150: 2c 20 70 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65  , p->pPager->nRe
6160: 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74  f.    );.    cnt
6170: 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69  ++;   /* Somethi
6180: 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ng to set a brea
6190: 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d  kpoint on */.  }
61a0: 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46  .# define REFINF
61b0: 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65 66 69  O(X)  pager_refi
61c0: 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64  nfo(X).#else.# d
61d0: 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29  efine REFINFO(X)
61e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
61f0: 64 64 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  dd page pPg to t
6200: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69  he end of the li
6210: 6e 6b 65 64 20 6c 69 73 74 20 6d 61 6e 61 67 65  nked list manage
6220: 64 20 62 79 20 73 74 72 75 63 74 75 72 65 0a 2a  d by structure.*
6230: 2a 20 70 4c 69 73 74 20 28 70 50 67 20 62 65 63  * pList (pPg bec
6240: 6f 6d 65 73 20 74 68 65 20 6c 61 73 74 20 65 6e  omes the last en
6250: 74 72 79 20 69 6e 20 74 68 65 20 6c 69 73 74 20  try in the list 
6260: 2d 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  - the most recen
6270: 74 6c 79 20 0a 2a 2a 20 75 73 65 64 29 2e 20 41  tly .** used). A
6280: 72 67 75 6d 65 6e 74 20 70 4c 69 6e 6b 20 73 68  rgument pLink sh
6290: 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 65 69  ould point to ei
62a0: 74 68 65 72 20 70 50 67 2d 3e 66 72 65 65 20 6f  ther pPg->free o
62b0: 72 20 70 50 67 2d 3e 67 66 72 65 65 2c 0a 2a 2a  r pPg->gfree,.**
62c0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
62d0: 65 74 68 65 72 20 70 50 67 20 69 73 20 62 65 69  ether pPg is bei
62e0: 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ng added to the 
62f0: 70 61 67 65 72 2d 73 70 65 63 69 66 69 63 20 6f  pager-specific o
6300: 72 0a 2a 2a 20 67 6c 6f 62 61 6c 20 4c 52 55 20  r.** global LRU 
6310: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
6320: 76 6f 69 64 20 6c 69 73 74 41 64 64 28 50 61 67  void listAdd(Pag
6330: 65 72 4c 72 75 4c 69 73 74 20 2a 70 4c 69 73 74  erLruList *pList
6340: 2c 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a  , PagerLruLink *
6350: 70 4c 69 6e 6b 2c 20 50 67 48 64 72 20 2a 70 50  pLink, PgHdr *pP
6360: 67 29 7b 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65  g){.  pLink->pNe
6370: 78 74 20 3d 20 30 3b 0a 20 20 70 4c 69 6e 6b 2d  xt = 0;.  pLink-
6380: 3e 70 50 72 65 76 20 3d 20 70 4c 69 73 74 2d 3e  >pPrev = pList->
6390: 70 4c 61 73 74 3b 0a 0a 23 69 66 64 65 66 20 53  pLast;..#ifdef S
63a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
63b0: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
63c0: 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26   assert(pLink==&
63d0: 70 50 67 2d 3e 66 72 65 65 20 7c 7c 20 70 4c 69  pPg->free || pLi
63e0: 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 29  nk==&pPg->gfree)
63f0: 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b  ;.  assert(pLink
6400: 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 20 7c 7c  ==&pPg->gfree ||
6410: 20 70 4c 69 73 74 21 3d 26 73 71 6c 69 74 65 33   pList!=&sqlite3
6420: 4c 72 75 50 61 67 65 4c 69 73 74 29 3b 0a 23 65  LruPageList);.#e
6430: 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 4c 69 73  ndif..  if( pLis
6440: 74 2d 3e 70 4c 61 73 74 20 29 7b 0a 20 20 20 20  t->pLast ){.    
6450: 69 6e 74 20 69 4f 66 66 20 3d 20 28 63 68 61 72  int iOff = (char
6460: 20 2a 29 70 4c 69 6e 6b 20 2d 20 28 63 68 61 72   *)pLink - (char
6470: 20 2a 29 70 50 67 3b 0a 20 20 20 20 50 61 67 65   *)pPg;.    Page
6480: 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 61 73 74 4c  rLruLink *pLastL
6490: 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c  ink = (PagerLruL
64a0: 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70  ink *)(&((u8 *)p
64b0: 4c 69 73 74 2d 3e 70 4c 61 73 74 29 5b 69 4f 66  List->pLast)[iOf
64c0: 66 5d 29 3b 0a 20 20 20 20 70 4c 61 73 74 4c 69  f]);.    pLastLi
64d0: 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 50 67 3b  nk->pNext = pPg;
64e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
64f0: 73 65 72 74 28 21 70 4c 69 73 74 2d 3e 70 46 69  sert(!pList->pFi
6500: 72 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rst);.    pList-
6510: 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20  >pFirst = pPg;. 
6520: 20 7d 0a 0a 20 20 70 4c 69 73 74 2d 3e 70 4c 61   }..  pList->pLa
6530: 73 74 20 3d 20 70 50 67 3b 0a 20 20 69 66 28 20  st = pPg;.  if( 
6540: 21 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79  !pList->pFirstSy
6550: 6e 63 65 64 20 26 26 20 70 50 67 2d 3e 6e 65 65  nced && pPg->nee
6560: 64 53 79 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20  dSync==0 ){.    
6570: 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e  pList->pFirstSyn
6580: 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d  ced = pPg;.  }.}
6590: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 70  ../*.** Remove p
65a0: 50 67 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  Pg from the list
65b0: 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68 65 20   managed by the 
65c0: 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65  structure pointe
65d0: 64 20 74 6f 20 62 79 20 70 4c 69 73 74 2e 0a 2a  d to by pList..*
65e0: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c  *.** Argument pL
65f0: 69 6e 6b 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74  ink should point
6600: 20 74 6f 20 65 69 74 68 65 72 20 70 50 67 2d 3e   to either pPg->
6610: 66 72 65 65 20 6f 72 20 70 50 67 2d 3e 67 66 72  free or pPg->gfr
6620: 65 65 2c 20 64 65 70 65 6e 64 69 6e 67 20 0a 2a  ee, depending .*
6630: 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 70 50 67  * on whether pPg
6640: 20 69 73 20 62 65 69 6e 67 20 61 64 64 65 64 20   is being added 
6650: 74 6f 20 74 68 65 20 70 61 67 65 72 2d 73 70 65  to the pager-spe
6660: 63 69 66 69 63 20 6f 72 20 67 6c 6f 62 61 6c 20  cific or global 
6670: 4c 52 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  LRU list..*/.sta
6680: 74 69 63 20 76 6f 69 64 20 6c 69 73 74 52 65 6d  tic void listRem
6690: 6f 76 65 28 50 61 67 65 72 4c 72 75 4c 69 73 74  ove(PagerLruList
66a0: 20 2a 70 4c 69 73 74 2c 20 50 61 67 65 72 4c 72   *pList, PagerLr
66b0: 75 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20 50 67  uLink *pLink, Pg
66c0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74  Hdr *pPg){.  int
66d0: 20 69 4f 66 66 20 3d 20 28 63 68 61 72 20 2a 29   iOff = (char *)
66e0: 70 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20 2a 29  pLink - (char *)
66f0: 70 50 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  pPg;..#ifdef SQL
6700: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
6710: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 61  Y_MANAGEMENT.  a
6720: 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50  ssert(pLink==&pP
6730: 67 2d 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e 6b  g->free || pLink
6740: 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 29 3b 0a  ==&pPg->gfree);.
6750: 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d    assert(pLink==
6760: 26 70 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20 70  &pPg->gfree || p
6770: 4c 69 73 74 21 3d 26 73 71 6c 69 74 65 33 4c 72  List!=&sqlite3Lr
6780: 75 50 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e 64  uPageList);.#end
6790: 69 66 0a 0a 20 20 69 66 28 20 70 50 67 3d 3d 70  if..  if( pPg==p
67a0: 4c 69 73 74 2d 3e 70 46 69 72 73 74 20 29 7b 0a  List->pFirst ){.
67b0: 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73      pList->pFirs
67c0: 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74  t = pLink->pNext
67d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d  ;.  }.  if( pPg=
67e0: 3d 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20 29 7b  =pList->pLast ){
67f0: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 4c 61 73  .    pList->pLas
6800: 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76  t = pLink->pPrev
6810: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 6e  ;.  }.  if( pLin
6820: 6b 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  k->pPrev ){.    
6830: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 50  PagerLruLink *pP
6840: 72 65 76 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72  revLink = (Pager
6850: 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38  LruLink *)(&((u8
6860: 20 2a 29 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 29   *)pLink->pPrev)
6870: 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70 50 72  [iOff]);.    pPr
6880: 65 76 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20  evLink->pNext = 
6890: 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLink->pNext;.  
68a0: 7d 0a 20 20 69 66 28 20 70 4c 69 6e 6b 2d 3e 70  }.  if( pLink->p
68b0: 4e 65 78 74 20 29 7b 0a 20 20 20 20 50 61 67 65  Next ){.    Page
68c0: 72 4c 72 75 4c 69 6e 6b 20 2a 70 4e 65 78 74 4c  rLruLink *pNextL
68d0: 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c  ink = (PagerLruL
68e0: 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70  ink *)(&((u8 *)p
68f0: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 29 5b 69 4f 66  Link->pNext)[iOf
6900: 66 5d 29 3b 0a 20 20 20 20 70 4e 65 78 74 4c 69  f]);.    pNextLi
6910: 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 70 4c 69 6e  nk->pPrev = pLin
6920: 6b 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  k->pPrev;.  }.  
6930: 69 66 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e  if( pPg==pList->
6940: 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a  pFirstSynced ){.
6950: 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70      PgHdr *p = p
6960: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Link->pNext;.   
6970: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
6980: 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
6990: 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a    PagerLruLink *
69a0: 70 4c 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69  pL = (PagerLruLi
69b0: 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 29  nk *)(&((u8 *)p)
69c0: 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 70  [iOff]);.      p
69d0: 20 3d 20 70 4c 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pL->pNext;.  
69e0: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70    }.    pList->p
69f0: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b  FirstSynced = p;
6a00: 0a 20 20 7d 0a 0a 20 20 70 4c 69 6e 6b 2d 3e 70  .  }..  pLink->p
6a10: 4e 65 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50  Next = pLink->pP
6a20: 72 65 76 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a  rev = 0;.}../* .
6a30: 2a 2a 20 41 64 64 20 70 61 67 65 20 70 50 67 20  ** Add page pPg 
6a40: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66  to the list of f
6a50: 72 65 65 20 70 61 67 65 73 20 66 6f 72 20 74 68  ree pages for th
6a60: 65 20 70 61 67 65 72 2e 20 49 66 20 0a 2a 2a 20  e pager. If .** 
6a70: 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e  memory-managemen
6a80: 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c  t is enabled, al
6a90: 73 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20  so add the page 
6aa0: 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 0a 2a  to the global .*
6ab0: 2a 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70  * list of free p
6ac0: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
6ad0: 76 6f 69 64 20 6c 72 75 4c 69 73 74 41 64 64 28  void lruListAdd(
6ae0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 6c  PgHdr *pPg){.  l
6af0: 69 73 74 41 64 64 28 26 70 50 67 2d 3e 70 50 61  istAdd(&pPg->pPa
6b00: 67 65 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d 3e  ger->lru, &pPg->
6b10: 66 72 65 65 2c 20 70 50 67 29 3b 0a 23 69 66 64  free, pPg);.#ifd
6b20: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6b30: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
6b40: 4e 54 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 70  NT.  if( !pPg->p
6b50: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
6b60: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
6b70: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f  x_enter(sqlite3_
6b80: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
6b90: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
6ba0: 4c 52 55 29 29 3b 0a 20 20 20 20 6c 69 73 74 41  LRU));.    listA
6bb0: 64 64 28 26 73 71 6c 69 74 65 33 4c 72 75 50 61  dd(&sqlite3LruPa
6bc0: 67 65 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67 66  geList, &pPg->gf
6bd0: 72 65 65 2c 20 70 50 67 29 3b 0a 20 20 20 20 73  ree, pPg);.    s
6be0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
6bf0: 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ve(sqlite3_mutex
6c00: 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
6c10: 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29  TEX_STATIC_LRU))
6c20: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
6c30: 2f 2a 20 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 61  /* .** Remove pa
6c40: 67 65 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20  ge pPg from the 
6c50: 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67  list of free pag
6c60: 65 73 20 66 6f 72 20 74 68 65 20 61 73 73 6f 63  es for the assoc
6c70: 69 61 74 65 64 20 70 61 67 65 72 2e 0a 2a 2a 20  iated pager..** 
6c80: 49 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65  If memory-manage
6c90: 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c  ment is enabled,
6ca0: 20 61 6c 73 6f 20 72 65 6d 6f 76 65 20 70 50 67   also remove pPg
6cb0: 20 66 72 6f 6d 20 74 68 65 20 67 6c 6f 62 61 6c   from the global
6cc0: 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 66 72 65 65   list.** of free
6cd0: 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   pages..*/.stati
6ce0: 63 20 76 6f 69 64 20 6c 72 75 4c 69 73 74 52 65  c void lruListRe
6cf0: 6d 6f 76 65 28 50 67 48 64 72 20 2a 70 50 67 29  move(PgHdr *pPg)
6d00: 7b 0a 20 20 6c 69 73 74 52 65 6d 6f 76 65 28 26  {.  listRemove(&
6d10: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6c 72 75  pPg->pPager->lru
6d20: 2c 20 26 70 50 67 2d 3e 66 72 65 65 2c 20 70 50  , &pPg->free, pP
6d30: 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  g);.#ifdef SQLIT
6d40: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
6d50: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28  MANAGEMENT.  if(
6d60: 20 21 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d   !pPg->pPager->m
6d70: 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  emDb ){.    sqli
6d80: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
6d90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
6da0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
6db0: 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20  _STATIC_LRU));. 
6dc0: 20 20 20 6c 69 73 74 52 65 6d 6f 76 65 28 26 73     listRemove(&s
6dd0: 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
6de0: 74 2c 20 26 70 50 67 2d 3e 67 66 72 65 65 2c 20  t, &pPg->gfree, 
6df0: 70 50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pPg);.    sqlite
6e00: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
6e10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
6e20: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
6e30: 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d  TATIC_LRU));.  }
6e40: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a  .#endif.}../* .*
6e50: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6e60: 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 61  is called just a
6e70: 66 74 65 72 20 74 68 65 20 6e 65 65 64 53 79 6e  fter the needSyn
6e80: 63 20 66 6c 61 67 20 68 61 73 20 62 65 65 6e 20  c flag has been 
6e90: 63 6c 65 61 72 65 64 0a 2a 2a 20 66 72 6f 6d 20  cleared.** from 
6ea0: 61 6c 6c 20 70 61 67 65 73 20 6d 61 6e 61 67 65  all pages manage
6eb0: 64 20 62 79 20 70 50 61 67 65 72 20 28 75 73 75  d by pPager (usu
6ec0: 61 6c 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ally because the
6ed0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
6ee0: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73   has just been s
6ef0: 79 6e 63 65 64 29 2e 20 49 74 20 75 70 64 61 74  ynced). It updat
6f00: 65 73 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6c  es the pPager->l
6f10: 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20  ru.pFirstSynced 
6f20: 76 61 72 69 61 62 6c 65 0a 2a 2a 20 61 6e 64 2c  variable.** and,
6f30: 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67   if memory-manag
6f40: 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64  ement is enabled
6f50: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 4c 72 75  , the sqlite3Lru
6f60: 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53  PageList.pFirstS
6f70: 79 6e 63 65 64 0a 2a 2a 20 76 61 72 69 61 62 6c  ynced.** variabl
6f80: 65 20 61 6c 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69  e also..*/.stati
6f90: 63 20 76 6f 69 64 20 6c 72 75 4c 69 73 74 53 65  c void lruListSe
6fa0: 74 46 69 72 73 74 53 79 6e 63 65 64 28 50 61 67  tFirstSynced(Pag
6fb0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70  er *pPager){.  p
6fc0: 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73  Pager->lru.pFirs
6fd0: 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  tSynced = pPager
6fe0: 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3b 0a 23 69  ->lru.pFirst;.#i
6ff0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7000: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
7010: 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61 67  MENT.  if( !pPag
7020: 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
7030: 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 73   PgHdr *p;.    s
7040: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
7050: 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  er(sqlite3_mutex
7060: 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
7070: 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29  TEX_STATIC_LRU))
7080: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
7090: 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70  te3LruPageList.p
70a0: 46 69 72 73 74 3b 20 70 20 26 26 20 70 2d 3e 6e  First; p && p->n
70b0: 65 65 64 53 79 6e 63 3b 20 70 3d 70 2d 3e 67 66  eedSync; p=p->gf
70c0: 72 65 65 2e 70 4e 65 78 74 29 3b 0a 20 20 20 20  ree.pNext);.    
70d0: 61 73 73 65 72 74 28 70 3d 3d 70 50 61 67 65 72  assert(p==pPager
70e0: 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
70f0: 65 64 20 7c 7c 20 70 3d 3d 73 71 6c 69 74 65 33  ed || p==sqlite3
7100: 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72  LruPageList.pFir
7110: 73 74 53 79 6e 63 65 64 29 3b 0a 20 20 20 20 73  stSynced);.    s
7120: 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
7130: 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  t.pFirstSynced =
7140: 20 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   p;.    sqlite3_
7150: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
7160: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
7170: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
7180: 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23  TIC_LRU));.  }.#
7190: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
71a0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 70 61  eturn true if pa
71b0: 67 65 20 2a 70 50 67 20 68 61 73 20 61 6c 72 65  ge *pPg has alre
71c0: 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
71d0: 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e   to the statemen
71e0: 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 6f 72  t.** journal (or
71f0: 20 73 74 61 74 65 6d 65 6e 74 20 73 6e 61 70 73   statement snaps
7200: 68 6f 74 20 68 61 73 20 62 65 65 6e 20 63 72 65  hot has been cre
7210: 61 74 65 64 2c 20 69 66 20 2a 70 50 67 20 69 73  ated, if *pPg is
7220: 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 6e 20 69   part.** of an i
7230: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
7240: 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
7250: 74 20 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e  t pageInStatemen
7260: 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
7270: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
7280: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
7290: 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
72a0: 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f   return PGHDR_TO
72b0: 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
72c0: 72 29 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20 7d 65  r)->inStmt;.  }e
72d0: 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  lse{.    Pgno pg
72e0: 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
72f0: 20 20 20 20 75 38 20 2a 61 20 3d 20 70 50 61 67      u8 *a = pPag
7300: 65 72 2d 3e 61 49 6e 53 74 6d 74 3b 0a 20 20 20  er->aInStmt;.   
7310: 20 72 65 74 75 72 6e 20 28 61 20 26 26 20 28 69   return (a && (i
7320: 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
7330: 3e 73 74 6d 74 53 69 7a 65 20 26 26 20 28 61 5b  >stmtSize && (a[
7340: 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
7350: 67 6e 6f 26 37 29 29 29 29 3b 0a 20 20 7d 0a 7d  gno&7))));.  }.}
7360: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
7370: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  he size of the p
7380: 61 67 65 72 20 68 61 73 68 20 74 61 62 6c 65 20  ager hash table 
7390: 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20 62 65  to N.  N must be
73a0: 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66 20 74   a power.** of t
73b0: 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  wo..*/.static vo
73c0: 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f  id pager_resize_
73d0: 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67 65 72  hash_table(Pager
73e0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 29   *pPager, int N)
73f0: 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73  {.  PgHdr **aHas
7400: 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73 65 72  h, *pPg;.  asser
7410: 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28 4e 2d  t( N>0 && (N&(N-
7420: 31 29 29 3d 3d 30 20 29 3b 0a 20 20 70 61 67 65  1))==0 );.  page
7430: 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
7440: 20 20 61 48 61 73 68 20 3d 20 73 71 6c 69 74 65    aHash = sqlite
7450: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
7460: 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e 20  eof(aHash[0])*N 
7470: 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  );.  pagerEnter(
7480: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 61  pPager);.  if( a
7490: 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Hash==0 ){.    /
74a0: 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65 68  * Failure to reh
74b0: 61 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65 72  ash is not an er
74c0: 72 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ror.  It is only
74d0: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68   a performance h
74e0: 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  it. */.    retur
74f0: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
7500: 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48  _free(pPager->aH
7510: 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ash);.  pPager->
7520: 6e 48 61 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61  nHash = N;.  pPa
7530: 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 61 48 61  ger->aHash = aHa
7540: 73 68 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  sh;.  for(pPg=pP
7550: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
7560: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
7570: 6c 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a  ll){.    int h;.
7580: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
7590: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  o==0 ){.      as
75a0: 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
75b0: 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e  Hash==0 && pPg->
75c0: 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
75d0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
75e0: 20 20 20 20 7d 0a 20 20 20 20 68 20 3d 20 70 50      }.    h = pP
75f0: 67 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b  g->pgno & (N-1);
7600: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
7610: 61 73 68 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a  ash = aHash[h];.
7620: 20 20 20 20 69 66 28 20 61 48 61 73 68 5b 68 5d      if( aHash[h]
7630: 20 29 7b 0a 20 20 20 20 20 20 61 48 61 73 68 5b   ){.      aHash[
7640: 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  h]->pPrevHash = 
7650: 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  pPg;.    }.    a
7660: 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
7670: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73     pPg->pPrevHas
7680: 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  h = 0;.  }.}../*
7690: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
76a0: 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  t integer from t
76b0: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
76c0: 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65  scriptor.  Store
76d0: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
76e0: 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20  that is read in 
76f0: 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53  *pRes.  Return S
7700: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
7710: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f  ything worked, o
7720: 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  r an.** error co
7730: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
7740: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
7750: 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65  * All values are
7760: 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20   stored on disk 
7770: 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a  as big-endian..*
7780: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
7790: 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  d32bits(sqlite3_
77a0: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
77b0: 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29  fset, u32 *pRes)
77c0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
77d0: 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72  r ac[4];.  int r
77e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
77f0: 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66  d(fd, ac, sizeof
7800: 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20  (ac), offset);. 
7810: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7820: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  OK ){.    *pRes 
7830: 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
7840: 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(ac);.  }.  ret
7850: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7860: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
7870: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
7880: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
7890: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
78a0: 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  order..*/.#defin
78b0: 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29  e put32bits(A,B)
78c0: 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74    sqlite3Put4byt
78d0: 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a  e((u8*)A,B)../*.
78e0: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
78f0: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74  t integer into t
7900: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
7910: 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72  scriptor.  Retur
7920: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
7930: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
7940: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
7950: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
7960: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
7970: 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71  t write32bits(sq
7980: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
7990: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
79a0: 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b  val){.  char ac[
79b0: 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  4];.  put32bits(
79c0: 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75  ac, val);.  retu
79d0: 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  rn sqlite3OsWrit
79e0: 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66  e(fd, ac, 4, off
79f0: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  set);.}../*.** I
7a00: 66 20 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70  f file pFd is op
7a10: 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  en, call sqlite3
7a20: 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74  OsUnlock() on it
7a30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7a40: 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  osUnlock(sqlite3
7a50: 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20  _file *pFd, int 
7a60: 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 70  eLock){.  if( !p
7a70: 46 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  Fd->pMethods ){.
7a80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7a90: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
7aa0: 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  rn sqlite3OsUnlo
7ab0: 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a  ck(pFd, eLock);.
7ac0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
7ad0: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
7ae0: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
7af0: 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
7b00: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
7b10: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69  * can be used wi
7b20: 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54  th this pager. T
7b30: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
7b40: 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a  can be used if:.
7b50: 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76  **.**  (a) the v
7b60: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
7b70: 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74   OsDeviceCharact
7b80: 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63  eristics() indic
7b90: 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  ates that.**    
7ba0: 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67    a database pag
7bb0: 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  e may be written
7bc0: 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64   atomically, and
7bd0: 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c  .**  (b) the val
7be0: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
7bf0: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73  sSectorSize() is
7c00: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
7c10: 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ual.**      to t
7c20: 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
7c30: 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d  .** If the optim
7c40: 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ization cannot b
7c50: 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74  e used, 0 is ret
7c60: 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e  urned. If it can
7c70: 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65   be used,.** the
7c80: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
7c90: 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65  rned is the size
7ca0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
7cb0: 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20  file when it.** 
7cc0: 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63  contains rollbac
7cd0: 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74  k data for exact
7ce0: 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a  ly one page..*/.
7cf0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
7d00: 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
7d10: 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e  E.static int jrn
7d20: 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65  lBufferSize(Page
7d30: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
7d40: 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20  t dc;           
7d50: 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63  /* Device charac
7d60: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 69  teristics */.  i
7d70: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
7d80: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
7d90: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
7da0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73         /* Page s
7db0: 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ize */.  sqlite3
7dc0: 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67  _file *fd = pPag
7dd0: 65 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66  er->fd;..  if( f
7de0: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
7df0: 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f     dc = sqlite3O
7e00: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
7e10: 69 73 74 69 63 73 28 66 64 29 3b 0a 20 20 20 20  istics(fd);.    
7e20: 6e 53 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nSector = sqlite
7e30: 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66 64  3OsSectorSize(fd
7e40: 29 3b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 70  );.    nPage = p
7e50: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
7e60: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 53  .  }..  assert(S
7e70: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
7e80: 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
7e90: 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49 54  ;.  assert(SQLIT
7ea0: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
7eb0: 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
7ec0: 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d 65 74  .  if( !fd->pMet
7ed0: 68 6f 64 73 20 7c 7c 20 28 64 63 26 28 53 51 4c  hods || (dc&(SQL
7ee0: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
7ef0: 7c 28 6e 50 61 67 65 3e 3e 38 29 29 26 26 6e 53  |(nPage>>8))&&nS
7f00: 65 63 74 6f 72 3c 3d 6e 50 61 67 65 29 20 29 7b  ector<=nPage) ){
7f10: 0a 20 20 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  .    return JOUR
7f20: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
7f30: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
7f40: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
7f50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
7f60: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
7f70: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
7f80: 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
7f90: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
7fa0: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 72  within the pager
7fb0: 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69  .** code. The fi
7fc0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
7fd0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
7fe0: 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65   pager structure
7ff0: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
8000: 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
8010: 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
8020: 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41  ned by a pager A
8030: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  PI function. .**
8040: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
8050: 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
8060: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
8070: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
8080: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
8090: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
80a0: 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49  ment is SQLITE_I
80b0: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
80c0: 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f  RUPT, or SQLITE_
80d0: 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  FULL.** the erro
80e0: 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73  r becomes persis
80f0: 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62 73 65 71  tent. All subseq
8100: 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f  uent API calls o
8110: 6e 20 74 68 69 73 20 50 61 67 65 72 0a 2a 2a 20  n this Pager.** 
8120: 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
8130: 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
8140: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
8150: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
8160: 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50  _error(Pager *pP
8170: 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20  ager, int rc){. 
8180: 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20   int rc2 = rc & 
8190: 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a  0xff;.  assert(.
81a0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
81b0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
81c0: 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
81d0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
81e0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
81f0: 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
8200: 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
8210: 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
8220: 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51   if(.    rc2==SQ
8230: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
8240: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
8250: 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  RR ||.    rc2==S
8260: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20  QLITE_CORRUPT.  
8270: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
8280: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d  rrCode = rc;.  }
8290: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
82a0: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  ./*.** If SQLITE
82b0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20  _CHECK_PAGES is 
82c0: 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20  defined then we 
82d0: 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63  do some sanity c
82e0: 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68  hecking.** on th
82f0: 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20  e cache using a 
8300: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20  hash function.  
8310: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
8320: 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20   testing.** and 
8330: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
8340: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8350: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a  _CHECK_PAGES./*.
8360: 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62  ** Return a 32-b
8370: 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70  it hash of the p
8380: 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61  age data for pPa
8390: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  ge..*/.static u3
83a0: 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  2 pager_datahash
83b0: 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69  (int nByte, unsi
83c0: 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61  gned char *pData
83d0: 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20  ){.  u32 hash = 
83e0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  0;.  int i;.  fo
83f0: 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20  r(i=0; i<nByte; 
8400: 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d  i++){.    hash =
8410: 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70   (hash*1039) + p
8420: 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72  Data[i];.  }.  r
8430: 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74  eturn hash;.}.st
8440: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70  atic u32 pager_p
8450: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
8460: 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Page){.  return 
8470: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
8480: 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61  Page->pPager->pa
8490: 67 65 53 69 7a 65 2c 20 0a 20 20 20 20 20 20 20  geSize, .       
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84b0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
84c0: 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  *)PGHDR_TO_DATA(
84d0: 70 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPage));.}../*.*
84e0: 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45  * The CHECK_PAGE
84f0: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50   macro takes a P
8500: 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75  gHdr* as an argu
8510: 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f  ment. If SQLITE_
8520: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69  CHECK_PAGES.** i
8530: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e  s defined, and N
8540: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
8550: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
8560: 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63  ) statement chec
8570: 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  ks.** that the p
8580: 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69  age is either di
8590: 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74  rty or still mat
85a0: 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61  ches the calcula
85b0: 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a  ted page-hash..*
85c0: 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  /.#define CHECK_
85d0: 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67  PAGE(x) checkPag
85e0: 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64  e(x).static void
85f0: 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72   checkPage(PgHdr
8600: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
8610: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
8620: 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
8630: 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20   !pPg->pageHash 
8640: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
8650: 64 65 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70  de || MEMDB || p
8660: 50 67 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20  Pg->dirty || .  
8670: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
8680: 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73  h==pager_pagehas
8690: 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c  h(pPg) );.}..#el
86a0: 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72  se.#define pager
86b0: 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20  _datahash(X,Y)  
86c0: 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  0.#define pager_
86d0: 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23  pagehash(X)  0.#
86e0: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
86f0: 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E(x).#endif../*.
8700: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
8710: 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e  called the journ
8720: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
8730: 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65  r pPager must be
8740: 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61   open..** The ma
8750: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8760: 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66  e name is read f
8770: 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74  rom the end of t
8780: 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20  he file and .** 
8790: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d  written into mem
87a0: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
87b0: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
87c0: 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69 73  (). *pzMaster is
87d0: 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  .** set to point
87e0: 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 61   at the memory a
87f0: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
8800: 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  urned. The calle
8810: 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65  r must.** sqlite
8820: 33 5f 66 72 65 65 28 29 20 2a 70 7a 4d 61 73 74  3_free() *pzMast
8830: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  er..**.** If no 
8840: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
8850: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
8860: 65 6e 74 20 2a 70 7a 4d 61 73 74 65 72 20 69 73  ent *pzMaster is
8870: 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a   set to 0 and.**
8880: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
8890: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
88a0: 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75  nt readMasterJou
88b0: 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  rnal(sqlite3_fil
88c0: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
88d0: 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  *pzMaster){.  in
88e0: 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  t rc;.  u32 len;
88f0: 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33  .  i64 szJ;.  u3
8900: 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69  2 cksum;.  int i
8910: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
8920: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20  r aMagic[8]; /* 
8930: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
8940: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
8950: 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65  r */..  *pzMaste
8960: 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73  r = 0;..  rc = s
8970: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
8980: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20  (pJrnl, &szJ);. 
8990: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
89a0: 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72  OK || szJ<16 ) r
89b0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
89c0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
89d0: 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e  nl, szJ-16, &len
89e0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
89f0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
8a00: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
8a10: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
8a20: 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  J-12, &cksum);. 
8a30: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8a40: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
8a50: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
8a60: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
8a70: 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 3b 0a  gic, 8, szJ-8);.
8a80: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8a90: 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  _OK || memcmp(aM
8aa0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
8ab0: 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e  gic, 8) ) return
8ac0: 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65   rc;..  *pzMaste
8ad0: 72 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  r = (char *)sqli
8ae0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6c 65  te3MallocZero(le
8af0: 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a  n+1);.  if( !*pz
8b00: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65  Master ){.    re
8b10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
8b20: 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  M;.  }.  rc = sq
8b30: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
8b40: 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65  l, *pzMaster, le
8b50: 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a  n, szJ-16-len);.
8b60: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8b70: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
8b80: 65 33 5f 66 72 65 65 28 2a 70 7a 4d 61 73 74 65  e3_free(*pzMaste
8b90: 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65  r);.    *pzMaste
8ba0: 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  r = 0;.    retur
8bb0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
8bc0: 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b  See if the check
8bd0: 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20  sum matches the 
8be0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
8bf0: 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ame */.  for(i=0
8c00: 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  ; i<len; i++){. 
8c10: 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a     cksum -= (*pz
8c20: 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a  Master)[i];.  }.
8c30: 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20    if( cksum ){. 
8c40: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65     /* If the che
8c50: 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64  cksum doesn't ad
8c60: 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f  d up, then one o
8c70: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69  r more of the di
8c80: 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a  sk sectors.    *
8c90: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
8ca0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8cb0: 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72  filename is corr
8cc0: 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  upted. This mean
8cd0: 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74  s.    ** definit
8ce0: 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73  ely roll back, s
8cf0: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  o just return SQ
8d00: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f  LITE_OK and repo
8d10: 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a  rt a (nul).    *
8d20: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
8d30: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a   filename..    *
8d40: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  /.    sqlite3_fr
8d50: 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20  ee(*pzMaster);. 
8d60: 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30     *pzMaster = 0
8d70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28  ;.  }else{.    (
8d80: 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20  *pzMaster)[len] 
8d90: 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a  = '\0';.  }.   .
8da0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8db0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  OK;.}../*.** See
8dc0: 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  k the journal fi
8dd0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
8de0: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
8df0: 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20   boundary where 
8e00: 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61  a.** journal hea
8e10: 64 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20  der may be read 
8e20: 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65  or written. Page
8e30: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20  r.journalOff is 
8e40: 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  updated with.** 
8e50: 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66  the new seek off
8e60: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66  set..**.** i.e f
8e70: 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65  or a sector size
8e80: 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49   of 512:.**.** I
8e90: 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20  nput Offset     
8ea0: 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20           Output 
8eb0: 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  Offset.** ------
8ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ee0: 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20  -.** 0          
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
8f00: 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20  .** 512         
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
8f20: 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20  2.** 100        
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
8f40: 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20  12.** 2000      
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f60: 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  2048.** .*/.stat
8f70: 69 63 20 76 6f 69 64 20 73 65 65 6b 4a 6f 75 72  ic void seekJour
8f80: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
8f90: 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66  ager){.  i64 off
8fa0: 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63  set = 0;.  i64 c
8fb0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
8fc0: 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29  alOff;.  if( c )
8fd0: 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28  {.    offset = (
8fe0: 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44  (c-1)/JOURNAL_HD
8ff0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31  R_SZ(pPager) + 1
9000: 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ) * JOURNAL_HDR_
9010: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
9020: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
9030: 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  %JOURNAL_HDR_SZ(
9040: 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
9050: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
9060: 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  c );.  assert( (
9070: 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41  offset-c)<JOURNA
9080: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
9090: 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   );.  pPager->jo
90a0: 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65  urnalOff = offse
90b0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
90c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
90d0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
90e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
90f0: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
9100: 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52  .** header (JOUR
9110: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
9120: 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  ) is written int
9130: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
9140: 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72  le at the.** cur
9150: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rent location..*
9160: 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20  *.** The format 
9170: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
9180: 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c  header is as fol
9190: 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74  lows:.** - 8 byt
91a0: 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
91b0: 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
91c0: 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rmat..** - 4 byt
91d0: 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  es: Number of re
91e0: 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c  cords in journal
91f0: 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20  , or -1 no-sync 
9200: 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d  mode is on..** -
9210: 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d   4 bytes: Random
9220: 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72   number used for
9230: 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d   page hash..** -
9240: 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61   4 bytes: Initia
9250: 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  l database page 
9260: 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  count..** - 4 by
9270: 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65  tes: Sector size
9280: 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f   used by the pro
9290: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
92a0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  this journal..**
92b0: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
92c0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
92d0: 20 2d 20 32 34 29 20 62 79 74 65 73 20 6f 66 20   - 24) bytes of 
92e0: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
92f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
9300: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
9310: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 63 68  r *pPager){.  ch
9320: 61 72 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  ar zHeader[sizeo
9330: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
9340: 2b 31 36 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  +16];.  int rc;.
9350: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
9360: 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a  tmtHdrOff==0 ){.
9370: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
9380: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
9390: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d  >journalOff;.  }
93a0: 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  ..  seekJournalH
93b0: 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  dr(pPager);.  pP
93c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
93d0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
93e0: 61 6c 4f 66 66 3b 0a 0a 20 20 6d 65 6d 63 70 79  alOff;..  memcpy
93f0: 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
9400: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
9410: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
9420: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
9430: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
9440: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
9450: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
9460: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
9470: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
9480: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
9490: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
94a0: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
94b0: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
94c0: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
94d0: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
94e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
94f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
9500: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
9510: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
9520: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
9530: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
9540: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
9550: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
9560: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
9570: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
9580: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
9590: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
95a0: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
95b0: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
95c0: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
95d0: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
95e0: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
95f0: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
9600: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
9610: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
9620: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
9630: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
9640: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
9650: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
9660: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
9670: 72 65 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73  re occured whils
9680: 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  t writing to the
9690: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
96a0: 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69  le it may contai
96b0: 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64  n some garbage d
96c0: 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74  ata. There are t
96d0: 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a  wo scenarios.  *
96e0: 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73  * where this ris
96f0: 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  k can be ignored
9700: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  :.  **.  **   * 
9710: 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69  When the pager i
9720: 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
9730: 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61  e. Corruption ca
9740: 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20  n follow a.  ** 
9750: 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72      power failur
9760: 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  e in this case a
9770: 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nyway..  **.  **
9780: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51     * When the SQ
9790: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
97a0: 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73  APPEND flag is s
97b0: 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  et. This guarant
97c0: 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61  ees.  **     tha
97d0: 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69  t garbage data i
97e0: 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64  s never appended
97f0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
9800: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
9810: 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e  ert(pPager->fd->
9820: 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72  pMethods||pPager
9830: 2d 3e 6e 6f 53 79 6e 63 29 3b 0a 20 20 69 66 28  ->noSync);.  if(
9840: 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   (pPager->noSync
9850: 29 20 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  ) .   || (sqlite
9860: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
9870: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
9880: 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
9890: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a  P_SAFE_APPEND) .
98a0: 20 20 29 7b 0a 20 20 20 20 70 75 74 33 32 62 69    ){.    put32bi
98b0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
98c0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
98d0: 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b  )], 0xffffffff);
98e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 75  .  }else{.    pu
98f0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
9900: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
9910: 4d 61 67 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d  Magic)], 0);.  }
9920: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f  ..  /* The rando
9930: 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69  m check-hash ini
9940: 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73  tialiser */ .  s
9950: 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73  qlite3Randomness
9960: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
9970: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
9980: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
9990: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
99a0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
99b0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
99c0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
99d0: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
99e0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
99f0: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
9a00: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
9a10: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
9a20: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  +8], pPager->dbS
9a30: 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61  ize);.  /* The a
9a40: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
9a50: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ze for this proc
9a60: 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ess */.  put32bi
9a70: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
9a80: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
9a90: 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73  )+12], pPager->s
9aa0: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 49 4f  ectorSize);.  IO
9ab0: 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
9ac0: 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
9ad0: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
9ae0: 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  nalHdr, sizeof(z
9af0: 48 65 61 64 65 72 29 29 29 0a 20 20 72 63 20 3d  Header))).  rc =
9b00: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
9b10: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
9b20: 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65  ader, sizeof(zHe
9b30: 61 64 65 72 29 2c 70 50 61 67 65 72 2d 3e 6a 6f  ader),pPager->jo
9b40: 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 70 50 61  urnalOff);.  pPa
9b50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9b60: 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  += JOURNAL_HDR_S
9b70: 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a  Z(pPager);..  /*
9b80: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
9b90: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
9ba0: 74 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  tten successfull
9bb0: 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72  y. Seek the jour
9bc0: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65  nal.  ** file de
9bd0: 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
9be0: 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
9bf0: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
9c00: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
9c10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9c20: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 54 41 49    IOTRACE(("JTAI
9c30: 4c 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50  L %p %lld\n", pP
9c40: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
9c50: 75 72 6e 61 6c 4f 66 66 2d 31 29 29 0a 20 20 20  urnalOff-1)).   
9c60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
9c70: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
9c80: 2c 20 22 5c 30 30 30 22 2c 20 31 2c 20 70 50 61  , "\000", 1, pPa
9c90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d  ger->journalOff-
9ca0: 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
9cb0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
9cc0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
9cd0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
9ce0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
9cf0: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
9d00: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
9d10: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
9d20: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
9d30: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
9d40: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
9d50: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63  l.** file. See c
9d60: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
9d70: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
9d80: 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64  nalHdr() for a d
9d90: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a  escription of.**
9da0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
9db0: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
9dc0: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
9dd0: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
9de0: 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73  ully, *nRec is s
9df0: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
9e00: 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f   of.** page reco
9e10: 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  rds following th
9e20: 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64  is header and *d
9e30: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
9e40: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
9e50: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
9e60: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
9e70: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
9e80: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
9e90: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
9ea0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
9eb0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
9ec0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
9ed0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
9ee0: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
9ef0: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
9f00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
9f10: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
9f20: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
9f30: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
9f40: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
9f50: 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69   *nRec and *dbSi
9f60: 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20  ze are not set. 
9f70: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
9f80: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
9f90: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
9fa0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9fb0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
9fc0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
9fd0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
9fe0: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
9ff0: 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36  r *pPager, .  i6
a000: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20  4 journalSize,. 
a010: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20   u32 *pNRec, .  
a020: 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a  u32 *pDbSize.){.
a030: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
a040: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
a050: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
a060: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
a070: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
a080: 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 0a 20 20 73  64 jrnlOff;..  s
a090: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
a0a0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
a0b0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
a0c0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
a0d0: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
a0e0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
a0f0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
a100: 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20    }.  jrnlOff = 
a110: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
a120: 66 66 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  ff;..  rc = sqli
a130: 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
a140: 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73  ->jfd, aMagic, s
a150: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 6a  izeof(aMagic), j
a160: 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20 72  rnlOff);.  if( r
a170: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
a180: 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73 69 7a 65   jrnlOff += size
a190: 6f 66 28 61 4d 61 67 69 63 29 3b 0a 0a 20 20 69  of(aMagic);..  i
a1a0: 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  f( memcmp(aMagic
a1b0: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
a1c0: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
a1d0: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
a1e0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
a1f0: 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33   }..  rc = read3
a200: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
a210: 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 4e 52 65  d, jrnlOff, pNRe
a220: 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  c);.  if( rc ) r
a230: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
a240: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
a250: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
a260: 66 2b 34 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  f+4, &pPager->ck
a270: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20  sumInit);.  if( 
a280: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
a290: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
a2a0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
a2b0: 6a 72 6e 6c 4f 66 66 2b 38 2c 20 70 44 62 53 69  jrnlOff+8, pDbSi
a2c0: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
a2d0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
a2e0: 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
a2f0: 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
a300: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
a310: 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a  ue used by .  **
a320: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
a330: 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
a340: 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
a350: 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a  journal was.  **
a360: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
a370: 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
a380: 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
a390: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a  this routine.  *
a3a0: 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
a3b0: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
a3c0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
a3d0: 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
a3e0: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
a3f0: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
a400: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
a410: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
a420: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
a430: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
a440: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 32 2c  jfd, jrnlOff+12,
a450: 20 28 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d   (u32 *)&pPager-
a460: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20  >sectorSize);.  
a470: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
a480: 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a  rc;..  pPager->j
a490: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
a4a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
a4b0: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
a4c0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
a4d0: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70  ** Write the sup
a4e0: 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75  plied master jou
a4f0: 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74  rnal name into t
a500: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
a510: 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61  for pager.** pPa
a520: 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65  ger at the curre
a530: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65  nt location. The
a540: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a550: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65  name must be the
a560: 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77   last.** thing w
a570: 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72  ritten to a jour
a580: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
a590: 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c   pager is in ful
a5a0: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  l-sync mode, the
a5b0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
a5c0: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
a5d0: 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e  dvanced to the n
a5e0: 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
a5f0: 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ary before.** an
a600: 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65  ything is writte
a610: 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  n. The format is
a620: 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65  :.**.** + 4 byte
a630: 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
a640: 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20  ..** + N bytes: 
a650: 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
a660: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
a670: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a  * + 4 bytes: N.*
a680: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73  * + 4 bytes: Mas
a690: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
a6a0: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20   checksum..** + 
a6b0: 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
a6c0: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
a6d0: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
a6e0: 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
a6f0: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
a700: 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
a710: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
a720: 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  l name..**.** If
a730: 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55   zMaster is a NU
a740: 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75  LL pointer (occu
a750: 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  rs for a single 
a760: 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
a770: 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20  tion), .** this 
a780: 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
a790: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
a7a0: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
a7b0: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
a7c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
a7d0: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
a7e0: 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69  .  int len; .  i
a7f0: 6e 74 20 69 3b 20 0a 20 20 69 36 34 20 6a 72 6e  nt i; .  i64 jrn
a800: 6c 4f 66 66 3b 0a 20 20 75 33 32 20 63 6b 73 75  lOff;.  u32 cksu
a810: 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  m = 0;.  char zB
a820: 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  uf[sizeof(aJourn
a830: 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a  alMagic)+2*4];..
a840: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c    if( !zMaster |
a850: 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  | pPager->setMas
a860: 74 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ter) return SQLI
a870: 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d  TE_OK;.  pPager-
a880: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
a890: 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  .  len = strlen(
a8a0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28  zMaster);.  for(
a8b0: 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29  i=0; i<len; i++)
a8c0: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a  {.    cksum += z
a8d0: 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a  Master[i];.  }..
a8e0: 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
a8f0: 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
a900: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
a910: 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
a920: 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
a930: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a940: 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
a950: 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
a960: 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
a970: 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
a980: 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
a990: 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
a9a0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
a9b0: 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
a9c0: 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72    seekJournalHdr
a9d0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
a9e0: 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  jrnlOff = pPager
a9f0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
aa00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
aa10: 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a  ff += (len+20);.
aa20: 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62  .  rc = write32b
aa30: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
aa40: 20 6a 72 6e 6c 4f 66 66 2c 20 50 41 47 45 52 5f   jrnlOff, PAGER_
aa50: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
aa60: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
aa70: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
aa80: 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20  c;.  jrnlOff += 
aa90: 34 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  4;..  rc = sqlit
aaa0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
aab0: 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
aac0: 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20  len, jrnlOff);. 
aad0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
aae0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
aaf0: 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65 6e    jrnlOff += len
ab00: 3b 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a  ;..  put32bits(z
ab10: 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74  Buf, len);.  put
ab20: 33 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c  32bits(&zBuf[4],
ab30: 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70   cksum);.  memcp
ab40: 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75  y(&zBuf[8], aJou
ab50: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
ab60: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ab70: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
ab80: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
ab90: 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69  >jfd, zBuf, 8+si
aba0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
abb0: 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20  ic), jrnlOff);. 
abc0: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
abd0: 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  c = !pPager->noS
abe0: 79 6e 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ync;.  return rc
abf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f  ;.}../*.** Add o
ac00: 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20  r remove a page 
ac10: 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
ac20: 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20   all pages that 
ac30: 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74  are in the.** st
ac40: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
ac50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72  .**.** The Pager
ac60: 20 6b 65 65 70 73 20 61 20 73 65 70 61 72 61 74   keeps a separat
ac70: 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
ac80: 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
ac90: 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61  ly in.** the sta
aca0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
acb0: 20 54 68 69 73 20 68 65 6c 70 73 20 74 68 65 20   This helps the 
acc0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
acd0: 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74  Commit().** rout
ace0: 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73  ine run MUCH fas
acf0: 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  ter for the comm
ad00: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
ad10: 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20  ere are many.** 
ad20: 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20  pages in memory 
ad30: 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61  but only a few a
ad40: 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
ad50: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  ent journal..*/.
ad60: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
ad70: 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
ad80: 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
ad90: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
ada0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
adb0: 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
adc0: 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
add0: 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
ade0: 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 20 29   assert( MEMDB )
adf0: 3b 0a 20 20 69 66 28 20 21 70 48 69 73 74 2d 3e  ;.  if( !pHist->
ae00: 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73  inStmt ){.    as
ae10: 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 50 72  sert( pHist->pPr
ae20: 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 48 69  evStmt==0 && pHi
ae30: 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30  st->pNextStmt==0
ae40: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
ae50: 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  er->pStmt ){.   
ae60: 20 20 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54     PGHDR_TO_HIST
ae70: 28 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 2c 20  (pPager->pStmt, 
ae80: 70 50 61 67 65 72 29 2d 3e 70 50 72 65 76 53 74  pPager)->pPrevSt
ae90: 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  mt = pPg;.    }.
aea0: 20 20 20 20 70 48 69 73 74 2d 3e 70 4e 65 78 74      pHist->pNext
aeb0: 53 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70  Stmt = pPager->p
aec0: 53 74 6d 74 3b 0a 20 20 20 20 70 50 61 67 65 72  Stmt;.    pPager
aed0: 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20  ->pStmt = pPg;. 
aee0: 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74     pHist->inStmt
aef0: 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
af00: 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
af10: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
af20: 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
af30: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a  number.  Return.
af40: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
af50: 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
af60: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
af70: 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
af80: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
af90: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
afa0: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
afb0: 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  *p;.  if( pPager
afc0: 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20 72 65 74  ->aHash==0 ) ret
afd0: 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50 61  urn 0;.  p = pPa
afe0: 67 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20  ger->aHash[pgno 
aff0: 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
b000: 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70  -1)];.  while( p
b010: 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e   && p->pgno!=pgn
b020: 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  o ){.    p = p->
b030: 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20  pNextHash;.  }. 
b040: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
b050: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
b060: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
b070: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
b080: 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
b090: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
b0a0: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
b0b0: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 66  veMode ){.    if
b0c0: 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
b0d0: 20 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65    osUnlock(pPage
b0e0: 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
b0f0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
b100: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20  bSize = -1;.    
b110: 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f    IOTRACE(("UNLO
b120: 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  CK %p\n", pPager
b130: 29 29 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  )).    }.    pPa
b140: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
b150: 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70  ER_UNLOCK;.    p
b160: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
b170: 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a  ntDone = 0;.  }.
b180: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  }../*.** Execute
b190: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61   a rollback if a
b1a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
b1b0: 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63  active and unloc
b1c0: 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  k the .** databa
b1d0: 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  se file. This is
b1e0: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
b1f0: 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64  pager has alread
b200: 79 20 65 6e 74 65 72 65 64 0a 2a 2a 20 74 68 65  y entered.** the
b210: 20 65 72 72 6f 72 2d 73 74 61 74 65 2e 0a 2a 2f   error-state..*/
b220: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
b230: 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
b240: 61 63 6b 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ack(Pager *p){. 
b250: 20 69 66 28 20 70 2d 3e 65 72 72 43 6f 64 65 20   if( p->errCode 
b260: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
b270: 72 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41  rt( p->state>=PA
b280: 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20  GER_RESERVED || 
b290: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  p->journalOpen==
b2a0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 74  0 );.  if( p->st
b2b0: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
b2c0: 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  VED ){.    sqlit
b2d0: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
b2e0: 70 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f  p);.  }.  pager_
b2f0: 75 6e 6c 6f 63 6b 28 70 29 3b 0a 20 20 61 73 73  unlock(p);.  ass
b300: 65 72 74 28 20 70 2d 3e 65 72 72 43 6f 64 65 20  ert( p->errCode 
b310: 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  || !p->journalOp
b320: 65 6e 20 7c 7c 20 28 70 2d 3e 65 78 63 6c 75 73  en || (p->exclus
b330: 69 76 65 4d 6f 64 65 26 26 21 70 2d 3e 6a 6f 75  iveMode&&!p->jou
b340: 72 6e 61 6c 4f 66 66 29 20 29 3b 0a 20 20 61 73  rnalOff) );.  as
b350: 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f 64 65  sert( p->errCode
b360: 20 7c 7c 20 21 70 2d 3e 73 74 6d 74 4f 70 65 6e   || !p->stmtOpen
b370: 20 7c 7c 20 70 2d 3e 65 78 63 6c 75 73 69 76 65   || p->exclusive
b380: 4d 6f 64 65 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Mode );.}.../*.*
b390: 2a 20 43 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d  * Clear the in-m
b3a0: 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54 68  emory cache.  Th
b3b0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65  is routine.** se
b3c0: 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
b3d0: 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74  the pager back t
b3e0: 6f 20 77 68 61 74 20 69 74 20 77 61 73 20 77 68  o what it was wh
b3f0: 65 6e 20 69 74 20 77 61 73 20 66 69 72 73 74 0a  en it was first.
b400: 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20  ** opened.  Any 
b410: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
b420: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
b430: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
b440: 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20   attempts.** to 
b450: 61 63 63 65 73 73 20 74 68 6f 73 65 20 70 61 67  access those pag
b460: 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  es will likely r
b470: 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
b480: 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ump..*/.static v
b490: 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
b4a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
b4b0: 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
b4c0: 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 50 61 67  Next;.  if( pPag
b4d0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65  er->errCode ) re
b4e0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 50 67 3d  turn;.  for(pPg=
b4f0: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
b500: 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20  g; pPg=pNext){. 
b510: 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 46     IOTRACE(("PGF
b520: 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  REE %p %d\n", pP
b530: 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
b540: 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  );.    PAGER_INC
b550: 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
b560: 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20  pgfree_count);. 
b570: 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
b580: 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 6c 72  pNextAll;.    lr
b590: 75 4c 69 73 74 52 65 6d 6f 76 65 28 70 50 67 29  uListRemove(pPg)
b5a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
b5b0: 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 61  ee(pPg);.  }.  a
b5c0: 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72  ssert(pPager->lr
b5d0: 75 2e 70 46 69 72 73 74 3d 3d 30 29 3b 0a 20 20  u.pFirst==0);.  
b5e0: 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c  assert(pPager->l
b5f0: 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  ru.pFirstSynced=
b600: 3d 30 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  =0);.  assert(pP
b610: 61 67 65 72 2d 3e 6c 72 75 2e 70 4c 61 73 74 3d  ager->lru.pLast=
b620: 3d 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  =0);.  pPager->p
b630: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  Stmt = 0;.  pPag
b640: 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20  er->pAll = 0;.  
b650: 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20  pPager->nHash = 
b660: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  0;.  sqlite3_fre
b670: 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  e(pPager->aHash)
b680: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ;.  pPager->nPag
b690: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
b6a0: 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20 20 70 50  >aHash = 0;.  pP
b6b0: 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a  ager->nRef = 0;.
b6c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
b6d0: 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
b6e0: 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20 74 72 61  nsaction.  A tra
b6f0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
b700: 64 20 62 79 20 65 69 74 68 65 72 0a 2a 2a 20 61  d by either.** a
b710: 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
b720: 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LBACK..**.** Whe
b730: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
b740: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
b750: 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72  ger has the jour
b760: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e  nal file open an
b770: 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20  d.** a RESERVED 
b780: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
b790: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
b7a0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
b7b0: 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a   will release.**
b7c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
b7d0: 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  ck and acquires 
b7e0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e  a SHARED lock in
b7f0: 20 69 74 73 20 70 6c 61 63 65 20 69 66 20 74 68   its place if th
b800: 61 74 20 69 73 0a 2a 2a 20 74 68 65 20 61 70 70  at is.** the app
b810: 72 6f 70 72 69 61 74 65 20 74 68 69 6e 67 20 74  ropriate thing t
b820: 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c  o do.  Release l
b830: 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20 69 73 20  ocks usually is 
b840: 61 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20  appropriate,.** 
b850: 75 6e 6c 65 73 73 20 77 65 20 61 72 65 20 69 6e  unless we are in
b860: 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
b870: 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73  s mode or unless
b880: 20 74 68 69 73 20 69 73 20 61 20 0a 2a 2a 20 43   this is a .** C
b890: 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47 49 4e 20  OMMIT AND BEGIN 
b8a0: 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20  or ROLLBACK AND 
b8b0: 42 45 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e  BEGIN operation.
b8c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
b8d0: 61 6c 20 66 69 6c 65 20 69 73 20 65 69 74 68 65  al file is eithe
b8e0: 72 20 64 65 6c 65 74 65 64 20 6f 72 20 74 72 75  r deleted or tru
b8f0: 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f  ncated..**.** TO
b900: 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65  DO: Consider kee
b910: 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ping the journal
b920: 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74   file open for t
b930: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
b940: 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68  es..** This migh
b950: 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d  t give a perform
b960: 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74  ance improvement
b970: 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72   on windows wher
b980: 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66  e opening.** a f
b990: 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73  ile is an expens
b9a0: 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ive operation..*
b9b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
b9c0: 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
b9d0: 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
b9e0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
b9f0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ba00: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32  TE_OK;.  int rc2
ba10: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
ba20: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
ba30: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
ba40: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
ba50: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
ba60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
ba70: 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
ba80: 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65  StmtCommit(pPage
ba90: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
baa0: 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20 21 70  ->stmtOpen && !p
bab0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
bac0: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Mode ){.    sqli
bad0: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
bae0: 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50  r->stfd);.    pP
baf0: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
bb00: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
bb10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
bb20: 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  n ){.    if( pPa
bb30: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
bb40: 64 65 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  de .          &&
bb50: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
bb60: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
bb70: 3e 6a 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49 54  >jfd, 0))==SQLIT
bb80: 45 5f 4f 4b 20 29 7b 3b 0a 20 20 20 20 20 20 70  E_OK ){;.      p
bb90: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
bba0: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
bbb0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
bbc0: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ted = 0;.    }el
bbd0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
bbe0: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
bbf0: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61  >jfd);.      pPa
bc00: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
bc10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
bc20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
bc30: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
bc40: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
bc50: 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
bc60: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
bc70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
bc80: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
bc90: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
bca0: 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  rnal );.    pPag
bcb0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
bcc0: 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d   0;.    for(pPg=
bcd0: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
bce0: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
bcf0: 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67  tAll){.      pPg
bd00: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
bd10: 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
bd20: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
bd30: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
bd40: 20 20 20 20 20 20 70 50 67 2d 3e 61 6c 77 61 79        pPg->alway
bd50: 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 23  sRollback = 0;.#
bd60: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
bd70: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70  CK_PAGES.      p
bd80: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
bd90: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
bda0: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  g);.#endif.    }
bdb0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
bdc0: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  rty = 0;.    pPa
bdd0: 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
bde0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
bdf0: 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  >nRec = 0;.  }el
be00: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
be10: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
be20: 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  al==0 );.    ass
be30: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72  ert( pPager->dir
be40: 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50  tyCache==0 || pP
be50: 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
be60: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ==0 );.  }..  if
be70: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
be80: 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
be90: 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70  rc2 = osUnlock(p
bea0: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
beb0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
bec0: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
bed0: 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c  ER_SHARED;.  }el
bee0: 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  se if( pPager->s
bef0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
bf00: 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ED ){.    pPager
bf10: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
bf20: 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20  EXCLUSIVE;.  }. 
bf30: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
bf40: 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ize = 0;.  pPage
bf50: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
bf60: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
bf70: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 6c 72 75 4c  Sync = 0;.  lruL
bf80: 69 73 74 53 65 74 46 69 72 73 74 53 79 6e 63 65  istSetFirstSynce
bf90: 64 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  d(pPager);.  pPa
bfa0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
bfb0: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  ;..  return (rc=
bfc0: 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72  =SQLITE_OK?rc2:r
bfd0: 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  c);.}../*.** Com
bfe0: 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  pute and return 
bff0: 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74  a checksum for t
c000: 68 65 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  he page of data.
c010: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
c020: 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73  ot a real checks
c030: 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c  um.  It is reall
c040: 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
c050: 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
c060: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61   initial value a
c070: 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  nd the page numb
c080: 65 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65  er.  We experime
c090: 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63  nted with.** a c
c0a0: 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65  hecksum of the e
c0b0: 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75 74 20  ntire data, but 
c0c0: 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74  that was found t
c0d0: 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a  o be too slow..*
c0e0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
c0f0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
c100: 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  s stored at the 
c110: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
c120: 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65  a and.** the che
c130: 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20  cksum is stored 
c140: 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69  at the end.  Thi
c150: 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  s is important. 
c160: 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63   If journal.** c
c170: 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
c180: 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
c190: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
c1a0: 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69  t likely scenari
c1b0: 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65  o.** is that one
c1c0: 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
c1d0: 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
c1e0: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
c1f0: 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20    It is.** much 
c200: 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
c210: 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
c220: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
c230: 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
c240: 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
c250: 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
c260: 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
c270: 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
c280: 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
c290: 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
c2a0: 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
c2b0: 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
c2c0: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  rruption..**.** 
c2d0: 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65  FIX ME:  Conside
c2e0: 72 20 61 64 64 69 6e 67 20 65 76 65 72 79 20 32  r adding every 2
c2f0: 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74  00th (or so) byt
c300: 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f  e of the data to
c310: 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d   the.** checksum
c320: 2e 20 20 54 68 61 74 20 77 61 79 20 69 66 20 61  .  That way if a
c330: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61   single page spa
c340: 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73  ns 3 or more dis
c350: 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a  k sectors and.**
c360: 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65   only the middle
c370: 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75   sector is corru
c380: 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c  pt, we will stil
c390: 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61  l have a reasona
c3a0: 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66  ble.** chance of
c3b0: 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65   failing the che
c3c0: 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64  cksum and thus d
c3d0: 65 74 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f  etecting the pro
c3e0: 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  blem..*/.static 
c3f0: 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  u32 pager_cksum(
c400: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
c410: 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b  onst u8 *aData){
c420: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70  .  u32 cksum = p
c430: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
c440: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67  ;.  int i = pPag
c450: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30  er->pageSize-200
c460: 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  ;.  while( i>0 )
c470: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
c480: 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
c490: 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
c4a0: 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
c4b0: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
c4c0: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76  tion */.static v
c4d0: 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67  oid makeClean(Pg
c4e0: 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65  Hdr*);../*.** Re
c4f0: 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
c500: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
c510: 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e  l file opened on
c520: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
c530: 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61  .** jfd.  Playba
c540: 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65  ck this one page
c550: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b  ..**.** If useCk
c560: 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  sum==0 it means 
c570: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  this journal doe
c580: 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73  s not use checks
c590: 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a  ums.  Checksums.
c5a0: 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ** are not used 
c5b0: 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  in statement jou
c5c0: 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73 74  rnals because st
c5d0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
c5e0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20   do not.** need 
c5f0: 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65 72  to survive power
c600: 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74   failures..*/.st
c610: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
c620: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
c630: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
c640: 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  r, .  sqlite3_fi
c650: 6c 65 20 2a 6a 66 64 2c 0a 20 20 69 36 34 20 6f  le *jfd,.  i64 o
c660: 66 66 73 65 74 2c 0a 20 20 69 6e 74 20 75 73 65  ffset,.  int use
c670: 43 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72  Cksum.){.  int r
c680: 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
c690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6a0: 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
c6b0: 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  g page in the ca
c6c0: 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  che */.  Pgno pg
c6d0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
c6e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
c6f0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70  ge number of a p
c700: 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  age in journal *
c710: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20  /.  u32 cksum;  
c720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c730: 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73    /* Checksum us
c740: 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68  ed for sanity ch
c750: 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a  ecking */.  u8 *
c760: 61 44 61 74 61 20 3d 20 28 75 38 20 2a 29 70 50  aData = (u8 *)pP
c770: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
c780: 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
c790: 67 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f  ge for a page */
c7a0: 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20  ..  /* useCksum 
c7b0: 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66  should be true f
c7c0: 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  or the main jour
c7d0: 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f  nal and false fo
c7e0: 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  r.  ** statement
c7f0: 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69   journals.  Veri
c800: 66 79 20 74 68 61 74 20 74 68 69 73 20 69 73 20  fy that this is 
c810: 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a  always the case.
c820: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a    */.  assert( j
c830: 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20  fd == (useCksum 
c840: 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20  ? pPager->jfd : 
c850: 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b  pPager->stfd) );
c860: 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
c870: 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64   );..  rc = read
c880: 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73  32bits(jfd, offs
c890: 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  et, &pgno);.  if
c8a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c8b0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
c8c0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
c8d0: 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50  d(jfd, aData, pP
c8e0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
c8f0: 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 69 66 28  offset+4);.  if(
c900: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c910: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50   return rc;.  pP
c920: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
c930: 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
c940: 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20  Size + 4;..  /* 
c950: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
c960: 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  on the page.  Th
c970: 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72  is is more impor
c980: 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67  tant that I orig
c990: 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75  inally.  ** thou
c9a0: 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72  ght.  If a power
c9b0: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
c9c0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
c9d0: 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  l is being writt
c9e0: 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c  en,.  ** it coul
c9f0: 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20  d cause invalid 
ca00: 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74  data to be writt
ca10: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
ca20: 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  nal.  We need to
ca30: 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69  .  ** detect thi
ca40: 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28  s invalid data (
ca50: 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62  with high probab
ca60: 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72  ility) and ignor
ca70: 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  e it..  */.  if(
ca80: 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
ca90: 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
caa0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
cab0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
cac0: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
cad0: 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67  o>(unsigned)pPag
cae0: 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
caf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cb00: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73  OK;.  }.  if( us
cb10: 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63  eCksum ){.    rc
cb20: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
cb30: 64 2c 20 6f 66 66 73 65 74 2b 70 50 61 67 65 72  d, offset+pPager
cb40: 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63  ->pageSize+4, &c
cb50: 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
cb60: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
cb70: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
cb80: 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
cb90: 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  if( pager_cksum(
cba0: 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d  pPager, aData)!=
cbb0: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
cbc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
cbd0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
cbe0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
cbf0: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
cc00: 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  ERVED || pPager-
cc10: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
cc20: 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a  CLUSIVE );..  /*
cc30: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
cc40: 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61   in RESERVED sta
cc50: 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
cc60: 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
cc70: 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
cc80: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
cc90: 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
cca0: 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
ccb0: 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
ccc0: 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
ccd0: 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
cce0: 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
ccf0: 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
cd00: 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
cd10: 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  An exception to 
cd20: 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20  the above rule: 
cd30: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
cd40: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
cd50: 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61  de.  ** and a pa
cd60: 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69  ge is moved duri
cd70: 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ng an incrementa
cd80: 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68  l vacuum then th
cd90: 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20  e page may.  ** 
cda0: 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61  not be in the pa
cdb0: 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72  ger cache. Later
cdc0: 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  : if a malloc() 
cdd0: 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  or IO error occu
cde0: 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61  rs.  ** during a
cdf0: 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c   Movepage() call
ce00: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
ce10: 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68  may not be in th
ce20: 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74  e cache.  ** eit
ce30: 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64  her. So the cond
ce40: 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
ce50: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72  in the above par
ce60: 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20  agraph is not.  
ce70: 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e  ** assert()able.
ce80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e  .  **.  ** If in
ce90: 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65   EXCLUSIVE state
cea0: 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65  , then we update
ceb0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
cec0: 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20   if it exists.  
ced0: 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20  ** and the main 
cee0: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
cef0: 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f  s then marked no
cf00: 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20  t dirty..  **.  
cf10: 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a  ** Ticket #1171:
cf20: 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
cf30: 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
cf40: 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65  ntain page conte
cf50: 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  nt that is.  ** 
cf60: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
cf70: 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
cf80: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
cf90: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
cfa0: 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72  .  ** This occur
cfb0: 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73  s when a page is
cfc0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
cfd0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  o the start of a
cfe0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
cff0: 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61  then changed aga
d000: 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  in within the st
d010: 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72  atement.  When r
d020: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68  olling back such
d030: 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e   a.  ** statemen
d040: 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72  t we must not wr
d050: 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ite to the origi
d060: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c  nal database unl
d070: 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a  ess we know.  **
d080: 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61   for certain tha
d090: 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  t original page 
d0a0: 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e  contents are syn
d0b0: 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ced into the mai
d0c0: 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
d0d0: 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
d0e0: 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73  ise, a power los
d0f0: 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f  s might leave mo
d100: 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74  dified data in t
d110: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
d120: 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e   file without an
d130: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f   entry in the ro
d140: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74  llback journal t
d150: 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73  hat can.  ** res
d160: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
d170: 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
d180: 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e  l form.  Two con
d190: 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a  ditions must be.
d1a0: 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20    ** met before 
d1b0: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
d1c0: 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28  atabase files. (
d1d0: 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  1) the database 
d1e0: 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63  must be.  ** loc
d1f0: 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f  ked.  (2) we kno
d200: 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  w that the origi
d210: 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
d220: 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64   is fully synced
d230: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69  .  ** in the mai
d240: 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72  n journal either
d250: 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
d260: 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
d270: 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74  e or else.  ** t
d280: 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  he page is marke
d290: 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30  d as needSync==0
d2a0: 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
d2b0: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
d2c0: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 50 41 47  er, pgno);.  PAG
d2d0: 45 52 54 52 41 43 45 34 28 22 50 4c 41 59 42 41  ERTRACE4("PLAYBA
d2e0: 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CK %d page %d ha
d2f0: 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
d300: 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
d310: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
d320: 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
d330: 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
d340: 7a 65 2c 20 61 44 61 74 61 29 29 3b 0a 20 20 69  ze, aData));.  i
d350: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
d360: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
d370: 45 20 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20  E && (pPg==0 || 
d380: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
d390: 29 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 66  ) ){.    i64 off
d3a0: 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
d3b0: 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
d3c0: 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Size;.    rc = s
d3d0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
d3e0: 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c  ager->fd, aData,
d3f0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
d400: 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  e, offset);.    
d410: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  if( pPg ){.     
d420: 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
d430: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
d440: 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
d450: 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
d460: 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
d470: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
d480: 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
d490: 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
d4a0: 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
d4b0: 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
d4c0: 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
d4d0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
d4e0: 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
d4f0: 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
d500: 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
d510: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
d520: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
d530: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
d540: 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
d550: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
d560: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
d570: 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
d580: 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
d590: 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
d5a0: 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  /* assert( pPg->
d5b0: 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e  nRef==0 || pPg->
d5c0: 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20  pgno==1 ); */.  
d5d0: 20 20 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f    pData = PGHDR_
d5e0: 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
d5f0: 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20    memcpy(pData, 
d600: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
d610: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
d620: 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69  ( pPager->xReini
d630: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ter ){.      pPa
d640: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
d650: 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  Pg, pPager->page
d660: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  Size);.    }.#if
d670: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
d680: 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
d690: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
d6a0: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
d6b0: 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66  #endif.    /* If
d6c0: 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31   this was page 1
d6d0: 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74  , then restore t
d6e0: 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
d6f0: 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20  r.dbFileVers..  
d700: 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66    ** Do this bef
d710: 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67  ore any decoding
d720: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
d730: 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65  o==1 ){.      me
d740: 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
d750: 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a  FileVers, &((u8*
d760: 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65  )pData)[24],size
d770: 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
d780: 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a  eVers));.    }..
d790: 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68      /* Decode th
d7a0: 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61 64  e page just read
d7b0: 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20   from disk */.  
d7c0: 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
d7d0: 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
d7e0: 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74  o, 3);.  }.  ret
d7f0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
d800: 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
d810: 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
d820: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
d830: 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
d840: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
d850: 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
d860: 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
d870: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
d880: 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
d890: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
d8a0: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
d8b0: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
d8c0: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
d8d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d8e0: 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
d8f0: 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
d900: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
d910: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
d920: 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61  s the names of a
d930: 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ll child journal
d940: 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66  s..** To tell if
d950: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
d960: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
d970: 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20  , check to each 
d980: 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72  of the.** childr
d990: 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c  en.  If all chil
d9a0: 64 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20  dren are either 
d9b0: 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f  missing or do no
d9c0: 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20  t refer to.** a 
d9d0: 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72  different master
d9e0: 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74   journal, then t
d9f0: 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  his master journ
da00: 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  al can be delete
da10: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
da20: 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
da30: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
da40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
da50: 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ter){.  sqlite3_
da60: 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
da70: 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
da80: 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72  rc;.  int master
da90: 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c  _open = 0;.  sql
daa0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
dab0: 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er;.  sqlite3_fi
dac0: 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20 20  le *pJournal;.  
dad0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75  char *zMasterJou
dae0: 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  rnal = 0; /* Con
daf0: 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20  tents of master 
db00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
db10: 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75    i64 nMasterJou
db20: 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53  rnal;       /* S
db30: 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ize of master jo
db40: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20  urnal file */.. 
db50: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
db60: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
db70: 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
db80: 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  case some other 
db90: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20  process.  ** is 
dba0: 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75  running this rou
dbb0: 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74  tine also. Not t
dbc0: 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f  hat it makes too
dbd0: 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63 65   much difference
dbe0: 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72  ..  */.  pMaster
dbf0: 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
dc00: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
dc10: 63 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  c(pVfs->szOsFile
dc20: 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61   * 2);.  pJourna
dc30: 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  l = (sqlite3_fil
dc40: 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73  e *)(((u8 *)pMas
dc50: 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f  ter) + pVfs->szO
dc60: 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  sFile);.  if( !p
dc70: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63  Master ){.    rc
dc80: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
dc90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
dca0: 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
dcb0: 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
dcc0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
dcd0: 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  ER_JOURNAL);.   
dce0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
dcf0: 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  pen(pVfs, zMaste
dd00: 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67  r, pMaster, flag
dd10: 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  s, 0);.  }.  if(
dd20: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
dd30: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
dd40: 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70  out;.  master_op
dd50: 65 6e 20 3d 20 31 3b 0a 0a 20 20 72 63 20 3d 20  en = 1;..  rc = 
dd60: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
dd70: 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73  e(pMaster, &nMas
dd80: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
dd90: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
dda0: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
ddb0: 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d  r_out;..  if( nM
ddc0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29  asterJournal>0 )
ddd0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75  {.    char *zJou
dde0: 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a  rnal;.    char *
ddf0: 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a  zMasterPtr = 0;.
de00: 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  .    /* Load the
de10: 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
de20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
de30: 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
de40: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69  from.    ** sqli
de50: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  te3_malloc() and
de60: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
de70: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a  MasterJournal. .
de80: 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74      */.    zMast
de90: 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61  erJournal = (cha
dea0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
deb0: 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  oc(nMasterJourna
dec0: 6c 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61  l);.    if( !zMa
ded0: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
dee0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
def0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
df00: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
df10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
df20: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
df30: 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  Master, zMasterJ
df40: 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a  ournal, nMasterJ
df50: 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
df60: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
df70: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
df80: 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f  er_out;..    zJo
df90: 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
dfa0: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c  ournal;.    whil
dfb0: 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61  e( (zJournal-zMa
dfc0: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61  sterJournal)<nMa
dfd0: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
dfe0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
dff0: 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
e000: 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
e010: 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 20 29  ACCESS_EXISTS) )
e020: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  {.        /* One
e030: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
e040: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
e050: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e060: 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
e070: 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
e080: 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
e090: 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
e0a0: 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
e0b0: 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74        ** so, ret
e0c0: 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65  urn without dele
e0d0: 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ting the master 
e0e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
e0f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
e100: 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20   int c;.        
e110: 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
e120: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
e130: 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
e140: 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  IN_JOURNAL);.   
e150: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e160: 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a  3OsOpen(pVfs, zJ
e170: 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c  ournal, pJournal
e180: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  , flags, 0);.   
e190: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
e1a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
e1b0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
e1c0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
e1d0: 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  }..        rc = 
e1e0: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
e1f0: 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61  l(pJournal, &zMa
e200: 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
e210: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
e220: 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  (pJournal);.    
e230: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e240: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
e250: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
e260: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
e270: 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d  ..        c = zM
e280: 61 73 74 65 72 50 74 72 21 3d 30 20 26 26 20 73  asterPtr!=0 && s
e290: 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
e2a0: 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
e2b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
e2c0: 72 65 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b  ree(zMasterPtr);
e2d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29  .        if( c )
e2e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
e2f0: 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
e300: 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
e310: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
e320: 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
e330: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
e340: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
e350: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
e360: 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72  zJournal += (str
e370: 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  len(zJournal)+1)
e380: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
e390: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
e3a0: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
e3b0: 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
e3c0: 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a  ter_out:.  if( z
e3d0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
e3e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
e3f0: 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
e400: 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d  );.  }  .  if( m
e410: 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20  aster_open ){.  
e420: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
e430: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (pMaster);.  }. 
e440: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
e450: 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
e460: 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20   rc;.}...static 
e470: 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63  void pager_trunc
e480: 61 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20  ate_cache(Pager 
e490: 2a 70 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a  *pPager);../*.**
e4a0: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61   Truncate the ma
e4b0: 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67  in file of the g
e4c0: 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68  iven pager to th
e4d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
e4e0: 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 20  s.** indicated. 
e4f0: 41 6c 73 6f 20 74 72 75 6e 63 61 74 65 20 74 68  Also truncate th
e500: 65 20 63 61 63 68 65 64 20 72 65 70 72 65 73 65  e cached represe
e510: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  ntation of the f
e520: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
e530: 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
e540: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
e550: 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69   int nPage){.  i
e560: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e570: 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
e580: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
e590: 43 4c 55 53 49 56 45 20 26 26 20 70 50 61 67 65  CLUSIVE && pPage
e5a0: 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
e5b0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
e5c0: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
e5d0: 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
e5e0: 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29  ->pageSize*(i64)
e5f0: 6e 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66  nPage);.  }.  if
e600: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e610: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
e620: 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
e630: 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
e640: 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  e_cache(pPager);
e650: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
e660: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
e670: 68 65 20 73 65 63 74 6f 72 53 69 7a 65 20 66 6f  he sectorSize fo
e680: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
e690: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  r..**.** The sec
e6a0: 74 6f 72 20 73 69 7a 65 20 69 73 20 74 68 65 20  tor size is the 
e6b0: 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 73 65  larger of the se
e6c0: 63 74 6f 72 20 73 69 7a 65 20 72 65 70 6f 72 74  ctor size report
e6d0: 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 33  ed.** by sqlite3
e6e0: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 61  OsSectorSize() a
e6f0: 6e 64 20 74 68 65 20 70 61 67 65 53 69 7a 65 2e  nd the pageSize.
e700: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e710: 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61  setSectorSize(Pa
e720: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
e730: 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66  assert(pPager->f
e740: 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61  d->pMethods||pPa
e750: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
e760: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
e770: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f  empFile ){.    /
e780: 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f  * Sector size do
e790: 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72  esn't matter for
e7a0: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
e7b0: 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65  . Also, the file
e7c0: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
e7d0: 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
e7e0: 20 79 65 74 2c 20 69 6e 20 77 68 63 69 68 20 63   yet, in whcih c
e7f0: 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72  ase the OsSector
e800: 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61  Size().    ** ca
e810: 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74  ll will segfault
e820: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
e830: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
e840: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
e850: 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
e860: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
e870: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c  ger->sectorSize<
e880: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
e890: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
e8a0: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 70 50 61  sectorSize = pPa
e8b0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
e8c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79   }.}../*.** Play
e8d0: 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
e8e0: 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
e8f0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
e900: 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
e910: 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
e920: 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
e930: 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
e940: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
e950: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
e960: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
e970: 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
e980: 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
e990: 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
e9a0: 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
e9b0: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
e9c0: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
e9d0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
e9e0: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
e9f0: 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
ea00: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
ea10: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
ea20: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
ea30: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
ea40: 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
ea50: 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
ea60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
ea70: 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
ea80: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
ea90: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
eaa0: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
eab0: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
eac0: 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
ead0: 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
eae0: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
eaf0: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
eb00: 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
eb10: 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
eb20: 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
eb30: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
eb40: 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
eb50: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
eb60: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
eb70: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
eb80: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ter journal.**  
eb90: 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20       name.  The 
eba0: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
ebb0: 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74  o (indicate that
ebc0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
ebd0: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
ebe0: 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20  rnal.).**  (6)  
ebf0: 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d  N bytes of the m
ec00: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
ec10: 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69  me.  The name wi
ec20: 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  ll be nul-termin
ec30: 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e  ated.**       an
ec40: 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  d might be short
ec50: 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75  er than the valu
ec60: 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e  e read from (5).
ec70: 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62    If the first b
ec80: 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  yte.**       of 
ec90: 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30  the name is \000
eca0: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
ecb0: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
ecc0: 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a  .  The master.**
ecd0: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e         journal n
ece0: 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ame is stored in
ecf0: 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20   UTF-8..**  (7) 
ed00: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
ed10: 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
ed20: 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
ed30: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
ed40: 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
ed50: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
ed60: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
ed70: 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
ed80: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
ed90: 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
eda0: 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
edb0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
edc0: 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
edd0: 65 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20  e first 6 items 
ede0: 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
edf0: 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
ee00: 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
ee10: 63 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74  ce of the 7th it
ee20: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
ee30: 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
ee40: 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
ee50: 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
ee60: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
ee70: 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
ee80: 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
ee90: 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
eea0: 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
eeb0: 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
eec0: 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
eed0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
eee0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
eef0: 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
ef00: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
ef10: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
ef20: 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
ef30: 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
ef40: 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
ef50: 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
ef60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
ef70: 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
ef80: 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
ef90: 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
efa0: 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
efb0: 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
efc0: 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
efd0: 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
efe0: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
eff0: 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
f000: 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
f010: 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
f020: 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
f030: 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
f040: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
f050: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
f060: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
f070: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
f080: 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
f090: 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
f0a0: 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
f0b0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
f0c0: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
f0d0: 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
f0e0: 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
f0f0: 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
f100: 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
f110: 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
f120: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
f130: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
f140: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
f150: 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
f160: 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
f170: 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
f180: 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
f190: 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
f1a0: 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
f1b0: 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
f1c0: 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
f1d0: 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
f1e0: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
f1f0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
f200: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
f210: 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
f220: 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
f230: 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
f240: 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
f250: 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
f260: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f270: 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
f280: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
f290: 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
f2a0: 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
f2b0: 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
f2c0: 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
f2d0: 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
f2e0: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
f2f0: 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
f300: 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
f310: 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
f320: 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
f330: 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
f340: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
f350: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
f360: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
f370: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
f380: 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
f390: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
f3a0: 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
f3b0: 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3d0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
f3e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
f3f0: 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
f400: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
f410: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f420: 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
f430: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
f440: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
f450: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
f460: 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
f470: 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
f480: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
f490: 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
f4a0: 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
f4b0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
f4c0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
f4d0: 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
f4e0: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
f4f0: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
f500: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
f510: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
f520: 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20  le if any */..  
f530: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
f540: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
f550: 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
f560: 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
f570: 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
f580: 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
f590: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
f5a0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
f5b0: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
f5c0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
f5d0: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
f5e0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
f5f0: 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  E_OK || szJ==0 )
f600: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
f610: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
f620: 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
f630: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
f640: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
f650: 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
f660: 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
f670: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f680: 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
f690: 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
f6a0: 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
f6b0: 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
f6c0: 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
f6d0: 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
f6e0: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
f6f0: 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
f700: 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ack..  */.  rc =
f710: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
f720: 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
f730: 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73  &zMaster);.  ass
f740: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
f750: 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
f760: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20  !=SQLITE_OK .   
f770: 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26 26 20 21  || (zMaster && !
f780: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
f790: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
f7a0: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
f7b0: 53 54 53 29 29 20 0a 20 20 29 7b 0a 20 20 20 20  STS)) .  ){.    
f7c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
f7d0: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
f7e0: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
f7f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
f800: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
f810: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  ;.    goto end_p
f820: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
f830: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f840: 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  f = 0;..  /* Thi
f850: 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
f860: 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68  s either when th
f870: 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  e readJournalHdr
f880: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a  () call returns.
f890: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
f8a0: 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
f8b0: 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69  occurs. */.  whi
f8c0: 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a  le( 1 ){..    /*
f8d0: 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
f8e0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
f8f0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
f900: 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
f910: 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
f920: 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
f930: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
f940: 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
f950: 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
f960: 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
f970: 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
f980: 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
f990: 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
f9a0: 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
f9b0: 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
f9c0: 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
f9d0: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
f9e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
f9f0: 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
fa00: 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
fa10: 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
fa20: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
fa30: 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
fa40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
fa50: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
fa60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
fa70: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
fa80: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
fa90: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
faa0: 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
fab0: 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
fac0: 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
fad0: 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
fae0: 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
faf0: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
fb00: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
fb10: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
fb20: 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
fb30: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
fb40: 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
fb50: 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
fb60: 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
fb70: 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
fb80: 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
fb90: 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
fba0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
fbb0: 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
fbc0: 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
fbd0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
fbe0: 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
fbf0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
fc00: 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73  .      nRec = (s
fc10: 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
fc20: 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
fc30: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
fc40: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
fc50: 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61  * If nRec is 0 a
fc60: 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b  nd this rollback
fc70: 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63   is of a transac
fc80: 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20  tion created by 
fc90: 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63  this.    ** proc
fca0: 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20  ess and if this 
fcb0: 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61  is the final hea
fcc0: 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  der in the journ
fcd0: 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e  al, then it mean
fce0: 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68  s.    ** that th
fcf0: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a  is part of the j
fd00: 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
fd10: 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20   filled but has 
fd20: 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20  not yet been.   
fd30: 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69   ** synced to di
fd40: 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65  sk.  Compute the
fd50: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
fd60: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65   based on the re
fd70: 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73  maining.    ** s
fd80: 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ize of the file.
fd90: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
fda0: 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66  he third term of
fdb0: 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64   the test was ad
fdc0: 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65  ded to fix ticke
fdd0: 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2f 0a  t #2565..    */.
fde0: 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20      if( nRec==0 
fdf0: 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20  && !isHot &&.   
fe00: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
fe10: 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
fe20: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
fe30: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
fe40: 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ff ){.      nRec
fe50: 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72   = (szJ - pPager
fe60: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
fe70: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
fe80: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ager);.    }..  
fe90: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
fea0: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
feb0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
fec0: 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
fed0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
fee0: 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
fef0: 6f 20 69 74 27 73 20 6f 72 69 67 69 6e 61 6c 20  o it's original 
ff00: 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
ff10: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
ff20: 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
ff30: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
ff40: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
ff50: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
ff60: 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20  ger, mxPg);.    
ff70: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ff80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
ff90: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
ffa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ffb0: 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
ffc0: 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
ffd0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
ffe0: 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
fff0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
10000 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
10010 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29  =0; i<nRec; i++)
10020 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
10030 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
10040 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
10050 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
10060 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29  ->journalOff, 1)
10070 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
10080 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10090 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
100a0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
100b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
100c0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
100d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
100e0 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
100f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
10100 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10110 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
10120 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
10130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10140 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
10150 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
10160 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
10170 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
10180 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
10190 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
101a0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
101b0 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74  .  }.  if( zMast
101c0 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  er ){.    /* If 
101d0 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
101e0 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
101f0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
10200 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c   return success,
10210 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
10220 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
10230 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
10240 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
10250 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
10260 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10270 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
10280 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
10290 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Master);.    }. 
102a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
102b0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20  zMaster);.  }.. 
102c0 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65   /* The Pager.se
102d0 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
102e0 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
102f0 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f  updated while ro
10300 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20  lling.  ** back 
10310 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65  a journal create
10320 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77  d by a process w
10330 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
10340 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a  sector size.  **
10350 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
10360 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
10370 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
10380 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rocess..  */.  s
10390 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
103a0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
103b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  c;.}../*.** Play
103c0 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
103d0 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
103e0 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61  * This is simila
103f0 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  r to playing bac
10400 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
10410 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69  n journal but wi
10420 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72  th.** a few extr
10430 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  a twists..**.** 
10440 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62     (1)  The numb
10450 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
10460 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10470 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
10480 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20  .**         the 
10490 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f  statement is sto
104a0 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73  red in pPager->s
104b0 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20  tmtSize, not in 
104c0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a  the.**         j
104d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65  ournal file itse
104e0 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  lf..**.**    (2)
104f0 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f    In addition to
10500 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
10510 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
10520 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20  nal, also.**    
10530 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c       playback al
10540 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 74  l pages of the t
10550 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
10560 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20  al beginning.** 
10570 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73 65          at offse
10580 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  t pPager->stmtJS
10590 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
105a0 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c  nt pager_stmt_pl
105b0 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
105c0 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a  ager){.  i64 szJ
105d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
105e0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
105f0 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f   full journal */
10600 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20  .  i64 hdrOff;. 
10610 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
10620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10630 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a  ber of Records *
10640 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10660 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
10670 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a    int rc;..  szJ
10680 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
10690 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e  alOff;.#ifndef N
106a0 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20 20 69  DEBUG .  {.    i
106b0 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72  64 os_szJ;.    r
106c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
106d0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
106e0 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20  d, &os_szJ);.   
106f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10700 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
10710 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a 3d      assert( szJ=
10720 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23  =os_szJ );.  }.#
10730 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20  endif..  /* Set 
10740 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65  hdrOff to be the
10750 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61 66 74   offset just aft
10760 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  er the end of th
10770 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a 20  e last journal. 
10780 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74 65 6e   ** page written
10790 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
107a0 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  t journal-header
107b0 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 6d   for this statem
107c0 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ent.  ** transac
107d0 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74 65 6e  tion was written
107e0 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20  , or the end of 
107f0 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a  the file if no j
10800 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64  ournal.  ** head
10810 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a  er was written..
10820 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20    */.  hdrOff = 
10830 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
10840 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ff;.  assert( pP
10850 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c  ager->fullSync |
10860 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69  | !hdrOff );.  i
10870 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20  f( !hdrOff ){.  
10880 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a    hdrOff = szJ;.
10890 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e    }.  .  /* Trun
108a0 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  cate the databas
108b0 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
108c0 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a  iginal size..  *
108d0 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74  /.  rc = pager_t
108e0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
108f0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
10900 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
10910 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
10920 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f  R_SHARED );..  /
10930 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
10940 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
10950 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  e in the stateme
10960 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  nt journal..  */
10970 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
10980 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20  r->stmtInUse && 
10990 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
109a0 70 65 6e 20 29 3b 0a 20 20 6e 52 65 63 20 3d 20  pen );.  nRec = 
109b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
109c0 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f  ;.  .  /* Copy o
109d0 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
109e0 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
109f0 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  nt journal and b
10a00 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ack into the.  *
10a10 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
10a20 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20    Note that the 
10a30 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
10a40 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d  l omits checksum
10a50 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68  s from.  ** each
10a60 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f   record since po
10a70 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f  wer-failure reco
10a80 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f  very is not impo
10a90 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65  rtant to stateme
10aa0 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73  nt.  ** journals
10ab0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
10ac0 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a  ; i<nRec; i++){.
10ad0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
10ae0 20 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61   i*(4+pPager->pa
10af0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20  geSize);.    rc 
10b00 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
10b10 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
10b20 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  , pPager->stfd, 
10b30 6f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20  offset, 0);.    
10b40 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
10b50 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
10b60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10b70 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
10b80 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
10b90 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f    /* Now roll so
10ba0 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20 66 72  me pages back fr
10bb0 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  om the transacti
10bc0 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65  on journal. Page
10bd0 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a  r.stmtJSize.  **
10be0 20 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66   was the size of
10bf0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10c00 65 20 77 68 65 6e 20 74 68 69 73 20 73 74 61 74  e when this stat
10c10 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65  ement was starte
10c20 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79  d, so.  ** every
10c30 74 68 69 6e 67 20 61 66 74 65 72 20 74 68 61 74  thing after that
10c40 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
10c50 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72  led back, either
10c60 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
10c70 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d  atabase, the mem
10c80 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f  ory cache, or bo
10c90 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  th..  **.  ** If
10ca0 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c   it is not zero,
10cb0 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74   then Pager.stmt
10cc0 48 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66  HdrOff is the of
10cd0 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
10ce0 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69  t.  ** of the fi
10cf0 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
10d00 65 72 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e  er written durin
10d10 67 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  g this statement
10d20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
10d30 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  */.  pPager->jou
10d40 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  rnalOff = pPager
10d50 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70  ->stmtJSize;.  p
10d60 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
10d70 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43   = pPager->stmtC
10d80 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70  ksum;.  while( p
10d90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10da0 66 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a 20 20  f < hdrOff ){.  
10db0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
10dc0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
10dd0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
10de0 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
10df0 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20  nalOff, 1);.    
10e00 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
10e10 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
10e20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10e30 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
10e40 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
10e50 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
10e60 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
10e70 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52  J ){.    u32 nJR
10e80 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ec;         /* N
10e90 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c  umber of Journal
10ea0 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   Records */.    
10eb0 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
10ec0 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
10ed0 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20  dr(pPager, szJ, 
10ee0 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b  &nJRec, &dummy);
10ef0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
10f00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10f10 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
10f20 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
10f30 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
10f40 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
10f50 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
10f60 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
10f70 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e   (szJ - pPager->
10f80 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70  journalOff) / (p
10f90 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
10fa0 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  8);.    }.    fo
10fb0 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d  r(i=nJRec-1; i>=
10fc0 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0 && pPager->jou
10fd0 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69  rnalOff < szJ; i
10fe0 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
10ff0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
11000 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
11010 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
11020 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
11030 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   1);.      asser
11040 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
11050 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NE );.      if( 
11060 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
11070 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
11080 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
11090 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
110a0 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
110b0 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62   .end_stmt_playb
110c0 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  ack:.  if( rc==S
110d0 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20  QLITE_OK) {.    
110e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
110f0 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a  ff = szJ;.    /*
11100 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
11110 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a  che(pPager); */.
11120 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11130 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
11140 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
11150 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
11160 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
11170 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64  allowed..*/.void
11180 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11190 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  Cachesize(Pager 
111a0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
111b0 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61  age){.  if( mxPa
111c0 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61  ge>10 ){.    pPa
111d0 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78  ger->mxPage = mx
111e0 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Page;.  }else{. 
111f0 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67     pPager->mxPag
11200 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e = 10;.  }.}../
11210 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
11220 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68  robustness of th
11230 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
11240 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
11250 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77  rashes.** or pow
11260 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63  er failures by c
11270 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
11280 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
11290 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  hen writing.** t
112a0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
112b0 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20  nal.  There are 
112c0 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a  three levels:.**
112d0 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20  .**    OFF      
112e0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
112f0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
11300 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
11310 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
11320 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
11330 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
11340 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
11350 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
11360 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
11370 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
11380 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
11390 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
113a0 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
113b0 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
113c0 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
113d0 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
113e0 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
113f0 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
11400 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
11410 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
11420 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
11430 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
11440 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
11450 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
11460 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
11470 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
11480 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
11490 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
114a0 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
114b0 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
114c0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
114d0 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
114e0 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
114f0 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
11500 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
11510 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
11520 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
11530 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
11540 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
11550 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
11560 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
11570 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
11580 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
11590 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
115a0 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
115b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
115c0 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
115d0 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
115e0 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
115f0 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
11600 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
11610 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
11620 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
11630 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
11640 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
11650 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
11660 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
11670 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
11680 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
11690 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
116a0 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
116b0 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
116c0 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
116d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
116e0 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
116f0 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
11700 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
11710 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  3..*/.#ifndef SQ
11720 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
11730 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c  PRAGMAS.void sql
11740 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65  ite3PagerSetSafe
11750 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70  tyLevel(Pager *p
11760 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c  Pager, int level
11770 2c 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63  , int full_fsync
11780 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ){.  pPager->noS
11790 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20  ync =  level==1 
117a0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
117b0 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ile;.  pPager->f
117c0 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d  ullSync = level=
117d0 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =3 && !pPager->t
117e0 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
117f0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20  r->sync_flags = 
11800 28 66 75 6c 6c 5f 66 73 79 6e 63 3f 53 51 4c 49  (full_fsync?SQLI
11810 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c  TE_SYNC_FULL:SQL
11820 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
11830 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
11840 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d  noSync ) pPager-
11850 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d  >needSync = 0;.}
11860 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
11870 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
11880 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
11890 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
118a0 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79  ever the library
118b0 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
118c0 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
118d0 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66   file.  This inf
118e0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
118f0 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
11900 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
11910 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53  y.  .*/.#ifdef S
11920 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
11930 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
11940 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
11950 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  f../*.** Open a 
11960 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
11970 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
11980 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
11990 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75   into *fd.  Retu
119a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
119b0 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a  success or some.
119c0 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  ** other error c
119d0 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20  ode if we fail. 
119e0 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
119f0 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
11a00 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 2a   the temporary.*
11a10 2a 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  * file when it i
11a20 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
11a30 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
11a40 30 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  0, then an appro
11a50 70 72 69 61 74 65 20 74 65 6d 70 6f 72 61 72 79  priate temporary
11a60 20 66 69 6c 65 6e 61 6d 65 20 69 73 0a 2a 2a 20   filename is.** 
11a70 67 65 6e 65 72 61 74 65 64 20 61 75 74 6f 6d 61  generated automa
11a80 74 69 63 61 6c 6c 79 20 61 6e 64 20 20 53 51 4c  tically and  SQL
11a90 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
11aa0 4e 41 4c 20 69 73 20 70 61 73 73 65 64 20 74 6f  NAL is passed to
11ab0 0a 2a 2a 20 74 68 65 20 4f 53 20 6c 61 79 65 72  .** the OS layer
11ac0 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 79 70   as the file typ
11ad0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  e..**.** If zFil
11ae0 65 6e 61 6d 65 20 69 73 20 6e 6f 74 20 30 2c 20  ename is not 0, 
11af0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
11b00 5f 44 42 20 69 73 20 70 61 73 73 65 64 20 61 73  _DB is passed as
11b10 20 74 68 65 20 66 69 6c 65 20 74 79 70 65 2e 0a   the file type..
11b20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
11b30 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65  lite3PagerOpente
11b40 6d 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  mp(.  sqlite3_vf
11b50 73 20 2a 70 56 66 73 2c 20 0a 20 20 73 71 6c 69  s *pVfs, .  sqli
11b60 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
11b70 20 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e   .  char *zFilen
11b80 61 6d 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ame.){.  int rc;
11b90 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28  .  int flags = (
11ba0 0a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  .     SQLITE_OPE
11bb0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
11bc0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
11bd0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
11be0 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54  _EXCLUSIVE|SQLIT
11bf0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
11c00 4c 4f 53 45 0a 20 20 29 3b 0a 0a 20 20 63 68 61  LOSE.  );..  cha
11c10 72 20 2a 7a 46 72 65 65 20 3d 20 30 3b 0a 20 20  r *zFree = 0;.  
11c20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
11c30 20 29 7b 0a 20 20 20 20 7a 46 72 65 65 20 3d 20   ){.    zFree = 
11c40 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
11c50 6d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 6d 78 50  malloc(pVfs->mxP
11c60 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  athname);.    if
11c70 28 20 21 7a 46 72 65 65 20 29 7b 0a 20 20 20 20  ( !zFree ){.    
11c80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11c90 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
11ca0 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 46 72   zFilename = zFr
11cb0 65 65 3b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d  ee;.    flags |=
11cc0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
11cd0 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 72 63 20  JOURNAL;.    rc 
11ce0 3d 20 73 71 6c 69 74 65 33 4f 73 47 65 74 54 65  = sqlite3OsGetTe
11cf0 6d 70 4e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  mpName(pVfs, zFi
11d00 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  lename);.    if(
11d10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11d20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
11d30 66 72 65 65 28 7a 46 72 65 65 29 3b 0a 20 20 20  free(zFree);.   
11d40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11d50 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
11d60 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
11d70 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20  _OPEN_TEMP_DB;. 
11d80 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
11d90 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
11da0 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b  _opentemp_count+
11db0 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20  +;  /* Used for 
11dc0 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
11dd0 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e  ysis only */.#en
11de0 64 69 66 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  dif..  rc = sqli
11df0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
11e00 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69 6c 65  zFilename, pFile
11e10 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61  , flags, 0);.  a
11e20 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
11e30 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 70  E_OK || pFile->p
11e40 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 73 71 6c  Methods );.  sql
11e50 69 74 65 33 5f 66 72 65 65 28 7a 46 72 65 65 29  ite3_free(zFree)
11e60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11e70 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
11e80 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20   new page cache 
11e90 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
11ea0 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  r to the page ca
11eb0 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  che in *ppPager.
11ec0 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20  .** The file to 
11ed0 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e  be cached need n
11ee0 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 66  ot exist.  The f
11ef0 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65  ile is not locke
11f00 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66  d until.** the f
11f10 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
11f20 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
11f30 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20  nd is only held 
11f40 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a  open until the.*
11f50 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72  * last page is r
11f60 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71  eleased using sq
11f70 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
11f80 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  )..**.** If zFil
11f90 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
11fa0 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
11fb0 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
11fc0 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
11fd0 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
11fe0 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
11ff0 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69  ed.  The file wi
12000 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  ll be deleted.**
12010 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
12020 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
12030 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
12040 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
12050 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f  :" then all info
12060 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
12070 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20  in cache..** It 
12080 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
12090 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20   to disk.  This 
120a0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
120b0 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69  mplement an.** i
120c0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
120d0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
120e0 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71  3PagerOpen(.  sq
120f0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
12100 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
12110 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65  rtual file syste
12120 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61  m to use */.  Pa
12130 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
12140 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
12150 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
12160 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
12170 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
12180 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
12190 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
121a0 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
121b0 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
121c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
121d0 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
121e0 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
121f0 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
12200 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
12210 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
12220 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
12230 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  file */.){.  u8 
12240 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a  *pPtr;.  Pager *
12250 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 6e  pPager = 0;.  in
12260 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12270 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
12280 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20   tempFile = 0;. 
12290 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a   int memDb = 0;.
122a0 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
122b0 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75   0;.  int useJou
122c0 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20  rnal = (flags & 
122d0 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
122e0 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f  AL)==0;.  int no
122f0 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67  Readlock = (flag
12300 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  s & PAGER_NO_REA
12310 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 69 6e 74  DLOCK)!=0;.  int
12320 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
12330 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
12340 6c 53 69 7a 65 28 70 56 66 73 29 3b 0a 20 20 69  lSize(pVfs);.  i
12350 6e 74 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20  nt nDefaultPage 
12360 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
12370 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 63 68  _PAGE_SIZE;.  ch
12380 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 3b 0a 20  ar *zPathname;. 
12390 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 3b 0a   int nPathname;.
123a0 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c  .  /* The defaul
123b0 74 20 72 65 74 75 72 6e 20 69 73 20 61 20 4e 55  t return is a NU
123c0 4c 4c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  LL pointer */.  
123d0 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20  *ppPager = 0;.. 
123e0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
123f0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 2a 2f  full pathname */
12400 0a 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73  .  zPathname = s
12410 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 56  qlite3_malloc(pV
12420 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
12430 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61  );.  if( zPathna
12440 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
12450 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
12460 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c  ;.  }.  if( zFil
12470 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
12480 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66  me[0] ){.#ifndef
12490 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
124a0 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74  ORYDB.    if( st
124b0 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22  rcmp(zFilename,"
124c0 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b  :memory:")==0 ){
124d0 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31  .      memDb = 1
124e0 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d  ;.      zPathnam
124f0 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65  e[0] = 0;.    }e
12500 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
12510 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12520 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
12530 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
12540 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, zPathname);. 
12550 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
12560 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12570 47 65 74 54 65 6d 70 4e 61 6d 65 28 70 56 66 73  GetTempName(pVfs
12580 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
12590 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
125a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
125b0 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
125c0 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
125d0 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 50 61 74 68   rc;.  }.  nPath
125e0 6e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 50  name = strlen(zP
125f0 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20  athname);..  /* 
12600 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
12610 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 73 74  for the pager st
12620 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 70 50 61  ructure */.  pPa
12630 67 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ger = sqlite3Mal
12640 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 73 69 7a  locZero(.    siz
12650 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 20  eof(*pPager) +  
12660 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
12670 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
12680 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
12690 7a 65 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  ze +           /
126a0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
126b0 6c 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 20  le structure */ 
126c0 0a 20 20 20 20 70 56 66 73 2d 3e 73 7a 4f 73 46  .    pVfs->szOsF
126d0 69 6c 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20  ile * 2 +       
126e0 20 2f 2a 20 54 68 65 20 64 62 20 61 6e 64 20 73   /* The db and s
126f0 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  tmt journal file
12700 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e  s */ .    nPathn
12710 61 6d 65 20 2a 20 33 20 2b 20 33 30 20 20 20 20  ame * 3 + 30    
12720 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
12730 6d 65 2c 20 7a 44 69 72 65 63 74 6f 72 79 2c 20  me, zDirectory, 
12740 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b  zJournal */.  );
12750 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 20 29  .  if( !pPager )
12760 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
12770 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ee(zPathname);. 
12780 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12790 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50  _NOMEM;.  }.  pP
127a0 74 72 20 3d 20 28 75 38 20 2a 29 26 70 50 61 67  tr = (u8 *)&pPag
127b0 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  er[1];.  pPager-
127c0 3e 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  >fd = (sqlite3_f
127d0 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d  ile*)&pPtr[pVfs-
127e0 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20 20  >szOsFile*0];.  
127f0 70 50 61 67 65 72 2d 3e 73 74 66 64 20 3d 20 28  pPager->stfd = (
12800 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70  sqlite3_file*)&p
12810 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69  Ptr[pVfs->szOsFi
12820 6c 65 2a 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  le*1];.  pPager-
12830 3e 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  >jfd = (sqlite3_
12840 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73  file*)&pPtr[pVfs
12850 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 5d 3b 0a 20  ->szOsFile*2];. 
12860 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
12870 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 74  me = (char*)&pPt
12880 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  r[pVfs->szOsFile
12890 2a 32 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  *2+journalFileSi
128a0 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  ze];.  pPager->z
128b0 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61  Directory = &pPa
128c0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e  ger->zFilename[n
128d0 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70  Pathname+1];.  p
128e0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
128f0 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  = &pPager->zDire
12900 63 74 6f 72 79 5b 6e 50 61 74 68 6e 61 6d 65 2b  ctory[nPathname+
12910 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 56  1];.  pPager->pV
12920 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 6d 65 6d  fs = pVfs;.  mem
12930 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
12940 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  ename, zPathname
12950 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  , nPathname+1);.
12960 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
12970 50 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a  Pathname);..  /*
12980 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
12990 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
129a0 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
129b0 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d  ilename[0] && !m
129c0 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 66 28 20  emDb ){.    if( 
129d0 6e 50 61 74 68 6e 61 6d 65 3e 28 70 56 66 73 2d  nPathname>(pVfs-
129e0 3e 6d 78 50 61 74 68 6e 61 6d 65 20 2d 20 73 69  >mxPathname - si
129f0 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c 22 29  zeof("-journal")
12a00 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
12a10 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
12a20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 2f 2a 2a 2a  .    }else{./***
12a30 20 20 46 49 58 4d 45 3a 20 20 4d 69 67 68 74 20    FIXME:  Might 
12a40 6e 65 65 64 20 74 6f 20 62 65 20 53 51 4c 49 54  need to be SQLIT
12a50 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 2e 20  E_OPEN_TEMP_DB. 
12a60 20 4e 65 65 64 20 74 6f 20 70 61 73 73 20 69 6e   Need to pass in
12a70 0a 2a 2a 2a 2a 20 61 20 66 6c 61 67 20 66 72 6f  .**** a flag fro
12a80 6d 20 68 69 67 68 65 72 20 75 70 2e 0a 2a 2a 2a  m higher up..***
12a90 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 66 6c  */.      int ofl
12aa0 61 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  ag = .          
12ab0 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52    (SQLITE_OPEN_R
12ac0 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
12ad0 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49  OPEN_CREATE|SQLI
12ae0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
12af0 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74  ;.      int fout
12b00 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
12b10 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
12b20 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  Vfs, pPager->zFi
12b30 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
12b40 66 64 2c 20 6f 66 6c 61 67 2c 20 26 66 6f 75 74  fd, oflag, &fout
12b50 29 3b 0a 20 20 20 20 20 20 72 65 61 64 4f 6e 6c  );.      readOnl
12b60 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45  y = (fout&SQLITE
12b70 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
12b80 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
12b90 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65  e file was succe
12ba0 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ssfully opened f
12bb0 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
12bc0 63 65 73 73 2c 0a 20 20 20 20 20 20 2a 2a 20 63  cess,.      ** c
12bd0 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20  hoose a default 
12be0 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73  page size in cas
12bf0 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65  e we have to cre
12c00 61 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ate the.      **
12c10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
12c20 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  The default page
12c30 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78   size is the max
12c40 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 20 20 2a  imum of:.      *
12c50 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20  *.      **    + 
12c60 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
12c70 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20  AGE_SIZE,.      
12c80 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75  **    + The valu
12c90 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
12ca0 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
12cb0 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  e().      **    
12cc0 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61  + The largest pa
12cd0 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e  ge size that can
12ce0 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
12cf0 69 63 61 6c 6c 79 2e 0a 20 20 20 20 20 20 2a 2f  ically..      */
12d00 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
12d10 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61  QLITE_OK && !rea
12d20 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
12d30 20 69 6e 74 20 69 53 65 63 74 6f 72 53 69 7a 65   int iSectorSize
12d40 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
12d50 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
12d60 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  d);.        if( 
12d70 6e 44 65 66 61 75 6c 74 50 61 67 65 3c 69 53 65  nDefaultPage<iSe
12d80 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20  ctorSize ){.    
12d90 20 20 20 20 20 20 6e 44 65 66 61 75 6c 74 50 61        nDefaultPa
12da0 67 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65  ge = iSectorSize
12db0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64  ;.        }.#ifd
12dc0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
12dd0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
12de0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
12df0 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
12e00 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
12e10 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
12e20 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20  r->fd);.        
12e30 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
12e40 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
12e50 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
12e60 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20  2==(512>>8));.  
12e70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
12e80 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
12e90 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
12ea0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ));.          as
12eb0 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f  sert(SQLITE_MAX_
12ec0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
12ed0 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20  E<=65536);.     
12ee0 20 20 20 20 20 66 6f 72 28 69 69 3d 6e 44 65 66       for(ii=nDef
12ef0 61 75 6c 74 50 61 67 65 3b 20 69 69 3c 3d 53 51  aultPage; ii<=SQ
12f00 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
12f10 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69  _PAGE_SIZE; ii=i
12f20 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i*2){.          
12f30 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54    if( iDc&(SQLIT
12f40 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
12f50 69 69 3e 3e 38 29 29 20 29 20 6e 44 65 66 61 75  ii>>8)) ) nDefau
12f60 6c 74 50 61 67 65 20 3d 20 69 69 3b 0a 20 20 20  ltPage = ii;.   
12f70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12f80 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
12f90 20 20 69 66 28 20 6e 44 65 66 61 75 6c 74 50 61    if( nDefaultPa
12fa0 67 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  ge>SQLITE_MAX_DE
12fb0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20  FAULT_PAGE_SIZE 
12fc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 44 65  ){.          nDe
12fd0 66 61 75 6c 74 50 61 67 65 20 3d 20 53 51 4c 49  faultPage = SQLI
12fe0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
12ff0 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  AGE_SIZE;.      
13000 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13010 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 6d  }.  }else if( !m
13020 65 6d 44 62 20 29 7b 0a 20 20 20 20 2f 2a 20 49  emDb ){.    /* I
13030 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  f a temporary fi
13040 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  le is requested,
13050 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65   it is not opene
13060 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
13070 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
13080 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65  se we accept the
13090 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
130a0 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74  ze and delay act
130b0 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65  ually.    ** ope
130c0 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e  ning the file un
130d0 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61  til the first ca
130e0 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e  ll to OsWrite().
130f0 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d  .    */ .    tem
13100 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70  pFile = 1;.    p
13110 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
13120 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
13130 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
13140 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r && rc==SQLITE_
13150 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
13160 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 28 63  ->pTmpSpace = (c
13170 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
13180 6c 6c 6f 63 28 6e 44 65 66 61 75 6c 74 50 61 67  lloc(nDefaultPag
13190 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  e);.  }..  /* If
131a0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   an error occure
131b0 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
131c0 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2e  he blocks above.
131d0 0a 20 20 2a 2a 20 46 72 65 65 20 74 68 65 20 50  .  ** Free the P
131e0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
131f0 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  nd close the fil
13200 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20 74 68  e..  ** Since th
13210 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61  e pager is not a
13220 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20 69  llocated there i
13230 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 74  s no need to set
13240 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65 72   .  ** any Pager
13250 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c  .errMask variabl
13260 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
13270 70 50 61 67 65 72 20 7c 7c 20 21 70 50 61 67 65  pPager || !pPage
13280 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  r->pTmpSpace ){.
13290 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
132a0 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
132b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
132c0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
132d0 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54  turn ((rc==SQLIT
132e0 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d  E_OK)?SQLITE_NOM
132f0 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 50  EM:rc);.  }..  P
13300 41 47 45 52 54 52 41 43 45 33 28 22 4f 50 45 4e  AGERTRACE3("OPEN
13310 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48   %d %s\n", FILEH
13320 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e  ANDLEID(pPager->
13330 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  fd), pPager->zFi
13340 6c 65 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41  lename);.  IOTRA
13350 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c  CE(("OPEN %p %s\
13360 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
13370 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a  er->zFilename)).
13380 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61  .  /* Fill in Pa
13390 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 5b 5d  ger.zDirectory[]
133a0 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50 61   */.  memcpy(pPa
133b0 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c  ger->zDirectory,
133c0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
133d0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29  me, nPathname+1)
133e0 3b 0a 20 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e  ;.  for(i=strlen
133f0 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
13400 6f 72 79 29 3b 20 69 3e 30 20 26 26 20 70 50 61  ory); i>0 && pPa
13410 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
13420 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  i-1]!='/'; i--){
13430 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70 50  }.  if( i>0 ) pP
13440 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
13450 5b 69 2d 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a  [i-1] = 0;..  /*
13460 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a   Fill in Pager.z
13470 4a 6f 75 72 6e 61 6c 5b 5d 20 2a 2f 0a 20 20 6d  Journal[] */.  m
13480 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a  emcpy(pPager->zJ
13490 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
134a0 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68  zFilename, nPath
134b0 6e 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28  name);.  memcpy(
134c0 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
134d0 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
134e0 6a 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a 0a 20  journal", 9);.. 
134f0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   /* pPager->jour
13500 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  nalOpen = 0; */.
13510 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
13520 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61  rnal = useJourna
13530 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70  l && !memDb;.  p
13540 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
13550 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26  k = noReadlock &
13560 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  & readOnly;.  /*
13570 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
13580 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  n = 0; */.  /* p
13590 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
135a0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
135b0 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20  ager->nRef = 0; 
135c0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
135d0 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20  ize = memDb-1;. 
135e0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
135f0 65 20 3d 20 6e 44 65 66 61 75 6c 74 50 61 67 65  e = nDefaultPage
13600 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
13610 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
13620 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
13630 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
13640 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
13650 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
13660 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 30  er->mxPage = 100
13670 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  ;.  pPager->mxPg
13680 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  no = SQLITE_MAX_
13690 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a  PAGE_COUNT;.  /*
136a0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
136b0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
136c0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
136d0 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65  er->state == (te
136e0 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45  mpFile ? PAGER_E
136f0 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52  XCLUSIVE : PAGER
13700 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a  _UNLOCK) );.  /*
13710 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
13720 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
13730 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65  r->tempFile = te
13740 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74  mpFile;.  assert
13750 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  ( tempFile==PAGE
13760 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
13770 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  RMAL .          
13780 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  || tempFile==PAG
13790 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
137a0 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
137b0 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
137c0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
137d0 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72  E==1 );.  pPager
137e0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
137f0 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70  = tempFile; .  p
13800 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d  Pager->memDb = m
13810 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
13820 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f  readOnly = readO
13830 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nly;.  /* pPager
13840 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  ->needSync = 0; 
13850 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  */.  pPager->noS
13860 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
13870 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f  mpFile || !useJo
13880 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d  urnal;.  pPager-
13890 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61  >fullSync = (pPa
138a0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29  ger->noSync?0:1)
138b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  ;.  pPager->sync
138c0 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  _flags = SQLITE_
138d0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f  SYNC_NORMAL;.  /
138e0 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
138f0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
13900 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
13910 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
13920 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
13930 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
13940 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41  nExtra = FORCE_A
13950 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29  LIGNMENT(nExtra)
13960 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
13970 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
13980 7c 6d 65 6d 44 62 7c 7c 74 65 6d 70 46 69 6c 65  |memDb||tempFile
13990 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20  );.  if( !memDb 
139a0 29 7b 0a 20 20 20 20 73 65 74 53 65 63 74 6f 72  ){.    setSector
139b0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
139c0 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  }.  /* pPager->p
139d0 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
139e0 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28   */.  /* memset(
139f0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
13a00 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
13a10 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a  >aHash)); */.  *
13a20 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
13a30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
13a40 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
13a50 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67 65  NAGEMENT.  pPage
13a60 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30 3b  r->iInUseMM = 0;
13a70 0a 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73  .  pPager->iInUs
13a80 65 44 42 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  eDB = 0;.  if( !
13a90 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 71 6c  memDb ){.    sql
13aa0 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
13ab0 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x = sqlite3_mute
13ac0 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
13ad0 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32  UTEX_STATIC_MEM2
13ae0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
13af0 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
13b00 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
13b10 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 50 61  Next = sqlite3Pa
13b20 67 65 72 4c 69 73 74 3b 0a 20 20 20 20 69 66 28  gerList;.    if(
13b30 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
13b40 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
13b50 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  t( sqlite3PagerL
13b60 69 73 74 2d 3e 70 50 72 65 76 3d 3d 30 20 29 3b  ist->pPrev==0 );
13b70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
13b80 67 65 72 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  gerList->pPrev =
13b90 20 70 50 61 67 65 72 3b 0a 20 20 20 20 7d 0a 20   pPager;.    }. 
13ba0 20 20 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76     pPager->pPrev
13bb0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
13bc0 33 50 61 67 65 72 4c 69 73 74 20 3d 20 70 50 61  3PagerList = pPa
13bd0 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
13be0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
13bf0 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ex);.  }.#endif.
13c00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13c10 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
13c20 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
13c30 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  r function..*/.v
13c40 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
13c50 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 50  SetBusyhandler(P
13c60 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75  ager *pPager, Bu
13c70 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79  syHandler *pBusy
13c80 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67  Handler){.  pPag
13c90 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
13ca0 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b   = pBusyHandler;
13cb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
13cc0 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
13cd0 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
13ce0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64   not NULL, the d
13cf0 65 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c  estructor is cal
13d00 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  led.** when the 
13d10 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
13d20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61  on each page rea
13d30 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20  ches zero.  The 
13d40 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a  destructor can.*
13d50 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65  * be used to cle
13d60 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f  an up informatio
13d70 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73  n in the extra s
13d80 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20  egment appended 
13d90 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a  to each page..**
13da0 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74  .** The destruct
13db0 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  or is not called
13dc0 20 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c   as a result sql
13dd0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29  ite3PagerClose()
13de0 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f  .  .** Destructo
13df0 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c  rs are only call
13e00 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  ed by sqlite3Pag
13e10 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f  erUnref()..*/.vo
13e20 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
13e30 65 74 44 65 73 74 72 75 63 74 6f 72 28 50 61 67  etDestructor(Pag
13e40 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
13e50 20 28 2a 78 44 65 73 63 29 28 44 62 50 61 67 65   (*xDesc)(DbPage
13e60 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65  *,int)){.  pPage
13e70 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d  r->xDestructor =
13e80 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   xDesc;.}../*.**
13e90 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69   Set the reiniti
13ea0 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20  alizer for this 
13eb0 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
13ec0 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69  ULL, the reiniti
13ed0 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c  alizer.** is cal
13ee0 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e  led when the con
13ef0 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69  tent of a page i
13f00 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  n cache is resto
13f10 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
13f20 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20  nal.** value as 
13f30 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f  a result of a ro
13f40 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c  llback.  The cal
13f50 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68  lback gives high
13f60 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a  er-level code.**
13f70 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
13f80 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45  to restore the E
13f90 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20  XTRA section to 
13fa0 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
13fb0 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20  estored.** page 
13fc0 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  data..*/.void sq
13fd0 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
13fe0 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
13ff0 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
14000 6e 69 74 29 28 44 62 50 61 67 65 2a 2c 69 6e 74  nit)(DbPage*,int
14010 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52  )){.  pPager->xR
14020 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
14030 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
14040 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20  the page size.  
14050 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73  Return the new s
14060 69 7a 65 2e 20 20 49 66 20 74 68 65 20 73 75 67  ize.  If the sug
14070 67 65 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a  gest new page.**
14080 20 73 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f   size is inappro
14090 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20  priate, then an 
140a0 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65  alternative page
140b0 20 73 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65   size is selecte
140c0 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65  d.** and returne
140d0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
140e0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
140f0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
14100 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a   int pageSize){.
14110 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
14120 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
14130 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
14140 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
14150 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
14160 69 66 28 20 70 61 67 65 53 69 7a 65 20 26 26 20  if( pageSize && 
14170 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26  !pPager->memDb &
14180 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  & pPager->nRef==
14190 30 20 29 7b 0a 20 20 20 20 70 61 67 65 72 45 6e  0 ){.    pagerEn
141a0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ter(pPager);.   
141b0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
141c0 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
141d0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
141e0 65 53 69 7a 65 3b 0a 20 20 20 20 73 65 74 53 65  eSize;.    setSe
141f0 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
14200 3b 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65  ;.    pagerLeave
14210 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71  (pPager);.    sq
14220 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
14230 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
14240 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
14250 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pace = sqlite3_m
14260 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b  alloc(pageSize);
14270 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
14280 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
14290 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
142a0 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69   to set the maxi
142b0 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67  mum database pag
142c0 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67  e count if mxPag
142d0 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a  e is positive. .
142e0 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
142f0 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  es if mxPage is 
14300 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
14310 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64  .  And never red
14320 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  uce the.** maxim
14330 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65  um page count be
14340 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  low the current 
14350 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
14360 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61  base..**.** Rega
14370 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65  rdless of mxPage
14380 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  , return the cur
14390 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67  rent maximum pag
143a0 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
143b0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
143c0 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a  ageCount(Pager *
143d0 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
143e0 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
143f0 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  e>0 ){.    pPage
14400 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61  r->mxPgno = mxPa
14410 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ge;.  }.  sqlite
14420 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
14430 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
14440 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  n pPager->mxPgno
14450 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
14460 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20  ollowing set of 
14470 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
14480 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
14490 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f   simulated.** I/
144a0 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73  O error mechanis
144b0 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  m.  These routin
144c0 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  es are used to a
144d0 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a  void simulated.*
144e0 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63  * errors in plac
144f0 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  es where we do n
14500 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72  ot care about er
14510 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  rors..**.** Unle
14520 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54  ss -DSQLITE_TEST
14530 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73  =1 is used, thes
14540 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61  e routines are a
14550 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64  ll no-ops.** and
14560 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64   generate no cod
14570 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
14580 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20  ITE_TEST.extern 
14590 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
145a0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78  rror_pending;.ex
145b0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
145c0 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73  _io_error_hit;.s
145d0 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f  tatic int saved_
145e0 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c  cnt;.void disabl
145f0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
14600 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
14610 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74  aved_cnt = sqlit
14620 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
14630 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ing;.  sqlite3_i
14640 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
14650 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61  = -1;.}.void ena
14660 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
14670 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
14680 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
14690 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65  r_pending = save
146a0 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23  d_cnt;.}.#else.#
146b0 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f   define disable_
146c0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
146d0 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65  ors().# define e
146e0 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
146f0 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64  io_errors().#end
14700 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  if../*.** Read t
14710 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73  he first N bytes
14720 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
14730 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ing of the file 
14740 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74  into memory.** t
14750 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73  hat pDest points
14760 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65   to. .**.** No e
14770 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73  rror checking is
14780 20 64 6f 6e 65 2e 20 54 68 65 20 72 61 74 69 6f   done. The ratio
14790 6e 61 6c 20 66 6f 72 20 74 68 69 73 20 69 73 20  nal for this is 
147a0 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69  that this functi
147b0 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61  on .** may be ca
147c0 6c 6c 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  lled even if the
147d0 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
147e0 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20  xist or contain 
147f0 61 20 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a  a header. In .**
14800 20 74 68 65 73 65 20 63 61 73 65 73 20 73 71 6c   these cases sql
14810 69 74 65 33 4f 73 52 65 61 64 28 29 20 77 69 6c  ite3OsRead() wil
14820 6c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  l return an erro
14830 72 2c 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  r, to which the 
14840 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65 73 70  correct .** resp
14850 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65 72 6f 20  onse is to zero 
14860 74 68 65 20 6d 65 6d 6f 72 79 20 61 74 20 70 44  the memory at pD
14870 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65  est and continue
14880 2e 20 20 41 20 72 65 61 6c 20 49 4f 20 65 72 72  .  A real IO err
14890 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73  or .** will pres
148a0 75 6d 61 62 6c 79 20 72 65 63 75 72 20 61 6e 64  umably recur and
148b0 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 6c 61   be picked up la
148c0 74 65 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b  ter (Todo: Think
148d0 20 61 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f   about this)..*/
148e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
148f0 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
14900 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
14910 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
14920 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
14930 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14940 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
14950 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
14960 72 74 28 4d 45 4d 44 42 7c 7c 70 50 61 67 65 72  rt(MEMDB||pPager
14970 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
14980 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
14990 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
149a0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
149b0 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
149c0 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c  BHDR %p 0 %d\n",
149d0 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20   pPager, N)).   
149e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
149f0 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
14a00 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20  pDest, N, 0);.  
14a10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14a20 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
14a30 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
14a40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
14a50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
14a60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
14a70 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
14a80 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
14a90 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73  he disk file ass
14aa0 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
14ab0 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49  pPager. .**.** I
14ac0 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59  f the PENDING_BY
14ad0 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70  TE lies on the p
14ae0 61 67 65 20 64 69 72 65 63 74 6c 79 20 61 66 74  age directly aft
14af0 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  er the end of th
14b00 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  e.** file, then 
14b10 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70 61  consider this pa
14b20 67 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  ge part of the f
14b30 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61  ile too. For exa
14b40 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44  mple, if.** PEND
14b50 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74 65  ING_BYTE is byte
14b60 20 34 30 39 36 20 28 74 68 65 20 66 69 72 73 74   4096 (the first
14b70 20 62 79 74 65 20 6f 66 20 70 61 67 65 20 35 29   byte of page 5)
14b80 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
14b90 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20   the.** file is 
14ba0 34 30 39 36 20 62 79 74 65 73 2c 20 35 20 69 73  4096 bytes, 5 is
14bb0 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
14bc0 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73  d of 4..*/.int s
14bd0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
14be0 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
14bf0 65 72 29 7b 0a 20 20 69 36 34 20 6e 20 3d 20 30  er){.  i64 n = 0
14c00 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
14c10 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
14c20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
14c30 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
14c40 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
14c50 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
14c60 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d  ze>=0 ){.    n =
14c70 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
14c80 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
14c90 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66  assert(pPager->f
14ca0 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61  d->pMethods||pPa
14cb0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
14cc0 20 20 20 20 69 66 28 20 28 70 50 61 67 65 72 2d      if( (pPager-
14cd0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 20  >fd->pMethods). 
14ce0 20 20 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c      && (rc = sql
14cf0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
14d00 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21  Pager->fd, &n))!
14d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14d20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
14d30 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
14d40 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
14d50 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26   }.    if( n>0 &
14d60 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65  & n<pPager->page
14d70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20  Size ){.      n 
14d80 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
14d90 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65        n /= pPage
14da0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
14db0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
14dc0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
14dd0 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
14de0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
14df0 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   n;.    }.  }.  
14e00 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f  if( n==(PENDING_
14e10 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67  BYTE/pPager->pag
14e20 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b  eSize) ){.    n+
14e30 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 70  +;.  }.  if( n>p
14e40 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
14e50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
14e60 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72  gno = n;.  }.  r
14e70 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66  eturn n;.}...#if
14e80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14e90 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20  _MEMORYDB./*.** 
14ea0 43 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f 72  Clear a PgHistor
14eb0 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69  y block.*/.stati
14ec0 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74  c void clearHist
14ed0 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70  ory(PgHistory *p
14ee0 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  Hist){.  sqlite3
14ef0 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72  _free(pHist->pOr
14f00 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ig);.  sqlite3_f
14f10 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
14f20 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69  );.  pHist->pOri
14f30 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e  g = 0;.  pHist->
14f40 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c  pStmt = 0;.}.#el
14f50 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72  se.#define clear
14f60 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69  History(x).#endi
14f70 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  f../*.** Forward
14f80 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
14f90 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
14fa0 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a  ournal(Pager*);.
14fb0 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50  ./*.** Unlink pP
14fc0 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  g from it's hash
14fd0 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74   chain. Also set
14fe0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
14ff0 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74   to 0 to indicat
15000 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  e.** that the pa
15010 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ge is not part o
15020 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e  f any hash chain
15030 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
15040 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  ed because the.*
15050 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  * sqlite3PagerMo
15060 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65  vepage() routine
15070 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67   can leave a pag
15080 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65  e in the .** pNe
15090 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65 65  xtFree/pPrevFree
150a0 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f   list that is no
150b0 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20  t a part of any 
150c0 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73  hash-chain..*/.s
150d0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e  tatic void unlin
150e0 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65 72  kHashChain(Pager
150f0 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
15100 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
15110 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ->pgno==0 ){.   
15120 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
15130 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50  extHash==0 && pP
15140 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  g->pPrevHash==0 
15150 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
15160 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
15170 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70  extHash ){.    p
15180 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
15190 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e  PrevHash = pPg->
151a0 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20  pPrevHash;.  }. 
151b0 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48   if( pPg->pPrevH
151c0 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ash ){.    asser
151d0 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
151e0 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50  [pPg->pgno & (pP
151f0 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21  ager->nHash-1)]!
15200 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
15210 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78  >pPrevHash->pNex
15220 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65  tHash = pPg->pNe
15230 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b  xtHash;.  }else{
15240 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67  .    int h = pPg
15250 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  ->pgno & (pPager
15260 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20  ->nHash-1);.    
15270 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
15280 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
15290 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d  h;.  }.  if( MEM
152a0 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48  DB ){.    clearH
152b0 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f  istory(PGHDR_TO_
152c0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
152d0 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  ));.  }.  pPg->p
152e0 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e  gno = 0;.  pPg->
152f0 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
15300 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
15310 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
15320 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
15330 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c  free list (the l
15340 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
15350 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a   where nRef==0).
15360 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20  ** and from its 
15370 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63  hash collision c
15380 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hain..*/.static 
15390 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28  void unlinkPage(
153a0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
153b0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
153c0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  Pg->pPager;..  /
153d0 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 66 72  * Unlink from fr
153e0 65 65 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a  ee page list */.
153f0 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28    lruListRemove(
15400 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69  pPg);..  /* Unli
15410 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f  nk from the pgno
15420 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
15430 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
15440 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d  (pPager, pPg);.}
15450 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15460 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
15470 74 72 75 6e 63 61 74 65 20 74 68 65 20 63 61 63  truncate the cac
15480 68 65 20 77 68 65 6e 20 61 20 64 61 74 61 62 61  he when a databa
15490 73 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61 74  se.** is truncat
154a0 65 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20 74  ed.  Drop from t
154b0 68 65 20 63 61 63 68 65 20 61 6c 6c 20 70 61 67  he cache all pag
154c0 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73  es whose pgno is
154d0 0a 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20  .** larger than 
154e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
154f0 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63  nd is unreferenc
15500 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65  ed..**.** Refere
15510 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65  nced pages large
15520 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
15530 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64  bSize are zeroed
15540 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79  ..**.** Actually
15550 2c 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 74  , at the point t
15560 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
15570 61 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64 20  alled, it would 
15580 62 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74  be.** an error t
15590 6f 20 68 61 76 65 20 61 20 72 65 66 65 72 65 6e  o have a referen
155a0 63 65 64 20 70 61 67 65 2e 20 20 42 75 74 20 72  ced page.  But r
155b0 61 74 68 65 72 20 74 68 61 6e 20 64 65 6c 65 74  ather than delet
155c0 65 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 61  e.** that page a
155d0 6e 64 20 67 75 61 72 61 6e 74 65 65 20 61 20 73  nd guarantee a s
155e0 75 62 73 65 71 75 65 6e 74 20 73 65 67 66 61 75  ubsequent segfau
155f0 6c 74 2c 20 69 74 20 73 65 65 6d 73 20 62 65 74  lt, it seems bet
15600 74 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69  ter.** to zero i
15610 74 20 61 6e 64 20 68 6f 70 65 20 74 68 61 74 20  t and hope that 
15620 77 65 20 65 72 72 6f 72 20 6f 75 74 20 73 61 6e  we error out san
15630 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ely..*/.static v
15640 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61  oid pager_trunca
15650 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a  te_cache(Pager *
15660 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
15670 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a   *pPg;.  PgHdr *
15680 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53  *ppPg;.  int dbS
15690 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
156a0 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20  Size;..  ppPg = 
156b0 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20  &pPager->pAll;. 
156c0 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a   while( (pPg = *
156d0 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20  ppPg)!=0 ){.    
156e0 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64  if( pPg->pgno<=d
156f0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  bSize ){.      p
15700 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
15710 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  tAll;.    }else 
15720 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  if( pPg->nRef>0 
15730 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
15740 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
15750 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
15760 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
15770 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65  ppPg = &pPg->pNe
15780 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  xtAll;.    }else
15790 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20  {.      *ppPg = 
157a0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
157b0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
157c0 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20  GFREE %p %d\n", 
157d0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
157e0 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  o));.      PAGER
157f0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
15800 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74  ger_pgfree_count
15810 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50  );.      unlinkP
15820 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
15830 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
15840 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
15850 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70  ee(pPg);.      p
15860 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a  Pager->nPage--;.
15870 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
15880 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** Try to obtain
15890 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c   a lock on a fil
158a0 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  e.  Invoke the b
158b0 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
158c0 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63  the lock.** is c
158d0 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61  urrently not ava
158e0 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20  ilable.  Repeat 
158f0 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
15900 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a  allback returns.
15910 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69  ** false or unti
15920 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65  l the lock succe
15930 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eds..**.** Retur
15940 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
15950 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72  uccess and an er
15960 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63  ror code if we c
15970 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20  annot obtain.** 
15980 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  the lock..*/.sta
15990 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61  tic int pager_wa
159a0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72  it_on_lock(Pager
159b0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f   *pPager, int lo
159c0 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
159d0 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20  c;..  /* The OS 
159e0 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74  lock values must
159f0 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
15a00 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76  the Pager lock v
15a10 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  alues */.  asser
15a20 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d  t( PAGER_SHARED=
15a30 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
15a40 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
15a50 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56  RESERVED==RESERV
15a60 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
15a70 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55  ert( PAGER_EXCLU
15a80 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f  SIVE==EXCLUSIVE_
15a90 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  LOCK );..  /* If
15aa0 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72   the file is cur
15ab0 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20  rently unlocked 
15ac0 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75  then the size mu
15ad0 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f  st be unknown */
15ae0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
15af0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
15b00 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72  SHARED || pPager
15b10 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45  ->dbSize<0 || ME
15b20 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  MDB );..  if( pP
15b30 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63  ager->state>=loc
15b40 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20  ktype ){.    rc 
15b50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
15b60 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  else{.    do {. 
15b70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15b80 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
15b90 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  fd, locktype);. 
15ba0 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
15bb0 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73 71  QLITE_BUSY && sq
15bc0 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
15bd0 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
15be0 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a  BusyHandler) );.
15bf0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15c00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
15c10 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c  Pager->state = l
15c20 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49  ocktype;.      I
15c30 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70  OTRACE(("LOCK %p
15c40 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
15c50 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d  locktype)).    }
15c60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
15c70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
15c80 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  ate the file to 
15c90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
15ca0 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  ges specified..*
15cb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
15cc0 65 72 54 72 75 6e 63 61 74 65 28 50 61 67 65 72  erTruncate(Pager
15cd0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
15ce0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Page){.  int rc;
15cf0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
15d00 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
15d10 53 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20  SHARED || MEMDB 
15d20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
15d30 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
15d40 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
15d50 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
15d60 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
15d70 72 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72  rCode;.    retur
15d80 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
15d90 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64  nPage>=(unsigned
15da0 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
15db0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
15dc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
15dd0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
15de0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
15df0 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65   nPage;.    page
15e00 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
15e10 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
15e20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15e30 20 20 7d 0a 20 20 70 61 67 65 72 45 6e 74 65 72    }.  pagerEnter
15e40 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d  (pPager);.  rc =
15e50 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
15e60 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  ger);.  pagerLea
15e70 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ve(pPager);.  if
15e80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15e90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
15ea0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20  ;.  }..  /* Get 
15eb0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
15ec0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
15ed0 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74  e before truncat
15ee0 69 6e 67 2e 20 2a 2f 0a 20 20 70 61 67 65 72 45  ing. */.  pagerE
15ef0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
15f00 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
15f10 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
15f20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
15f30 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
15f40 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
15f50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15f60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
15f70 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74  ..  rc = pager_t
15f80 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
15f90 6e 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  nPage);.  return
15fa0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68   rc;.}../*.** Sh
15fb0 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
15fc0 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
15fd0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
15fe0 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
15ff0 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
16000 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
16010 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
16020 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
16030 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
16040 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
16050 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
16060 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
16070 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
16080 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
16090 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
160a0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
160b0 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
160c0 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
160d0 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
160e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
160f0 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
16100 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
16110 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
16120 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
16130 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
16140 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
16150 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
16160 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
16170 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
16180 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
16190 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
161a0 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
161b0 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
161c0 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
161d0 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
161e0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
161f0 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
16200 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16210 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
16220 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65   *pPager){.#ifde
16230 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
16240 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
16250 54 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29  T.  if( !MEMDB )
16260 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  {.    sqlite3_mu
16270 74 65 78 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c  tex *mutex = sql
16280 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
16290 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
162a0 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20  ATIC_MEM2);.    
162b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
162c0 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20  ter(mutex);.    
162d0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 50 72 65  if( pPager->pPre
162e0 76 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  v ){.      pPage
162f0 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  r->pPrev->pNext 
16300 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b  = pPager->pNext;
16310 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16320 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69    sqlite3PagerLi
16330 73 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65  st = pPager->pNe
16340 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  xt;.    }.    if
16350 28 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20  ( pPager->pNext 
16360 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
16370 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
16380 70 50 61 67 65 72 2d 3e 70 50 72 65 76 3b 0a 20  pPager->pPrev;. 
16390 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
163a0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
163b0 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ex);.  }.#endif.
163c0 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
163d0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
163e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43  ;.  pPager->errC
163f0 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ode = 0;.  pPage
16400 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
16410 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65   = 0;.  pager_re
16420 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70  set(pPager);.  p
16430 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
16440 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
16450 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
16460 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
16470 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4c   PAGERTRACE2("CL
16480 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  OSE %d\n", PAGER
16490 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49  ID(pPager));.  I
164a0 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  OTRACE(("CLOSE %
164b0 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
164c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
164d0 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61  >errCode || (pPa
164e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
164f0 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ==0 && pPager->s
16500 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20  tmtOpen==0) );. 
16510 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
16520 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
16530 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
16540 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d  Pager->jfd);.  }
16550 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
16560 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
16570 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  al);.  if( pPage
16580 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20  r->stmtOpen ){. 
16590 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
165a0 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b  e(pPager->stfd);
165b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
165c0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
165d0 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c  );.  /* Temp fil
165e0 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
165f0 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20  ally deleted by 
16600 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20  the OS.  ** if( 
16610 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
16620 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74   ){.  **   sqlit
16630 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
16640 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
16650 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71   ** }.  */..  sq
16660 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
16670 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c  r->aHash);.  sql
16680 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
16690 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
166a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
166b0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
166c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
166d0 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
166e0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
166f0 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
16700 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
16710 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67  number for the g
16720 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a  iven page data..
16730 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
16740 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
16750 62 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74  bPage *p){.  ret
16760 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23  urn p->pgno;.}.#
16770 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
16780 20 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63   page_ref() func
16790 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20  tion increments 
167a0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
167b0 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a  unt for a page..
167c0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 69  ** If the page i
167d0 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74  s currently on t
167e0 68 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65  he freelist (the
167f0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
16800 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a   is zero) then.*
16810 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  * remove it from
16820 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
16830 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73  *.** For non-tes
16840 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f  t systems, page_
16850 72 65 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f  ref() is a macro
16860 20 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67   that calls _pag
16870 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e  e_ref().** onlin
16880 65 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e  e of the referen
16890 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f  ce count is zero
168a0 2e 20 20 46 6f 72 20 74 65 73 74 20 73 79 73 74  .  For test syst
168b0 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a  ems, page_ref().
168c0 2a 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e  ** is a real fun
168d0 63 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65  ction so that we
168e0 20 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f   can set breakpo
168f0 69 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20 69  ints and trace i
16900 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
16910 64 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64  d _page_ref(PgHd
16920 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  r *pPg){.  if( p
16930 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
16940 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69     /* The page i
16950 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74  s currently on t
16960 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
16970 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20  move it. */.    
16980 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70 50  lruListRemove(pP
16990 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61  g);.    pPg->pPa
169a0 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ger->nRef++;.  }
169b0 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a  .  pPg->nRef++;.
169c0 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
169d0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
169e0 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
169f0 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48  oid page_ref(PgH
16a00 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66  dr *pPg){.    if
16a10 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
16a20 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65  {.      _page_re
16a30 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  f(pPg);.    }els
16a40 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52  e{.      pPg->nR
16a50 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49  ef++;.      REFI
16a60 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  NFO(pPg);.    }.
16a70 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69    }.#else.# defi
16a80 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20  ne page_ref(P)  
16a90 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f   ((P)->nRef==0?_
16aa0 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69  page_ref(P):(voi
16ab0 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23  d)(P)->nRef++).#
16ac0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
16ad0 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
16ae0 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
16af0 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75   page.  The inpu
16b00 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20  t pointer is.** 
16b10 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
16b20 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  he page data..*/
16b30 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
16b40 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
16b50 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  ){.  pagerEnter(
16b60 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pPg->pPager);.  
16b70 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
16b80 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 67 2d   pagerLeave(pPg-
16b90 3e 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  >pPager);.  retu
16ba0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
16bb0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
16bc0 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68  journal.  In oth
16bd0 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
16be0 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
16bf0 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
16c00 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
16c10 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
16c20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
16c30 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
16c40 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74  the.** disk.  It
16c50 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
16c60 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69  modify the origi
16c70 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
16c80 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a  e until after.**
16c90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
16ca0 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49   been synced.  I
16cb0 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
16cc0 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66  atabase is modif
16cd0 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ied before.** th
16ce0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
16cf0 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20  ced and a power 
16d00 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20  failure occurs, 
16d10 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75  the unsynced jou
16d20 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75  rnal.** data wou
16d30 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77  ld be lost and w
16d40 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c  e would be unabl
16d50 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e to completely 
16d60 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20  rollback the.** 
16d70 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
16d80 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
16d90 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63  uption would occ
16da0 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  ur..** .** This 
16db0 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64  routine also upd
16dc0 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66 69  ates the nRec fi
16dd0 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  eld in the heade
16de0 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
16df0 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e  ..** (See commen
16e00 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f  ts on the pager_
16e10 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
16e20 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
16e30 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a  l information.).
16e40 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d  ** If the sync m
16e50 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f  ode is FULL, two
16e60 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75   syncs will occu
16e70 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77 68  r.  First the wh
16e80 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69  ole journal.** i
16e90 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74  s synced, then t
16ea0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73  he nRec field is
16eb0 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61   updated, then a
16ec0 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63   second sync occ
16ed0 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  urs..**.** For t
16ee0 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
16ef0 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  es, we do not ca
16f00 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c  re if we are abl
16f10 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  e to rollback.**
16f20 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20 66   after a power f
16f30 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f 20 73 79  ailure, so no sy
16f40 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
16f50 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
16f60 51 55 45 4e 54 49 41 4c 20 66 6c 61 67 20 69 73  QUENTIAL flag is
16f70 20 73 65 74 20 66 6f 72 20 74 68 65 20 70 65 72   set for the per
16f80 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 6f 6e  sistent media on
16f90 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 64 61   which.** the da
16fa0 74 61 62 61 73 65 20 69 73 20 73 74 6f 72 65 64  tabase is stored
16fb0 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63 28 29 20  , then OsSync() 
16fc0 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
16fd0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  on the journal.*
16fe0 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20  * file. In this 
16ff0 63 61 73 65 20 61 6c 6c 20 74 68 61 74 20 69 73  case all that is
17000 20 72 65 71 75 69 72 65 64 20 69 73 20 74 6f 20   required is to 
17010 75 70 64 61 74 65 20 74 68 65 20 6e 52 65 63 20  update the nRec 
17020 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74 68 65 20  field in.** the 
17030 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
17040 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
17050 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65  ne clears the ne
17060 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20  edSync field of 
17070 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65  every page curre
17080 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65  nt held in.** me
17090 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
170a0 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
170b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
170c0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
170d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
170e0 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 53 79 6e 63 20  OK;...  /* Sync 
170f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  the journal befo
17100 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  re modifying the
17110 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20   main database. 
17120 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68   ** (assuming th
17130 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c  ere is a journal
17140 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f   and it needs to
17150 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a   be synced.).  *
17160 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
17170 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
17180 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
17190 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  pFile ){.      i
171a0 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
171b0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
171c0 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
171d0 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fd);.      asser
171e0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
171f0 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 20  alOpen );..     
17200 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50 61   /* assert( !pPa
17210 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f  ger->noSync ); /
17220 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20 62  / noSync might b
17230 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72 6f  e set if synchro
17240 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77 61  nous.      ** wa
17250 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66 74  s turned off aft
17260 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
17270 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e 20  on was started. 
17280 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a   Ticket #615 */.
17290 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
172a0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
172b0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
172c0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75  pPager->nRec cou
172d0 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65 70  nter we are keep
172e0 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20 20  ing agrees.     
172f0 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 6e     ** with the n
17300 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
17310 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
17320 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
17330 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
17340 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20     i64 jSz;.    
17350 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17360 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
17370 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20  r->jfd, &jSz);. 
17380 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
17390 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
173a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
173b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
173c0 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d  ==jSz );.      }
173d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
173e0 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
173f0 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
17400 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ND) ){.        /
17410 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
17420 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
17430 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
17440 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
17450 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
17460 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
17470 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
17480 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
17490 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
174a0 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
174b0 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
174c0 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
174d0 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
174e0 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
174f0 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
17500 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  or rollback..   
17510 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
17520 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  ** This is not r
17530 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70  equired if the p
17540 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20  ersistent media 
17550 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20  supports the.   
17560 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50       ** SAFE_APP
17570 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65  END property. Be
17580 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61  cause in this ca
17590 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
175a0 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a  sible .        *
175b0 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61  * for garbage da
175c0 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  ta to be appende
175d0 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74  d to the file, t
175e0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20  he nRec field.  
175f0 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75        ** is popu
17600 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46  lated with 0xFFF
17610 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a  FFFFF when the j
17620 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
17630 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20   written.       
17640 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65   ** and never ne
17650 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
17660 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
17670 20 20 20 20 20 20 69 36 34 20 6a 72 6e 6c 4f 66        i64 jrnlOf
17680 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  f;.        if( p
17690 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
176a0 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
176b0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
176c0 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AL) ){.         
176d0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59   PAGERTRACE2("SY
176e0 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
176f0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
17700 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ger));.         
17710 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
17720 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
17730 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
17740 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
17750 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
17760 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
17770 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
17780 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
17790 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
177a0 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50      jrnlOff = pP
177b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
177c0 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
177d0 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20 20  alMagic);.      
177e0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
177f0 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
17800 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66 66 2c  pPager, jrnlOff,
17810 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63   4));.        rc
17820 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
17830 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
17840 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  Off, pPager->nRe
17850 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
17860 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
17870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
17880 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
17890 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
178a0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41  L) ){.        PA
178b0 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43 20  GERTRACE2("SYNC 
178c0 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
178d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
178e0 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52  ));.        IOTR
178f0 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
17900 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
17910 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17920 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
17930 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
17940 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20  _flags| .       
17950 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63     (pPager->sync
17960 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53  _flags==SQLITE_S
17970 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f  YNC_FULL?SQLITE_
17980 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29  SYNC_DATAONLY:0)
17990 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
179a0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
179b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
179c0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
179d0 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
179e0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
179f0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
17a00 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61  = 0;..    /* Era
17a10 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  se the needSync 
17a20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20  flag from every 
17a30 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
17a40 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
17a50 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
17a60 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
17a70 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
17a80 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
17a90 20 20 20 6c 72 75 4c 69 73 74 53 65 74 46 69 72     lruListSetFir
17aa0 73 74 53 79 6e 63 65 64 28 70 50 61 67 65 72 29  stSynced(pPager)
17ab0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  ;.  }..#ifndef N
17ac0 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68  DEBUG.  /* If th
17ad0 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
17ae0 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74   flag is clear t
17af0 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65  hen the PgHdr.ne
17b00 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67  edSync.  ** flag
17b10 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c   must also be cl
17b20 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65  ear for all page
17b30 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  s.  Verify that 
17b40 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69  this.  ** invari
17b50 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a  ant is true..  *
17b60 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f  /.  else{.    fo
17b70 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
17b80 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
17b90 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
17ba0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
17bb0 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
17bc0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
17bd0 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69   pPager->lru.pFi
17be0 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65  rstSynced==pPage
17bf0 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 20 29 3b  r->lru.pFirst );
17c00 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
17c10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17c20 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69 73  ** Merge two lis
17c30 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e  ts of pages conn
17c40 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20  ected by pDirty 
17c50 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65  and in pgno orde
17c60 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74  r..** Do not bot
17c70 68 20 66 69 78 69 6e 67 20 74 68 65 20 70 50 72  h fixing the pPr
17c80 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73  evDirty pointers
17c90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
17ca0 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69 73  r *merge_pagelis
17cb0 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67 48  t(PgHdr *pA, PgH
17cc0 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64 72  dr *pB){.  PgHdr
17cd0 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b   result, *pTail;
17ce0 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73 75  .  pTail = &resu
17cf0 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20  lt;.  while( pA 
17d00 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28  && pB ){.    if(
17d10 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67   pA->pgno<pB->pg
17d20 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61 69  no ){.      pTai
17d30 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a  l->pDirty = pA;.
17d40 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 41        pTail = pA
17d50 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d  ;.      pA = pA-
17d60 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c  >pDirty;.    }el
17d70 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d  se{.      pTail-
17d80 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20  >pDirty = pB;.  
17d90 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a      pTail = pB;.
17da0 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 70        pB = pB->p
17db0 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  Dirty;.    }.  }
17dc0 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20  .  if( pA ){.   
17dd0 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
17de0 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   pA;.  }else if(
17df0 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69 6c   pB ){.    pTail
17e00 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20  ->pDirty = pB;. 
17e10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 69   }else{.    pTai
17e20 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  l->pDirty = 0;. 
17e30 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75   }.  return resu
17e40 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  lt.pDirty;.}../*
17e50 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69 73  .** Sort the lis
17e60 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 63  t of pages in ac
17e70 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
17e80 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61 72   pgno.  Pages ar
17e90 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62  e.** connected b
17ea0 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  y pDirty pointer
17eb0 73 2e 20 20 54 68 65 20 70 50 72 65 76 44 69 72  s.  The pPrevDir
17ec0 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a  ty pointers are.
17ed0 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79 20  ** corrupted by 
17ee0 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64  this sort..*/.#d
17ef0 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
17f00 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23 64 65  KET_ALLOC 25.#de
17f10 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b  fine N_SORT_BUCK
17f20 45 54 20 20 20 20 20 20 20 32 35 0a 23 69 66 64  ET       25.#ifd
17f30 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
17f40 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67   int sqlite3_pag
17f50 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74  er_n_sort_bucket
17f60 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66 20 4e   = 0;.  #undef N
17f70 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20 20 23  _SORT_BUCKET.  #
17f80 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55  define N_SORT_BU
17f90 43 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c 69 74  CKET \.   (sqlit
17fa0 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
17fb0 62 75 63 6b 65 74 3f 73 71 6c 69 74 65 33 5f 70  bucket?sqlite3_p
17fc0 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b  ager_n_sort_buck
17fd0 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  et:N_SORT_BUCKET
17fe0 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66 0a 73  _ALLOC).#endif.s
17ff0 74 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f 72  tatic PgHdr *sor
18000 74 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  t_pagelist(PgHdr
18010 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72 20   *pIn){.  PgHdr 
18020 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  *a[N_SORT_BUCKET
18030 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20 69  _ALLOC], *p;.  i
18040 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28 61  nt i;.  memset(a
18050 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29 3b  , 0, sizeof(a));
18060 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20 29 7b  .  while( pIn ){
18070 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20 20  .    p = pIn;.  
18080 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72 74    pIn = p->pDirt
18090 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79  y;.    p->pDirty
180a0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
180b0 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b  0; i<N_SORT_BUCK
180c0 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ET-1; i++){.    
180d0 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29 7b    if( a[i]==0 ){
180e0 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20  .        a[i] = 
180f0 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  p;.        break
18100 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18110 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72 67 65         p = merge
18120 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20  _pagelist(a[i], 
18130 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d  p);.        a[i]
18140 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
18150 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 4e    }.    if( i==N
18160 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20 29  _SORT_BUCKET-1 )
18170 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76 65 72  {.      /* Cover
18180 61 67 65 3a 20 54 6f 20 67 65 74 20 68 65 72 65  age: To get here
18190 2c 20 74 68 65 72 65 20 6e 65 65 64 20 74 6f 20  , there need to 
181a0 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42 55 43  be 2^(N_SORT_BUC
181b0 4b 45 54 29 20 0a 20 20 20 20 20 20 2a 2a 20 65  KET) .      ** e
181c0 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69  lements in the i
181d0 6e 70 75 74 20 6c 69 73 74 2e 20 54 68 69 73 20  nput list. This 
181e0 69 73 20 70 6f 73 73 69 62 6c 65 2c 20 62 75 74  is possible, but
181f0 20 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a 20 20   impractical..  
18200 20 20 20 20 2a 2a 20 54 65 73 74 69 6e 67 20 74      ** Testing t
18210 68 69 73 20 6c 69 6e 65 20 69 73 20 74 68 65 20  his line is the 
18220 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61 6c 20  point of global 
18230 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a  variable.      *
18240 2a 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  * sqlite3_pager_
18250 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e 0a 20  n_sort_bucket.. 
18260 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 5b       */.      a[
18270 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c  i] = merge_pagel
18280 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20  ist(a[i], p);.  
18290 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b    }.  }.  p = a[
182a0 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  0];.  for(i=1; i
182b0 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20  <N_SORT_BUCKET; 
182c0 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65  i++){.    p = me
182d0 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c 20  rge_pagelist(p, 
182e0 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74  a[i]);.  }.  ret
182f0 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
18300 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20  Given a list of 
18310 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64  pages (connected
18320 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
18330 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72  irty pointer) wr
18340 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65  ite.** every one
18350 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20   of those pages 
18360 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
18370 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72  ase file and mar
18380 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73  k them all.** as
18390 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   clean..*/.stati
183a0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
183b0 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
183c0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65   *pList){.  Page
183d0 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 50 67 48  r *pPager;.  PgH
183e0 64 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 3b  dr *p;.  int rc;
183f0 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ..  if( pList==0
18400 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
18410 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  _OK;.  pPager = 
18420 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a  pList->pPager;..
18430 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
18440 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
18450 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45  either a RESERVE
18460 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
18470 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
18480 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
18490 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
184a0 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  dy an EXCLUSIVE 
184b0 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  lock, the follow
184c0 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74  ing.  ** calls t
184d0 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  o sqlite3OsLock(
184e0 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20  ) are no-ops..  
184f0 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74  **.  ** Moving t
18500 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53  he lock from RES
18510 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49  ERVED to EXCLUSI
18520 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f  VE actually invo
18530 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20  lves going.  ** 
18540 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72  through an inter
18550 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45  mediate state PE
18560 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49  NDING.   A PENDI
18570 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73  NG lock prevents
18580 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72   new.  ** reader
18590 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67  s from attaching
185a0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
185b0 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63   but is unsuffic
185c0 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20  ient for us to. 
185d0 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20   ** write.  The 
185e0 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e  idea of a PENDIN
185f0 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65  G lock is to pre
18600 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73  vent new readers
18610 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e   from.  ** comin
18620 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61  g in while we wa
18630 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  it for existing 
18640 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72  readers to clear
18650 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c  ..  **.  ** Whil
18660 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
18670 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73  n the RESERVED s
18680 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e  tate, the origin
18690 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
186a0 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67  .  ** is unchang
186b0 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f  ed and we can ro
186c0 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  llback without h
186d0 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63  aving to playbac
186e0 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  k the.  ** journ
186f0 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  al into the orig
18700 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
18710 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61  le.  Once we tra
18720 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20  nsition to.  ** 
18730 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65  EXCLUSIVE, it me
18740 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
18750 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
18760 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72  hanged and any r
18770 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c  ollback.  ** wil
18780 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  l require a jour
18790 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20  nal playback..  
187a0 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
187b0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
187c0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
187d0 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
187e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
187f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
18800 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f  .  pList = sort_
18810 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29 3b  pagelist(pList);
18820 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20  .  for(p=pList; 
18830 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  p; p=p->pDirty){
18840 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
18850 64 69 72 74 79 20 29 3b 0a 20 20 20 20 70 2d 3e  dirty );.    p->
18860 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dirty = 0;.  }. 
18870 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b   while( pList ){
18880 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
18890 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
188a0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
188b0 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20  en it now. */.  
188c0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66    if( !pPager->f
188d0 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
188e0 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
188f0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
18900 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18910 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70  3PagerOpentemp(p
18920 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
18930 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
18940 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
18950 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
18960 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
18970 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
18980 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  e dirty pages in
18990 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
189a0 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
189b0 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a  s greater.    **
189c0 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
189d0 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73  ze, this means s
189e0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
189f0 61 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ate() was called
18a00 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20   to.    ** make 
18a10 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72  the file smaller
18a20 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20   (presumably by 
18a30 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65  auto-vacuum code
18a40 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a  ). Do not write.
18a50 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20      ** any such 
18a60 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c  pages to the fil
18a70 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
18a80 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70  ( pList->pgno<=p
18a90 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
18aa0 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
18ab0 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f  t = (pList->pgno
18ac0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
18ad0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  >pageSize;.     
18ae0 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43   char *pData = C
18af0 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 50 47  ODEC2(pPager, PG
18b00 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73  HDR_TO_DATA(pLis
18b10 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c  t), pList->pgno,
18b20 20 36 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52   6);.      PAGER
18b30 54 52 41 43 45 34 28 22 53 54 4f 52 45 20 25 64  TRACE4("STORE %d
18b40 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
18b50 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
18b60 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
18b70 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73  ID(pPager), pLis
18b80 74 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  t->pgno, pager_p
18b90 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 3b  agehash(pList));
18ba0 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
18bb0 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c  "PGOUT %p %d\n",
18bc0 20 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e   pPager, pList->
18bd0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63  pgno));.      rc
18be0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
18bf0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  e(pPager->fd, pD
18c00 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
18c10 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a  eSize, offset);.
18c20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
18c30 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
18c40 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  ritedb_count);. 
18c50 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
18c60 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b  pPager->nWrite);
18c70 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
18c80 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ->pgno==1 ){.   
18c90 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
18ca0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
18cb0 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a   &pData[24], siz
18cc0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
18cd0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
18ce0 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  }.    }.#ifndef 
18cf0 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  NDEBUG.    else{
18d00 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
18d10 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70  E3("NOSTORE %d p
18d20 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
18d30 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73  ID(pPager), pLis
18d40 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  t->pgno);.    }.
18d50 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72  #endif.    if( r
18d60 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  c ) return rc;.#
18d70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
18d80 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c 69  CK_PAGES.    pLi
18d90 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  st->pageHash = p
18da0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c  ager_pagehash(pL
18db0 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ist);.#endif.   
18dc0 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e   pList = pList->
18dd0 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65  pDirty;.  }.  re
18de0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18df0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74  }../*.** Collect
18e00 20 65 76 65 72 79 20 64 69 72 74 79 20 70 61 67   every dirty pag
18e10 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c  e into a dirty l
18e20 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  ist and.** retur
18e30 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
18e40 68 65 20 68 65 61 64 20 6f 66 20 74 68 61 74 20  he head of that 
18e50 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73  list.  All pages
18e60 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65   are.** collecte
18e70 64 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 61  d even if they a
18e80 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e  re still in use.
18e90 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
18ea0 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f   *pager_get_all_
18eb0 64 69 72 74 79 5f 70 61 67 65 73 28 50 61 67 65  dirty_pages(Page
18ec0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
18ed0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 44 69  turn pPager->pDi
18ee0 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rty;.}../*.** Re
18ef0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
18f00 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
18f10 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  nal on the given
18f20 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74   pager..** A hot
18f30 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
18f40 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
18f50 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a   played back..**
18f60 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
18f70 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
18f80 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
18f90 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20  0 but a journal 
18fa0 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20  file.** exists, 
18fb0 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79  that is probably
18fc0 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
18fd0 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61  left over from a
18fe0 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61   prior.** databa
18ff0 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
19000 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c   name.  Just del
19010 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
19020 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
19030 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
19040 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
19050 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
19060 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
19070 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
19080 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74  useJournal ) ret
19090 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
190a0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
190b0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
190c0 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
190d0 45 53 53 5f 45 58 49 53 54 53 29 20 29 7b 0a 20  ESS_EXISTS) ){. 
190e0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
190f0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73  .  if( sqlite3Os
19100 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
19110 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  k(pPager->fd) ){
19120 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
19130 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
19140 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
19150 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20  Pager)==0 ){.   
19160 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
19170 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
19180 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
19190 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
191a0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
191b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
191c0 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ry to find a pag
191d0 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  e in the cache t
191e0 68 61 74 20 63 61 6e 20 62 65 20 72 65 63 79 63  hat can be recyc
191f0 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  led. .**.** This
19200 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74   routine may ret
19210 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
19220 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72  , SQLITE_FULL or
19230 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a   SQLITE_OK. It .
19240 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20  ** does not set 
19250 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43  the pPager->errC
19260 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ode variable..*/
19270 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
19280 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72 20  r_recycle(Pager 
19290 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e  *pPager, int syn
192a0 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50  cOk, PgHdr **ppP
192b0 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  g){.  PgHdr *pPg
192c0 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a  ;.  *ppPg = 0;..
192d0 20 20 61 73 73 65 72 74 28 21 4d 45 4d 44 42 29    assert(!MEMDB)
192e0 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70  ;..  /* Find a p
192f0 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20  age to recycle. 
19300 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61   Try to locate a
19310 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
19320 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  not.  ** require
19330 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79   us to do an fsy
19340 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72  nc() on the jour
19350 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  nal..  */.  pPg 
19360 3d 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  = pPager->lru.pF
19370 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f  irstSynced;..  /
19380 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f  * If we could no
19390 74 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68  t find a page th
193a0 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  at does not requ
193b0 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20  ire an fsync(). 
193c0 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e   ** on the journ
193d0 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79  al file then fsy
193e0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
193f0 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a  ile.  This is a.
19400 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f    ** very slow o
19410 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20  peration, so we 
19420 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f  work hard to avo
19430 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65  id it.  But some
19440 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63 61  times.  ** it ca
19450 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20  n't be helped.. 
19460 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 30   */.  if( pPg==0
19470 20 26 26 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e   && pPager->lru.
19480 70 46 69 72 73 74 20 26 26 20 73 79 6e 63 4f 6b  pFirst && syncOk
19490 20 26 26 20 21 4d 45 4d 44 42 29 7b 0a 20 20 20   && !MEMDB){.   
194a0 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
194b0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
194c0 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
194d0 2d 3e 66 64 29 3b 0a 20 20 20 20 69 6e 74 20 72  ->fd);.    int r
194e0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
194f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
19500 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
19510 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
19520 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
19530 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d  >fullSync && 0==
19540 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
19550 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
19560 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e  {.      /* If in
19570 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
19580 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75   write a new jou
19590 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f  rnal header into
195a0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f   the.      ** jo
195b0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
195c0 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69   is done to avoi
195d0 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67  d ever modifying
195e0 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20   a journal.     
195f0 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20   ** header that 
19600 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  is involved in t
19610 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70  he rollback of p
19620 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20  ages that have. 
19630 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
19640 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
19650 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e  the database (in
19660 20 63 61 73 65 20 74 68 65 20 68 65 61 64 65 72   case the header
19670 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61   is.      ** tra
19680 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52  shed when the nR
19690 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
196a0 74 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ted)..      */. 
196b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
196c0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  c = 0;.      ass
196d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
196e0 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20  rnalOff > 0 );. 
196f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
19700 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
19710 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
19720 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
19730 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
19740 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
19750 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19760 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
19770 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 6c   pPg = pPager->l
19780 72 75 2e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 20  ru.pFirst;.  }. 
19790 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
197a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
197b0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  _OK;.  }..  asse
197c0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  rt( pPg->nRef==0
197d0 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
197e0 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
197f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
19800 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20   it is dirty..  
19810 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  */.  if( pPg->di
19820 72 74 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  rty ){.    int r
19830 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
19840 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
19850 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  );.    makeClean
19860 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e  (pPg);.    pPg->
19870 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70  dirty = 1;.    p
19880 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
19890 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
198a0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70  rite_pagelist( p
198b0 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64  Pg );.    pPg->d
198c0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  irty = 0;.    if
198d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
198e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
198f0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
19900 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
19910 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ty==0 );..  /* I
19920 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  f the page we ar
19930 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d  e recycling is m
19940 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
19950 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20  ollback, then.  
19960 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61  ** set the globa
19970 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  l alwaysRollback
19980 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61   flag, thus disa
19990 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73  bling the.  ** s
199a0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
199b0 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69  ollback() optimi
199c0 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72  zation for the r
199d0 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e  est of this tran
199e0 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74  saction..  ** It
199f0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
19a00 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73 65   do this because
19a10 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64   the page marked
19a20 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a   alwaysRollback.
19a30 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65    ** might be re
19a40 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74 65  loaded at a late
19a50 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74 68  r time but at th
19a60 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27  at point we won'
19a70 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  t remember.  ** 
19a80 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b  that is was mark
19a90 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ed alwaysRollbac
19aa0 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74  k.  This means t
19ab0 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75  hat all pages mu
19ac0 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65  st.  ** be marke
19ad0 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
19ae0 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e  ack from here on
19af0 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   out..  */.  if(
19b00 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
19b10 62 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54 52  back ){.    IOTR
19b20 41 43 45 28 28 22 41 4c 57 41 59 53 5f 52 4f 4c  ACE(("ALWAYS_ROL
19b30 4c 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  LBACK %p\n", pPa
19b40 67 65 72 29 29 0a 20 20 20 20 70 50 61 67 65 72  ger)).    pPager
19b50 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
19b60 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
19b70 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70  Unlink the old p
19b80 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
19b90 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68  e list and the h
19ba0 61 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  ash table.  */. 
19bb0 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29   unlinkPage(pPg)
19bc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
19bd0 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20 20 2a  >pgno==0 );..  *
19be0 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65  ppPg = pPg;.  re
19bf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19c00 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
19c10 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
19c20 41 4e 41 47 45 4d 45 4e 54 0a 2f 2a 0a 2a 2a 20  ANAGEMENT./*.** 
19c30 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
19c40 20 63 61 6c 6c 65 64 20 74 6f 20 66 72 65 65 20   called to free 
19c50 73 75 70 65 72 66 6c 75 6f 75 73 20 64 79 6e 61  superfluous dyna
19c60 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
19c70 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64  d memory.** held
19c80 20 62 79 20 74 68 65 20 70 61 67 65 72 20 73 79   by the pager sy
19c90 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20  stem. Memory in 
19ca0 75 73 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74  use by any SQLit
19cb0 65 20 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65  e pager allocate
19cc0 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72  d.** by the curr
19cd0 65 6e 74 20 74 68 72 65 61 64 20 6d 61 79 20 62  ent thread may b
19ce0 65 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  e sqlite3_free()
19cf0 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69  ed..**.** nReq i
19d00 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
19d10 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
19d20 72 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20 74  required. Once t
19d30 68 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20  his much has.** 
19d40 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20 74  been released, t
19d50 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
19d60 72 6e 73 2e 20 54 68 65 20 72 65 74 75 72 6e 20  rns. The return 
19d70 76 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f 74  value is the tot
19d80 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66  al number .** of
19d90 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
19da0 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 69 6e   released..*/.in
19db0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
19dc0 6c 65 61 73 65 4d 65 6d 6f 72 79 28 69 6e 74 20  leaseMemory(int 
19dd0 6e 52 65 71 29 7b 0a 20 20 69 6e 74 20 6e 52 65  nReq){.  int nRe
19de0 6c 65 61 73 65 64 20 3d 20 30 3b 20 20 20 20 20  leased = 0;     
19df0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
19e00 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64   memory released
19e10 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 73 71 6c   so far */.  sql
19e20 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
19e30 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  x;       /* The 
19e40 4d 45 4d 32 20 6d 75 74 65 78 20 2a 2f 0a 20 20  MEM2 mutex */.  
19e50 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
19e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
19e70 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
19e80 70 61 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  pagers */.  int 
19e90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19ea0 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68  .  /* Acquire th
19eb0 65 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d  e memory-managem
19ec0 65 6e 74 20 6d 75 74 65 78 0a 20 20 2a 2f 0a 20  ent mutex.  */. 
19ed0 20 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33   mutex = sqlite3
19ee0 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
19ef0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
19f00 5f 4d 45 4d 32 29 3b 0a 20 20 73 71 6c 69 74 65  _MEM2);.  sqlite
19f10 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
19f20 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 67 6e  tex);..  /* Sign
19f30 61 6c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  al all database 
19f40 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
19f50 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65   memory manageme
19f60 6e 74 20 77 61 6e 74 73 0a 20 20 2a 2a 20 74 6f  nt wants.  ** to
19f70 20 68 61 76 65 20 61 63 63 65 73 73 20 74 6f 20   have access to 
19f80 74 68 65 20 70 61 67 65 72 73 2e 0a 20 20 2a 2f  the pagers..  */
19f90 0a 20 20 66 6f 72 28 70 50 61 67 65 72 3d 73 71  .  for(pPager=sq
19fa0 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 20  lite3PagerList; 
19fb0 70 50 61 67 65 72 3b 20 70 50 61 67 65 72 3d 70  pPager; pPager=p
19fc0 50 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  Pager->pNext){. 
19fd0 20 20 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55      pPager->iInU
19fe0 73 65 4d 4d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  seMM = 1;.  }.. 
19ff0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
1a000 54 45 5f 4f 4b 20 26 26 20 28 6e 52 65 71 3c 30  TE_OK && (nReq<0
1a010 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52   || nReleased<nR
1a020 65 71 29 20 29 7b 0a 20 20 20 20 50 67 48 64 72  eq) ){.    PgHdr
1a030 20 2a 70 50 67 3b 0a 20 20 20 20 50 67 48 64 72   *pPg;.    PgHdr
1a040 20 2a 70 52 65 63 79 63 6c 65 64 3b 0a 20 0a 20   *pRecycled;. . 
1a050 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e     /* Try to fin
1a060 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79  d a page to recy
1a070 63 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  cle that does no
1a080 74 20 72 65 71 75 69 72 65 20 61 20 73 79 6e 63  t require a sync
1a090 28 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 74 68  (). If.    ** th
1a0a0 69 73 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  is is not possib
1a0b0 6c 65 2c 20 66 69 6e 64 20 6f 6e 65 20 74 68 61  le, find one tha
1a0c0 74 20 64 6f 65 73 20 72 65 71 75 69 72 65 20 61  t does require a
1a0d0 20 73 79 6e 63 28 29 2e 0a 20 20 20 20 2a 2f 0a   sync()..    */.
1a0e0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1a0f0 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f  x_enter(sqlite3_
1a100 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
1a110 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
1a120 4c 52 55 29 29 3b 0a 20 20 20 20 70 50 67 20 3d  LRU));.    pPg =
1a130 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c   sqlite3LruPageL
1a140 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64  ist.pFirstSynced
1a150 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67  ;.    while( pPg
1a160 20 26 26 20 28 70 50 67 2d 3e 6e 65 65 64 53 79   && (pPg->needSy
1a170 6e 63 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65  nc || pPg->pPage
1a180 72 2d 3e 69 49 6e 55 73 65 44 42 29 20 29 7b 0a  r->iInUseDB) ){.
1a190 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d        pPg = pPg-
1a1a0 3e 67 66 72 65 65 2e 70 4e 65 78 74 3b 0a 20 20  >gfree.pNext;.  
1a1b0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 67    }.    if( !pPg
1a1c0 20 29 7b 0a 20 20 20 20 20 20 70 50 67 20 3d 20   ){.      pPg = 
1a1d0 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
1a1e0 73 74 2e 70 46 69 72 73 74 3b 0a 20 20 20 20 20  st.pFirst;.     
1a1f0 20 77 68 69 6c 65 28 20 70 50 67 20 26 26 20 70   while( pPg && p
1a200 50 67 2d 3e 70 50 61 67 65 72 2d 3e 69 49 6e 55  Pg->pPager->iInU
1a210 73 65 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  seDB ){.        
1a220 70 50 67 20 3d 20 70 50 67 2d 3e 67 66 72 65 65  pPg = pPg->gfree
1a230 2e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  .pNext;.      }.
1a240 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1a250 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
1a260 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
1a270 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1a280 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 0a 20 20  TATIC_LRU));..  
1a290 20 20 2f 2a 20 49 66 20 70 50 67 3d 3d 30 2c 20    /* If pPg==0, 
1a2a0 74 68 65 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61  then the block a
1a2b0 62 6f 76 65 20 68 61 73 20 66 61 69 6c 65 64 20  bove has failed 
1a2c0 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 74  to find a page t
1a2d0 6f 0a 20 20 20 20 2a 2a 20 72 65 63 79 63 6c 65  o.    ** recycle
1a2e0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72  . In this case r
1a2f0 65 74 75 72 6e 20 65 61 72 6c 79 20 2d 20 6e 6f  eturn early - no
1a300 20 66 75 72 74 68 65 72 20 6d 65 6d 6f 72 79 20   further memory 
1a310 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72  will.    ** be r
1a320 65 6c 65 61 73 65 64 2e 0a 20 20 20 20 2a 2f 0a  eleased..    */.
1a330 20 20 20 20 69 66 28 20 21 70 50 67 20 29 20 62      if( !pPg ) b
1a340 72 65 61 6b 3b 0a 0a 20 20 20 20 70 50 61 67 65  reak;..    pPage
1a350 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1a360 0a 20 20 20 20 61 73 73 65 72 74 28 21 70 50 67  .    assert(!pPg
1a370 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70 50  ->needSync || pP
1a380 67 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  g==pPager->lru.p
1a390 46 69 72 73 74 29 3b 0a 20 20 20 20 61 73 73 65  First);.    asse
1a3a0 72 74 28 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  rt(pPg->needSync
1a3b0 20 7c 7c 20 70 50 67 3d 3d 70 50 61 67 65 72 2d   || pPg==pPager-
1a3c0 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65  >lru.pFirstSynce
1a3d0 64 29 3b 0a 20 20 0a 20 20 20 20 72 63 20 3d 20  d);.  .    rc = 
1a3e0 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50  pager_recycle(pP
1a3f0 61 67 65 72 2c 20 31 2c 20 26 70 52 65 63 79 63  ager, 1, &pRecyc
1a400 6c 65 64 29 3b 0a 20 20 20 20 61 73 73 65 72 74  led);.    assert
1a410 28 70 52 65 63 79 63 6c 65 64 3d 3d 70 50 67 20  (pRecycled==pPg 
1a420 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
1a430 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1a440 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a450 20 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e 64    /* We've found
1a460 20 61 20 70 61 67 65 20 74 6f 20 66 72 65 65 2e   a page to free.
1a470 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
1a480 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
1a490 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76   .      ** remov
1a4a0 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
1a4b0 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65   hash-table, fre
1a4c0 65 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65  e-list and synce
1a4d0 64 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 2a 2a  d-list .      **
1a4e0 20 28 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e   (pFirstSynced).
1a4f0 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20   It is still in 
1a500 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70  the all pages (p
1a510 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20  All) list. .    
1a520 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20 66    ** Remove it f
1a530 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 62 65  rom this list be
1a540 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a 20 20  fore freeing..  
1a550 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1a560 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65 20  Todo: Check the 
1a570 50 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73 74  Pager.pStmt list
1a580 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
1a590 69 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20  is is Ok. It .  
1a5a0 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
1a5b0 69 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20 20  is though..     
1a5c0 20 2a 2f 0a 20 20 20 20 20 20 50 67 48 64 72 20   */.      PgHdr 
1a5d0 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 61 73 73  *pTmp;.      ass
1a5e0 65 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20  ert( pPg );.    
1a5f0 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65    if( pPg==pPage
1a600 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20  r->pAll ){.     
1a610 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c      pPager->pAll
1a620 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
1a630 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1a640 20 20 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70         for( pTmp
1a650 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
1a660 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70  Tmp->pNextAll!=p
1a670 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70  Pg; pTmp=pTmp->p
1a680 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20  NextAll ){}.    
1a690 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41      pTmp->pNextA
1a6a0 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  ll = pPg->pNextA
1a6b0 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
1a6c0 20 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 28    nReleased += (
1a6d0 0a 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f  .          sizeo
1a6e0 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72  f(*pPg) + pPager
1a6f0 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20  ->pageSize.     
1a700 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33       + sizeof(u3
1a710 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  2) + pPager->nEx
1a720 74 72 61 0a 20 20 20 20 20 20 20 20 20 20 2b 20  tra.          + 
1a730 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48  MEMDB*sizeof(PgH
1a740 69 73 74 6f 72 79 29 20 0a 20 20 20 20 20 20 29  istory) .      )
1a750 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
1a760 28 22 50 47 46 52 45 45 20 25 70 20 25 64 20 2a  ("PGFREE %p %d *
1a770 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
1a780 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
1a790 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
1a7a0 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f  e3_pager_pgfree_
1a7b0 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  count);.      sq
1a7c0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b  lite3_free(pPg);
1a7d0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
1a7e0 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73  Page--;.    }els
1a7f0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  e{.      /* An e
1a800 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69  rror occured whi
1a810 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
1a820 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1a830 20 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f   or .      ** jo
1a840 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f 72  urnal in pager_r
1a850 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20 65 72  ecycle(). The er
1a860 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74 75 72  ror is not retur
1a870 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20 20  ned to the .    
1a880 20 20 2a 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74    ** caller of t
1a890 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e  his function. In
1a8a0 73 74 65 61 64 2c 20 73 65 74 20 74 68 65 20 50  stead, set the P
1a8b0 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72  ager.errCode var
1a8c0 69 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20  iable..      ** 
1a8d0 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  The error will b
1a8e0 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  e returned to th
1a8f0 65 20 75 73 65 72 20 28 6f 72 20 75 73 65 72 73  e user (or users
1a900 2c 20 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20  , in the case . 
1a910 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61       ** of a sha
1a920 72 65 64 20 70 61 67 65 72 20 63 61 63 68 65 29  red pager cache)
1a930 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 6f   of the pager fo
1a940 72 20 77 68 69 63 68 20 74 68 65 20 65 72 72 6f  r which the erro
1a950 72 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20  r occured..     
1a960 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1a970 28 0a 20 20 20 20 20 20 20 20 20 20 28 72 63 26  (.          (rc&
1a980 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
1a990 45 52 52 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ERR ||.         
1a9a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c   rc==SQLITE_FULL
1a9b0 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 72 63   ||.          rc
1a9c0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 0a 20 20  ==SQLITE_BUSY.  
1a9d0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
1a9e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1a9f0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
1aa00 45 44 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65  ED );.      page
1aa10 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
1aa20 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
1aa30 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 6d    /* Clear the m
1aa40 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74  emory management
1aa50 20 66 6c 61 67 73 20 61 6e 64 20 72 65 6c 65 61   flags and relea
1aa60 73 65 20 74 68 65 20 6d 75 74 65 78 0a 20 20 2a  se the mutex.  *
1aa70 2f 0a 20 20 66 6f 72 28 70 50 61 67 65 72 3d 73  /.  for(pPager=s
1aa80 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b  qlite3PagerList;
1aa90 20 70 50 61 67 65 72 3b 20 70 50 61 67 65 72 3d   pPager; pPager=
1aaa0 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  pPager->pNext){.
1aab0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 69 49 6e       pPager->iIn
1aac0 55 73 65 4d 4d 20 3d 20 30 3b 0a 20 20 7d 0a 20  UseMM = 0;.  }. 
1aad0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1aae0 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 0a 20 20  eave(mutex);..  
1aaf0 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  /* Return the nu
1ab00 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
1ab10 6c 65 61 73 65 64 0a 20 20 2a 2f 0a 20 20 72 65  leased.  */.  re
1ab20 74 75 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a  turn nReleased;.
1ab30 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1ab40 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
1ab50 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a 0a  _MANAGEMENT */..
1ab60 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63  /*.** Read the c
1ab70 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 70  ontent of page p
1ab80 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61  Pg out of the da
1ab90 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
1aba0 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44  static int readD
1abb0 62 50 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  bPage(Pager *pPa
1abc0 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 2c  ger, PgHdr *pPg,
1abd0 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
1abe0 6e 74 20 72 63 3b 0a 20 20 69 36 34 20 6f 66 66  nt rc;.  i64 off
1abf0 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  set;.  assert( M
1ac00 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 61 73 73  EMDB==0 );.  ass
1ac10 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e  ert(pPager->fd->
1ac20 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72  pMethods||pPager
1ac30 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69  ->tempFile);.  i
1ac40 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e  f( !pPager->fd->
1ac50 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
1ac60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1ac70 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a  ERR_SHORT_READ;.
1ac80 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 28    }.  offset = (
1ac90 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
1aca0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1acb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
1acc0 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
1acd0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1ace0 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
1acf0 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20  Size, offset);. 
1ad00 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
1ad10 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
1ad20 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52  _count);.  PAGER
1ad30 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
1ad40 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ead);.  IOTRACE(
1ad50 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c  ("PGIN %p %d\n",
1ad60 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
1ad70 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29  .  if( pgno==1 )
1ad80 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  {.    memcpy(&pP
1ad90 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1ada0 2c 20 26 28 28 75 38 2a 29 50 47 48 44 52 5f 54  , &((u8*)PGHDR_T
1adb0 4f 5f 44 41 54 41 28 70 50 67 29 29 5b 32 34 5d  O_DATA(pPg))[24]
1adc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adf0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1ae00 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d  bFileVers));.  }
1ae10 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
1ae20 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
1ae30 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  pPg), pPg->pgno,
1ae40 20 33 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43   3);.  PAGERTRAC
1ae50 45 34 28 22 46 45 54 43 48 20 25 64 20 70 61 67  E4("FETCH %d pag
1ae60 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
1ae70 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1ae80 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1ae90 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
1aea0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
1aeb0 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  g));.  return rc
1aec0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
1aed0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1aee0 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  led to obtain th
1aef0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65  e shared lock re
1af00 71 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a  quired before.**
1af10 20 64 61 74 61 20 6d 61 79 20 62 65 20 72 65 61   data may be rea
1af20 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  d from the pager
1af30 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 73   cache. If the s
1af40 68 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61  hared lock has a
1af50 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f  lready.** been o
1af60 62 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75  btained, this fu
1af70 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
1af80 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61  p..**.** Immedia
1af90 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69  tely after obtai
1afa0 6e 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ning the shared 
1afb0 6c 6f 63 6b 20 28 69 66 20 72 65 71 75 69 72 65  lock (if require
1afc0 64 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  d), this functio
1afd0 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72 20  n.** checks for 
1afe0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
1aff0 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f  le. If one is fo
1b000 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63  und, an emergenc
1b010 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73  y rollback.** is
1b020 20 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64   performed immed
1b030 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  iately..*/.stati
1b040 63 20 69 6e 74 20 70 61 67 65 72 53 68 61 72 65  c int pagerShare
1b050 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  dLock(Pager *pPa
1b060 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
1b070 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
1b080 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1b090 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
1b0a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
1b0b0 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
1b0c0 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 66 28 20  ->pVfs;.    if( 
1b0d0 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
1b0e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b0f0 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20  nRef==0 );.     
1b100 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
1b110 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  Readlock ){.    
1b120 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1b130 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
1b140 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
1b150 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1b160 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b170 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1b180 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
1b190 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
1b1a0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
1b1b0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1b1c0 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
1b1d0 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
1b1e0 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
1b1f0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61  l file exists, a
1b200 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52  nd there is no R
1b210 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
1b220 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
1b230 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
1b240 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
1b250 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
1b260 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
1b270 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1b280 28 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  ( hasHotJournal(
1b290 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
1b2a0 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
1b2b0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1b2c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b2d0 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
1b2e0 69 74 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a  it is.        **
1b2f0 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
1b300 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
1b310 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
1b320 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
1b330 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 58 43  e.        ** EXC
1b340 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
1b350 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72  it were, another
1b360 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f   process might o
1b370 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20  pen the.        
1b380 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1b390 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53  , detect the RES
1b3a0 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20  ERVED lock, and 
1b3b0 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68  conclude that th
1b3c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
1b3d0 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
1b3e0 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
1b3f0 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
1b400 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20  l rolling it .  
1b410 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20        ** back.. 
1b420 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20         ** .     
1b430 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
1b440 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52  e intermediate R
1b450 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
1b460 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 74  not requested, t
1b470 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  he.        ** se
1b480 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c  cond process wil
1b490 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f  l get to this po
1b4a0 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
1b4b0 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20  and fail to.    
1b4c0 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74      ** obtain it
1b4d0 27 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  's own EXCLUSIVE
1b4e0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1b4f0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
1b500 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
1b510 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
1b520 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58  k(pPager->fd, EX
1b530 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
1b540 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1b550 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b560 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f        pager_unlo
1b570 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1b580 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
1b590 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
1b5a0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc);.        }.
1b5b0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1b5c0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
1b5d0 43 4c 55 53 49 56 45 3b 0a 20 0a 20 20 20 20 20  CLUSIVE;. .     
1b5e0 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
1b5f0 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69  ournal for readi
1b600 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e  ng only.  Return
1b610 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a   SQLITE_BUSY if.
1b620 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72          ** we ar
1b630 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e  e unable to open
1b640 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b650 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  e. .        **. 
1b660 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f         ** The jo
1b670 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
1b680 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
1b690 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54  ocked itself.  T
1b6a0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  he.        ** jo
1b6b0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65  urnal file is ne
1b6c0 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20  ver open unless 
1b6d0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1b6e0 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20  e file holds.   
1b6f0 20 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20       ** a write 
1b700 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69  lock, so there i
1b710 73 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e  s never any chan
1b720 63 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ce of two or mor
1b730 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  e.        ** pro
1b740 63 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74  cesses opening t
1b750 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68  he journal at th
1b760 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20  e same time..   
1b770 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1b780 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  ** Open the jour
1b790 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69  nal for read/wri
1b7a0 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20  te access. This 
1b7b0 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20  is because in . 
1b7c0 20 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73         ** exclus
1b7d0 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
1b7e0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
1b7f0 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
1b800 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20   open and.      
1b810 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73    ** possibly us
1b820 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  ed for a transac
1b830 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f  tion later on. O
1b840 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20  n some systems, 
1b850 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  the.        ** O
1b860 73 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c  sTruncate() call
1b870 20 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69   used in exclusi
1b880 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61  ve-access mode a
1b890 6c 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20  lso requires.   
1b8a0 20 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77       ** a read/w
1b8b0 72 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  rite file handle
1b8c0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1b8d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b8e0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 69  _BUSY;.        i
1b8f0 66 28 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  f( sqlite3OsAcce
1b900 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  ss(pVfs, pPager-
1b910 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
1b920 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 29  E_ACCESS_EXISTS)
1b930 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
1b940 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
1b950 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
1b960 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
1b970 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
1b980 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
1b990 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1b9a0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
1b9b0 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  pFile );.       
1b9c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1b9d0 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
1b9e0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
1b9f0 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
1ba00 2c 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20  ,&fout);.       
1ba10 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
1ba20 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
1ba30 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64  er->jfd->pMethod
1ba40 73 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  s );.          i
1ba50 66 28 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  f( fout&SQLITE_O
1ba60 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a  PEN_READONLY ){.
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1ba80 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1ba90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1baa0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
1bab0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
1bac0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1bad0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1bae0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1baf0 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
1bb00 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1bb10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1bb20 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
1bb30 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
1bb40 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
1bb50 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  1;.        pPage
1bb60 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
1bb70 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  d = 0;.        p
1bb80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1bb90 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  f = 0;.        p
1bba0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
1bbb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
1bbc0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1bbd0 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 20 20   = 0;. .        
1bbe0 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20  /* Playback and 
1bbf0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
1bc00 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61  al.  Drop the da
1bc10 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20  tabase write.   
1bc20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
1bc30 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
1bc40 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  ead lock..      
1bc50 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
1bc60 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
1bc70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
1bc80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1bc90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1bca0 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
1bcb0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
1bcc0 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c);.        }.  
1bcd0 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
1bce0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1bcf0 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20 20 20  R_SHARED || .   
1bd00 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
1bd10 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
1bd20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
1bd30 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20  >PAGER_SHARED). 
1bd40 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1bd50 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  }..      if( pPa
1bd60 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20  ger->pAll ){.   
1bd70 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
1bd80 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74  ed-lock has just
1bd90 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f   been acquired o
1bda0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1bdb0 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ile.        ** a
1bdc0 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72  nd there are alr
1bdd0 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68  eady pages in th
1bde0 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20  e cache (from a 
1bdf0 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20  previous.       
1be00 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74   ** read or writ
1be10 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  e transaction). 
1be20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1be30 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
1be40 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65        ** has bee
1be50 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20  n modified.  If 
1be60 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
1be70 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20   changed, flush 
1be80 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  the.        ** c
1be90 61 63 68 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ache..        **
1bea0 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 61 74 61  .        ** Data
1beb0 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20  base changes is 
1bec0 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b  detected by look
1bed0 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20  ing at 15 bytes 
1bee0 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20  beginning.      
1bef0 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32    ** at offset 2
1bf00 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  4 into the file.
1bf10 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66    The first 4 of
1bf20 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20   these 16 bytes 
1bf30 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  are.        ** a
1bf40 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20   32-bit counter 
1bf50 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  that is incremen
1bf60 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68  ted with each ch
1bf70 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ange.  The.     
1bf80 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65     ** other byte
1bf90 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c  s change randoml
1bfa0 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65  y with each file
1bfb0 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20   change when.   
1bfc0 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20       ** a codec 
1bfd0 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20  is in use..     
1bfe0 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a     ** .        *
1bff0 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e  * There is a van
1c000 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63  ishingly small c
1c010 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61  hance that a cha
1c020 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nge will not be 
1c030 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 65 74 65  .        ** dete
1c040 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63  cted.  The chanc
1c050 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74  e of an undetect
1c060 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20  ed change is so 
1c070 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20  small that.     
1c080 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
1c090 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20  neglected..     
1c0a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68     */.        ch
1c0b0 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69  ar dbFileVers[si
1c0c0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1c0d0 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20  ileVers)];.     
1c0e0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50     sqlite3PagerP
1c0f0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
1c100 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ;..        if( p
1c110 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
1c120 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1c130 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
1c140 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  de;.        }.. 
1c150 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1c160 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20  r->dbSize>0 ){. 
1c170 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
1c180 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c  (("CKVERS %p %d\
1c190 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65  n", pPager, size
1c1a0 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29  of(dbFileVers)))
1c1b0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1c1c0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
1c1d0 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
1c1e0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
1c1f0 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
1c200 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1c210 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c220 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1c230 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
1c240 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1c250 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73  {.          mems
1c260 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30  et(dbFileVers, 0
1c270 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
1c280 65 72 73 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  ers));.        }
1c290 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 65  ..        if( me
1c2a0 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
1c2b0 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
1c2c0 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
1c2d0 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
1c2e0 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72           pager_r
1c2f0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1c300 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c310 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1c320 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  ( pPager->exclus
1c330 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
1c340 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45 52 5f  r->state<=PAGER_
1c350 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66  SHARED );.    if
1c360 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
1c370 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
1c380 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
1c390 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
1c3a0 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RED;.    }.  }..
1c3b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c3c0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
1c3d0 20 50 67 48 64 72 20 6f 62 6a 65 63 74 2e 20 20   PgHdr object.  
1c3e0 20 45 69 74 68 65 72 20 63 72 65 61 74 65 20 61   Either create a
1c3f0 20 6e 65 77 20 6f 6e 65 20 6f 72 20 72 65 75 73   new one or reus
1c400 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67  e.** an existing
1c410 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e 6f 74   one that is not
1c420 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75 73   otherwise in us
1c430 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 50  e..**.** A new P
1c440 67 48 64 72 20 73 74 72 75 63 74 75 72 65 20 69  gHdr structure i
1c450 73 20 63 72 65 61 74 65 64 20 69 66 20 61 6e 79  s created if any
1c460 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1c470 67 20 61 72 65 0a 2a 2a 20 74 72 75 65 3a 0a 2a  g are.** true:.*
1c480 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65  *.**     (1)  We
1c490 20 68 61 76 65 20 6e 6f 74 20 65 78 63 65 65 64   have not exceed
1c4a0 65 64 20 6f 75 72 20 6d 61 78 69 6d 75 6d 20 61  ed our maximum a
1c4b0 6c 6c 6f 63 61 74 65 64 20 63 61 63 68 65 20 73  llocated cache s
1c4c0 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ize.**          
1c4d0 61 73 20 73 65 74 20 62 79 20 74 68 65 20 22 50  as set by the "P
1c4e0 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
1c4f0 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  " command..**.**
1c500 20 20 20 20 20 28 32 29 20 20 54 68 65 72 65 20       (2)  There 
1c510 61 72 65 20 6e 6f 20 75 6e 75 73 65 64 20 50 67  are no unused Pg
1c520 48 64 72 20 6f 62 6a 65 63 74 73 20 61 76 61 69  Hdr objects avai
1c530 6c 61 62 6c 65 20 61 74 20 74 68 69 73 20 74 69  lable at this ti
1c540 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33  me..**.**     (3
1c550 29 20 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  )  This is an in
1c560 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1c570 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20  ..**.**     (4) 
1c580 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 50 67   There are no Pg
1c590 48 64 72 20 6f 62 6a 65 63 74 73 20 74 68 61 74  Hdr objects that
1c5a0 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20   do not require 
1c5b0 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  a journal.**    
1c5c0 20 20 20 20 20 20 66 69 6c 65 20 73 79 6e 63 20        file sync 
1c5d0 61 6e 64 20 61 20 73 79 6e 63 20 6f 66 20 74 68  and a sync of th
1c5e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1c5f0 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20  s currently.**  
1c600 20 20 20 20 20 20 20 20 70 72 6f 68 69 62 69 74          prohibit
1c610 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  ed..**.** Otherw
1c620 69 73 65 2c 20 72 65 75 73 65 20 61 6e 20 65 78  ise, reuse an ex
1c630 69 73 74 69 6e 67 20 50 67 48 64 72 2e 20 20 49  isting PgHdr.  I
1c640 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
1c650 65 75 73 65 20 61 6e 0a 2a 2a 20 65 78 69 73 74  euse an.** exist
1c660 69 6e 67 20 50 67 48 64 72 20 69 66 20 61 6c 6c  ing PgHdr if all
1c670 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1c680 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
1c690 2a 20 20 20 20 20 28 31 29 20 20 57 65 20 68 61  *     (1)  We ha
1c6a0 76 65 20 72 65 61 63 68 65 64 20 6f 72 20 65 78  ve reached or ex
1c6b0 63 65 65 64 65 64 20 74 68 65 20 6d 61 78 69 6d  ceeded the maxim
1c6c0 75 6d 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a  um cache size.**
1c6d0 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65            allowe
1c6e0 64 20 62 79 20 22 50 52 41 47 4d 41 20 63 61 63  d by "PRAGMA cac
1c6f0 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20  he_size"..**.** 
1c700 20 20 20 20 28 32 29 20 20 54 68 65 72 65 20 69      (2)  There i
1c710 73 20 61 20 50 67 48 64 72 20 61 76 61 69 6c 61  s a PgHdr availa
1c720 62 6c 65 20 77 69 74 68 20 50 67 48 64 72 2d 3e  ble with PgHdr->
1c730 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20 20  nRef==0.**.**   
1c740 20 20 28 33 29 20 20 57 65 20 61 72 65 20 6e 6f    (3)  We are no
1c750 74 20 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  t in an in-memor
1c760 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a  y database.**.**
1c770 20 20 20 20 20 28 34 29 20 20 45 69 74 68 65 72       (4)  Either
1c780 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 76 61   there is an ava
1c790 69 6c 61 62 6c 65 20 50 67 48 64 72 20 74 68 61  ilable PgHdr tha
1c7a0 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 0a  t does not need.
1c7b0 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 62  **          to b
1c7c0 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  e synced to disk
1c7d0 20 6f 72 20 65 6c 73 65 20 64 69 73 6b 20 73 79   or else disk sy
1c7e0 6e 63 69 6e 67 20 69 73 20 63 75 72 72 65 6e 74  ncing is current
1c7f0 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61  ly.**          a
1c800 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  llowed..*/.stati
1c810 63 20 69 6e 74 20 70 61 67 65 72 41 6c 6c 6f 63  c int pagerAlloc
1c820 61 74 65 50 61 67 65 28 50 61 67 65 72 20 2a 70  atePage(Pager *p
1c830 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 2a 70  Pager, PgHdr **p
1c840 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pPg){.  int rc =
1c850 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67   SQLITE_OK;.  Pg
1c860 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20  Hdr *pPg;..  /* 
1c870 43 72 65 61 74 65 20 61 20 6e 65 77 20 50 67 48  Create a new PgH
1c880 64 72 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  dr if any of the
1c890 20 66 6f 75 72 20 63 6f 6e 64 69 74 69 6f 6e 73   four conditions
1c8a0 20 64 65 66 69 6e 65 64 20 0a 20 20 2a 2a 20 61   defined .  ** a
1c8b0 62 6f 76 65 20 61 72 65 20 6d 65 74 3a 20 2a 2f  bove are met: */
1c8c0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
1c8d0 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50  Page<pPager->mxP
1c8e0 61 67 65 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  age.   || pPager
1c8f0 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3d 3d 30 20  ->lru.pFirst==0 
1c900 0a 20 20 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20  .   || MEMDB.   
1c910 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e  || (pPager->lru.
1c920 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20  pFirstSynced==0 
1c930 26 26 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  && pPager->doNot
1c940 53 79 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20 69  Sync).  ){.    i
1c950 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  f( pPager->nPage
1c960 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20  >=pPager->nHash 
1c970 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  ){.      pager_r
1c980 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65  esize_hash_table
1c990 28 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20  (pPager,.       
1c9a0 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3c    pPager->nHash<
1c9b0 32 35 36 20 3f 20 32 35 36 20 3a 20 70 50 61 67  256 ? 256 : pPag
1c9c0 65 72 2d 3e 6e 48 61 73 68 2a 32 29 3b 0a 20 20  er->nHash*2);.  
1c9d0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1c9e0 6e 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20  nHash==0 ){.    
1c9f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ca00 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67  NOMEM;.        g
1ca10 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61  oto pager_alloca
1ca20 74 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  te_out;.      }.
1ca30 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 4c      }.    pagerL
1ca40 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
1ca50 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 5f    pPg = sqlite3_
1ca60 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
1ca70 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70  pPg) + pPager->p
1ca80 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20  ageSize.        
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caa0 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32      + sizeof(u32
1cab0 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
1cac0 72 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ra.             
1cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
1cae0 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67   MEMDB*sizeof(Pg
1caf0 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20  History) );.    
1cb00 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
1cb10 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 3d  r);.    if( pPg=
1cb20 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1cb30 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1cb40 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
1cb50 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20  allocate_out;.  
1cb60 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
1cb70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  Pg, 0, sizeof(*p
1cb80 50 67 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45  Pg));.    if( ME
1cb90 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  MDB ){.      mem
1cba0 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 48 49 53  set(PGHDR_TO_HIS
1cbb0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20  T(pPg, pPager), 
1cbc0 30 2c 20 73 69 7a 65 6f 66 28 50 67 48 69 73 74  0, sizeof(PgHist
1cbd0 6f 72 79 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ory));.    }.   
1cbe0 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
1cbf0 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e  Pager;.    pPg->
1cc00 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65  pNextAll = pPage
1cc10 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 70 50 61  r->pAll;.    pPa
1cc20 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b  ger->pAll = pPg;
1cc30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61  .    pPager->nPa
1cc40 67 65 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ge++;.  }else{. 
1cc50 20 20 20 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e     /* Recycle an
1cc60 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 77   existing page w
1cc70 69 74 68 20 61 20 7a 65 72 6f 20 72 65 66 2d 63  ith a zero ref-c
1cc80 6f 75 6e 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ount. */.    rc 
1cc90 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  = pager_recycle(
1cca0 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 29  pPager, 1, &pPg)
1ccb0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1ccc0 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
1ccd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
1cce0 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20  OERR_BLOCKED;.  
1ccf0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
1cd00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cd10 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c     goto pager_al
1cd20 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20  locate_out;.    
1cd30 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
1cd40 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41  ager->state>=SHA
1cd50 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
1cd60 61 73 73 65 72 74 28 70 50 67 29 3b 0a 20 20 7d  assert(pPg);.  }
1cd70 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a  .  *ppPg = pPg;.
1cd80 0a 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f  .pager_allocate_
1cd90 6f 75 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  out:.  return rc
1cda0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1cdb0 73 75 72 65 20 77 65 20 68 61 76 65 20 74 68 65  sure we have the
1cdc0 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 20 70   content for a p
1cdd0 61 67 65 2e 20 20 49 66 20 74 68 65 20 70 61 67  age.  If the pag
1cde0 65 20 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75  e was.** previou
1cdf0 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74  sly acquired wit
1ce00 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20  h noContent==1, 
1ce10 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  then the content
1ce20 20 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69 6e 69   was.** just ini
1ce30 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
1ce40 73 20 69 6e 73 74 65 61 64 20 6f 66 20 62 65 69  s instead of bei
1ce50 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  ng read from dis
1ce60 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20 77 65  k..** But now we
1ce70 20 6e 65 65 64 20 74 68 65 20 72 65 61 6c 20 64   need the real d
1ce80 61 74 61 20 6f 66 66 20 6f 66 20 64 69 73 6b 2e  ata off of disk.
1ce90 20 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 77    So make sure w
1cea0 65 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20 20 52  e.** have it.  R
1ceb0 65 61 64 20 69 74 20 69 6e 20 69 66 20 77 65 20  ead it in if we 
1cec0 64 6f 20 6e 6f 74 20 68 61 76 65 20 69 74 20 61  do not have it a
1ced0 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61 74 69  lready..*/.stati
1cee0 63 20 69 6e 74 20 70 61 67 65 72 5f 67 65 74 5f  c int pager_get_
1cef0 63 6f 6e 74 65 6e 74 28 50 67 48 64 72 20 2a 70  content(PgHdr *p
1cf00 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
1cf10 6e 65 65 64 52 65 61 64 20 29 7b 0a 20 20 20 20  needRead ){.    
1cf20 69 6e 74 20 72 63 20 3d 20 72 65 61 64 44 62 50  int rc = readDbP
1cf30 61 67 65 28 70 50 67 2d 3e 70 50 61 67 65 72 2c  age(pPg->pPager,
1cf40 20 70 50 67 2c 20 70 50 67 2d 3e 70 67 6e 6f 29   pPg, pPg->pgno)
1cf50 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1cf60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1cf70 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d   pPg->needRead =
1cf80 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1cf90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1cfa0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1cfb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1cfc0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
1cfd0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72   page..**.** A r
1cfe0 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
1cff0 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74  disk file is obt
1d000 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66  ained when the f
1d010 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63 71  irst page is acq
1d020 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20  uired. .** This 
1d030 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f  read lock is dro
1d040 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61  pped when the la
1d050 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
1d060 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  sed..**.** This 
1d070 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f  routine works fo
1d080 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65  r any page numbe
1d090 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  r greater than 0
1d0a0 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
1d0b0 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d  se.** file is sm
1d0c0 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
1d0d0 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74  equested page, t
1d0e0 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69  hen no actual di
1d0f0 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72  sk.** read occur
1d100 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79  s and the memory
1d110 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61   image of the pa
1d120 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
1d130 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f  d to.** all zero
1d140 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61  s.  The extra da
1d150 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
1d160 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
1d170 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74  initialized.** t
1d180 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73  o zeros the firs
1d190 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
1d1a0 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
1d1b0 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ory..**.** The a
1d1c0 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74  cquisition might
1d1d0 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61   fail for severa
1d1e0 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61  l reasons.  In a
1d1f0 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20  ll cases,.** an 
1d200 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
1d210 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1d220 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69  ed and *ppPage i
1d230 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
1d240 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
1d250 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
1d260 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
1d270 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75  outine and Looku
1d280 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
1d290 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
1d2a0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
1d2b0 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
1d2c0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
1d2d0 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
1d2e0 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
1d2f0 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
1d300 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
1d310 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a  ereas Lookup().*
1d320 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30  * just returns 0
1d330 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1d340 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  acquires a read-
1d350 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  lock the first t
1d360 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f  ime it.** has to
1d370 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64   go to disk, and
1d380 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79   could also play
1d390 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  back an old jour
1d3a0 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
1d3b0 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75  ..** Since Looku
1d3c0 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74  p() never goes t
1d3d0 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72  o disk, it never
1d3e0 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74   has to deal wit
1d3f0 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f  h locks.** or jo
1d400 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
1d410 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
1d420 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70 61  is false, the pa
1d430 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
1d440 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72  actually read fr
1d450 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 6e  om disk..** If n
1d460 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
1d470 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1d480 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
1d490 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  bout the content
1d4a0 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  s.** of the page
1d4b0 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 73   at this time, s
1d4c0 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61 20 64 69  o do not do a di
1d4d0 73 6b 20 72 65 61 64 2e 20 20 4a 75 73 74 20 66  sk read.  Just f
1d4e0 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61  ill in the.** pa
1d4f0 67 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  ge content with 
1d500 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d 61 72 6b  zeros.  But mark
1d510 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 77   the fact that w
1d520 65 20 68 61 76 65 20 6e 6f 74 20 72 65 61 64 20  e have not read 
1d530 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 62  the.** content b
1d540 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67  y setting the Pg
1d550 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61  Hdr.needRead fla
1d560 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c 20 69 66  g.  Later on, if
1d570 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65   .** sqlite3Page
1d580 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
1d590 65 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65 20  ed on this page 
1d5a0 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  or if this routi
1d5b0 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  ne is.** called 
1d5c0 61 67 61 69 6e 20 77 69 74 68 20 6e 6f 43 6f 6e  again with noCon
1d5d0 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74 20 6d 65  tent==0, that me
1d5e0 61 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ans that the con
1d5f0 74 65 6e 74 20 69 73 20 6e 65 65 64 65 64 0a 2a  tent is needed.*
1d600 2a 20 61 6e 64 20 74 68 65 20 64 69 73 6b 20 72  * and the disk r
1d610 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
1d620 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
1d630 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1d640 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61  gerAcquire(.  Pa
1d650 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
1d660 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
1d670 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
1d680 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
1d690 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
1d6a0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
1d6b0 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
1d6c0 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
1d6d0 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
1d6e0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
1d6f0 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
1d700 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20  noContent       
1d710 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
1d720 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74   reading content
1d730 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72   from disk if tr
1d740 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72  ue */.){.  PgHdr
1d750 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b   *pPg;.  int rc;
1d760 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1d770 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
1d780 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65  _UNLOCK || pPage
1d790 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e  r->nRef>0 || pgn
1d7a0 6f 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  o==1 );..  /* Th
1d7b0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e  e maximum page n
1d7c0 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52  umber is 2^31. R
1d7d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1d7e0 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20  RUPT if a page. 
1d7f0 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74   ** number great
1d800 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72  er than this, or
1d810 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65 73   zero, is reques
1d820 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ted..  */.  if( 
1d830 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
1d840 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c  GNO || pgno==0 |
1d850 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
1d860 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
1d870 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d880 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1d890 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
1d8a0 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74  sure we have not
1d8b0 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61   hit any critica
1d8c0 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a  l errors..  */ .
1d8d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d8e0 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65  !=0 );.  *ppPage
1d8f0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
1d900 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
1d910 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
1d920 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
1d930 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
1d940 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a  ->errCode;.  }..
1d950 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1d960 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61  the first page a
1d970 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65  ccessed, then ge
1d980 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a  t a SHARED lock.
1d990 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
1d9a0 62 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72  base file. pager
1d9b0 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20  SharedLock() is 
1d9c0 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a  a no-op if .  **
1d9d0 20 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b   a database lock
1d9e0 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
1d9f0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
1da00 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50  gerSharedLock(pP
1da10 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
1da20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1da30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1da40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1da50 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1da60 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70 50 67  UNLOCK );..  pPg
1da70 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
1da80 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
1da90 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
1daa0 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
1dab0 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
1dac0 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
1dad0 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d  e. */.    int nM
1dae0 61 78 3b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20  ax;.    int h;. 
1daf0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
1db00 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20  ager->nMiss);.  
1db10 20 20 72 63 20 3d 20 70 61 67 65 72 41 6c 6c 6f    rc = pagerAllo
1db20 63 61 74 65 50 61 67 65 28 70 50 61 67 65 72 2c  catePage(pPager,
1db30 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20   &pPg);.    if( 
1db40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1db50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1db60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67  ;.    }..    pPg
1db70 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
1db80 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
1db90 42 20 7c 7c 20 70 67 6e 6f 3e 70 50 61 67 65 72  B || pgno>pPager
1dba0 2d 3e 73 74 6d 74 53 69 7a 65 20 29 3b 0a 20 20  ->stmtSize );.  
1dbb0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
1dbc0 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74  nJournal && (int
1dbd0 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f  )pgno<=pPager->o
1dbe0 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 23 69 66  rigDbSize ){.#if
1dbf0 20 30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   0.      sqlite3
1dc00 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67  CheckMemory(pPag
1dc10 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->aInJournal, 
1dc20 70 67 6e 6f 2f 38 29 3b 0a 23 65 6e 64 69 66 0a  pgno/8);.#endif.
1dc30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1dc40 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1dc50 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  n );.      pPg->
1dc60 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61  inJournal = (pPa
1dc70 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
1dc80 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
1dc90 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20  gno&7)))!=0;.   
1dca0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
1dcb0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1dcc0 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
1dcd0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
1dce0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
1dcf0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d   0;.    }..    m
1dd00 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
1dd10 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31     pPg->nRef = 1
1dd20 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50  ;.    REFINFO(pP
1dd30 67 29 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d  g);..    pPager-
1dd40 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28  >nRef++;.    if(
1dd50 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e   pPager->nExtra>
1dd60 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0 ){.      memse
1dd70 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  t(PGHDR_TO_EXTRA
1dd80 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30  (pPg, pPager), 0
1dd90 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
1dda0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61  );.    }.    nMa
1ddb0 78 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  x = sqlite3Pager
1ddc0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1ddd0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1dde0 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
1ddf0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1de00 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
1de10 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
1de20 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 72 65  rrCode;.      re
1de30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
1de40 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
1de50 74 68 65 20 70 61 67 65 20 77 69 74 68 20 64 61  the page with da
1de60 74 61 2c 20 65 69 74 68 65 72 20 62 79 20 72 65  ta, either by re
1de70 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64  ading from the d
1de80 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
1de90 69 6c 65 2c 20 6f 72 20 62 79 20 73 65 74 74 69  ile, or by setti
1dea0 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  ng the entire pa
1deb0 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20  ge to zero..    
1dec0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c  */.    if( nMax<
1ded0 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d  (int)pgno || MEM
1dee0 44 42 20 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74  DB || (noContent
1def0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77   && !pPager->alw
1df00 61 79 73 52 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a  aysRollback) ){.
1df10 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
1df20 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
1df30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1df40 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
1df50 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1df60 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
1df70 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
1df80 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
1df90 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
1dfa0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1dfb0 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20    pPg->needRead 
1dfc0 3d 20 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21  = noContent && !
1dfd0 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
1dfe0 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 49 4f  llback;.      IO
1dff0 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20  TRACE(("ZERO %p 
1e000 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1e010 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gno));.    }else
1e020 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  {.      rc = rea
1e030 64 44 62 50 61 67 65 28 70 50 61 67 65 72 2c 20  dDbPage(pPager, 
1e040 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg, pgno);.    
1e050 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e060 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
1e070 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1e080 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  AD ){.        pP
1e090 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20  g->pgno = 0;.   
1e0a0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1e0b0 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
1e0c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1e0d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
1e0e0 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b  g->needRead = 0;
1e0f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
1e100 69 6e 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74  ink the page int
1e110 6f 20 74 68 65 20 70 61 67 65 20 68 61 73 68 20  o the page hash 
1e120 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d  table */.    h =
1e130 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d   pgno & (pPager-
1e140 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 61  >nHash-1);.    a
1e150 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
1e160 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
1e170 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
1e180 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61  Hash[h];.    pPa
1e190 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
1e1a0 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
1e1b0 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
1e1c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
1e1d0 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
1e1e0 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
1e1f0 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
1e200 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
1e210 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  Pg;.    }..#ifde
1e220 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1e230 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
1e240 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
1e250 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
1e260 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
1e270 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
1e280 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68  ed page is in th
1e290 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
1e2a0 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67  .    assert(pPag
1e2b0 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67  er->nRef>0 || pg
1e2c0 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45  no==1);.    PAGE
1e2d0 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
1e2e0 48 69 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e  Hit);.    if( !n
1e2f0 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
1e300 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74    rc = pager_get
1e310 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20  _content(pPg);. 
1e320 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1e330 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1e340 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e350 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67      page_ref(pPg
1e360 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  );.  }.  *ppPage
1e370 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e   = pPg;.  return
1e380 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e   SQLITE_OK;.}.in
1e390 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  t sqlite3PagerAc
1e3a0 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
1e3b0 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
1e3c0 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
1e3d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1e3e0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
1e3f0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
1e400 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
1e410 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
1e420 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
1e430 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
1e440 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
1e450 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  e */.  int noCon
1e460 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f  tent       /* Do
1e470 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64   not bother read
1e480 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ing content from
1e490 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f   disk if true */
1e4a0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
1e4b0 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
1e4c0 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  r);.  rc = pager
1e4d0 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20  Acquire(pPager, 
1e4e0 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  pgno, ppPage, no
1e4f0 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 61 67 65  Content);.  page
1e500 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
1e510 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e520 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
1e530 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
1e540 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
1e550 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
1e560 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
1e570 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
1e580 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
1e590 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
1e5a0 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
1e5b0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
1e5c0 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  cache..**.** See
1e5d0 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
1e5e0 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69  erGet().  The di
1e5f0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
1e600 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1e610 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
1e620 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  rGet() is that _
1e630 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
1e640 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
1e650 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
1e660 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
1e670 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
1e680 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
1e690 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
1e6a0 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
1e6b0 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
1e6c0 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
1e6d0 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
1e6e0 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
1e6f0 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65  /.DbPage *sqlite
1e700 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67  3PagerLookup(Pag
1e710 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
1e720 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
1e730 2a 70 50 67 20 3d 20 30 3b 0a 0a 20 20 61 73 73  *pPg = 0;..  ass
1e740 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
1e750 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
1e760 21 3d 30 20 29 3b 0a 0a 20 20 70 61 67 65 72 45  !=0 );..  pagerE
1e770 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
1e780 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1e790 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
1e7a0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
1e7b0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20  pPager->pAll || 
1e7c0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
1e7d0 65 4d 6f 64 65 20 29 3b 0a 20 20 7d 65 6c 73 65  eMode );.  }else
1e7e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1e7f0 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
1e800 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
1e810 46 55 4c 4c 20 29 7b 0a 20 20 20 20 2f 2a 20 44  FULL ){.    /* D
1e820 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d  o nothing */.  }
1e830 65 6c 73 65 20 69 66 28 20 28 70 50 67 20 3d 20  else if( (pPg = 
1e840 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
1e850 67 65 72 2c 20 70 67 6e 6f 29 29 21 3d 30 20 29  ger, pgno))!=0 )
1e860 7b 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70  {.    page_ref(p
1e870 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
1e880 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
1e890 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a   return pPg;.}..
1e8a0 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
1e8b0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  page..**.** If t
1e8c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
1e8d0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
1e8e0 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
1e8f0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
1e900 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
1e910 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
1e920 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
1e930 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
1e940 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
1e950 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
1e960 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
1e970 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
1e980 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
1e990 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1e9a0 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
1e9b0 50 67 29 7b 0a 0a 20 20 2f 2a 20 44 65 63 72 65  Pg){..  /* Decre
1e9c0 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
1e9d0 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69  ce count for thi
1e9e0 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 61 73  s page.  */.  as
1e9f0 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
1ea00 30 20 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65  0 );.  pagerEnte
1ea10 72 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a  r(pPg->pPager);.
1ea20 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pPg->nRef--;. 
1ea30 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a   REFINFO(pPg);..
1ea40 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
1ea50 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68  );..  /* When th
1ea60 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
1ea70 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65  rences to a page
1ea80 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74   reach 0, call t
1ea90 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74  he.  ** destruct
1eaa0 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20 70  or and add the p
1eab0 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c  age to the freel
1eac0 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
1ead0 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
1eae0 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
1eaf0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1eb00 0a 0a 20 20 20 20 6c 72 75 4c 69 73 74 41 64 64  ..    lruListAdd
1eb10 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 70  (pPg);.    if( p
1eb20 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
1eb30 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  or ){.      pPag
1eb40 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28  er->xDestructor(
1eb50 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  pPg, pPager->pag
1eb60 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
1eb70 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c  .    /* When all
1eb80 20 70 61 67 65 73 20 72 65 61 63 68 20 74 68 65   pages reach the
1eb90 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20   freelist, drop 
1eba0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72  the read lock fr
1ebb0 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  om.    ** the da
1ebc0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
1ebd0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
1ebe0 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65  nRef--;.    asse
1ebf0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  rt( pPager->nRef
1ec00 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  >=0 );.    if( p
1ec10 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26  Pager->nRef==0 &
1ec20 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  & (!pPager->excl
1ec30 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
1ec40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
1ec50 30 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  0) ){.      page
1ec60 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
1ec70 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1ec80 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61  }.  }.  pagerLea
1ec90 76 65 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b  ve(pPg->pPager);
1eca0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1ecb0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
1ecc0 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66  eate a journal f
1ecd0 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20  ile for pPager. 
1ece0 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c   There should al
1ecf0 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
1ed00 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53  VED.** or EXCLUS
1ed10 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1ed20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
1ed30 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1ed40 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
1ed50 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1ed60 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e  K if everything.
1ed70 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
1ed80 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61  r code and relea
1ed90 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20  se the.** write 
1eda0 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67  lock if anything
1edb0 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
1edc0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1edd0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
1ede0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1edf0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1ee00 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
1ee10 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ;.  int flags = 
1ee20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
1ee30 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
1ee40 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
1ee50 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
1ee60 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ;..  int rc;.  a
1ee70 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
1ee80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1ee90 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1eea0 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73  RESERVED );.  as
1eeb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1eec0 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
1eed0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1eee0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
1eef0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ef00 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
1ef10 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
1ef20 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1ef30 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65  r);.  pagerLeave
1ef40 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
1ef50 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
1ef60 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
1ef70 72 6f 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ro( pPager->dbSi
1ef80 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 70 61  ze/8 + 1 );.  pa
1ef90 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
1efa0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1efb0 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  aInJournal==0 ){
1efc0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1efd0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
1efe0 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f   failed_to_open_
1eff0 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20  journal;.  }..  
1f000 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
1f010 46 69 6c 65 20 29 7b 0a 20 20 20 20 66 6c 61 67  File ){.    flag
1f020 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  s |= (SQLITE_OPE
1f030 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c  N_DELETEONCLOSE|
1f040 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1f050 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 7d 65 6c  _JOURNAL);.  }el
1f060 73 65 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d  se{.    flags |=
1f070 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   (SQLITE_OPEN_MA
1f080 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 7d  IN_JOURNAL);.  }
1f090 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1f0a0 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
1f0b0 54 45 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  TE.  rc = sqlite
1f0c0 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20  3JournalOpen(.  
1f0d0 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
1f0e0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
1f0f0 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
1f100 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
1f110 50 61 67 65 72 29 0a 20 20 29 3b 0a 23 65 6c 73  Pager).  );.#els
1f120 65 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  e.  rc = sqlite3
1f130 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
1f140 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
1f150 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
1f160 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  s, 0);.#endif.  
1f170 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
1f180 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
1f190 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  >jfd->pMethods )
1f1a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
1f1b0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  nalOff = 0;.  pP
1f1c0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
1f1d0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  = 0;.  pPager->j
1f1e0 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
1f1f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f200 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
1f210 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
1f220 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
1f230 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
1f240 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
1f250 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  0);.    }.    go
1f260 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
1f270 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20  n_journal;.  }. 
1f280 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1f290 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67  Open = 1;.  pPag
1f2a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
1f2b0 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ed = 0;.  pPager
1f2c0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
1f2d0 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
1f2e0 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  Rollback = 0;.  
1f2f0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
1f300 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1f310 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
1f320 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
1f330 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61  ode;.    goto fa
1f340 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
1f350 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  rnal;.  }.  pPag
1f360 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
1f370 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
1f380 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f  ..  rc = writeJo
1f390 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
1f3a0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
1f3b0 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26  >stmtAutoopen &&
1f3c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f3d0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1f3e0 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e  e3PagerStmtBegin
1f3f0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
1f400 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f410 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
1f420 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20  NOMEM ){.    rc 
1f430 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
1f440 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
1f450 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1f460 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f470 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
1f480 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1f490 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64  turn rc;..failed
1f4a0 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
1f4b0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
1f4c0 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
1f4d0 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
1f4e0 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  aInJournal = 0;.
1f4f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f500 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
1f510 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1f520 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
1f530 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64   lock is removed
1f540 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79   when.** the any
1f550 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1f560 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20  g happen:.**.** 
1f570 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
1f580 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
1f590 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
1f5a0 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
1f5b0 72 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63  rRollback() is c
1f5c0 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
1f5d0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
1f5e0 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
1f5f0 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
1f600 65 72 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c  erUnref() is cal
1f610 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20  led to on every 
1f620 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
1f630 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
1f640 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  t parameter to t
1f650 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1f660 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20   pointer to any 
1f670 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65  open page of the
1f680 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
1f690 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e  e.  Nothing chan
1f6a0 67 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61  ges about the pa
1f6b0 67 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20  ge - it is used 
1f6c0 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71  merely to.** acq
1f6d0 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74  uire a pointer t
1f6e0 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
1f6f0 63 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f  cture and as pro
1f700 6f 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73  of that there is
1f710 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65  .** already a re
1f720 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad-lock on the d
1f730 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
1f740 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
1f750 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f  ter indicates ho
1f760 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20  w much space in 
1f770 62 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65  bytes to reserve
1f780 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72   for a.** master
1f790 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61   journal file-na
1f7a0 6d 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  me at the start 
1f7b0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
1f7c0 68 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65  hen it is create
1f7d0 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e  d..**.** A journ
1f7e0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
1f7f0 64 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74  d if this is not
1f800 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
1f810 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  e.  For temporar
1f820 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20  y.** files, the 
1f830 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a  opening of the j
1f840 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64  ournal file is d
1f850 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68  eferred until th
1f860 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74  ere is an.** act
1f870 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74  ual need to writ
1f880 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
1f890 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
1f8a0 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
1f8b0 64 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  dy reserved for 
1f8c0 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f  writing, this ro
1f8d0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1f8e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61  ..**.** If exFla
1f8f0 67 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68  g is true, go ah
1f900 65 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45  ead and get an E
1f910 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1f920 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d   the file.** imm
1f930 65 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64  ediately instead
1f940 20 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69   of waiting unti
1f950 6c 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73  l we try to flus
1f960 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68  h the cache.  Th
1f970 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69  e.** exFlag is i
1f980 67 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e  gnored if a tran
1f990 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
1f9a0 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e  dy active..*/.in
1f9b0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
1f9c0 67 69 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c  gin(DbPage *pPg,
1f9d0 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20   int exFlag){.  
1f9e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1f9f0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
1fa00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1fa10 4b 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  K;.  pagerEnter(
1fa20 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72  pPager);.  asser
1fa30 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
1fa40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1fa50 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1fa60 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  _UNLOCK );.  if(
1fa70 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1fa80 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a  PAGER_SHARED ){.
1fa90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1faa0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
1fab0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  0 );.    if( MEM
1fac0 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  DB ){.      pPag
1fad0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1fae0 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  R_EXCLUSIVE;.   
1faf0 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44     pPager->origD
1fb00 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
1fb10 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73  dbSize;.    }els
1fb20 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
1fb30 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
1fb40 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44  er->fd, RESERVED
1fb50 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
1fb60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1fb70 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1fb80 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
1fb90 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20  _RESERVED;.     
1fba0 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b     if( exFlag ){
1fbb0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1fbc0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
1fbd0 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
1fbe0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
1fbf0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1fc00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1fc10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1fc20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
1fc30 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  er);.        ret
1fc40 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1fc50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69        pPager->di
1fc60 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
1fc70 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
1fc80 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
1fc90 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1fca0 65 72 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  er));.      if( 
1fcb0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1fcc0 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  al && !pPager->t
1fcd0 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
1fce0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
1fcf0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
1fd00 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
1fd10 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  }.  }else if( pP
1fd20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1fd30 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  n && pPager->jou
1fd40 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
1fd50 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
1fd60 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  s when the pager
1fd70 20 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76   was in exclusiv
1fd80 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 6c 61  e-access mode la
1fd90 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61  st.    ** time a
1fda0 20 28 72 65 61 64 20 6f 72 20 77 72 69 74 65 29   (read or write)
1fdb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
1fdc0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
1fdd0 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62  ncluded.    ** b
1fde0 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  y this connectio
1fdf0 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65  n. Instead of de
1fe00 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  leting the journ
1fe10 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a  al file it was .
1fe20 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e      ** kept open
1fe30 20 61 6e 64 20 74 72 75 6e 63 61 74 65 64 20 74   and truncated t
1fe40 6f 20 30 20 62 79 74 65 73 2e 0a 20 20 20 20 2a  o 0 bytes..    *
1fe50 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
1fe60 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b  ager->nRec==0 );
1fe70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1fe80 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d  ger->origDbSize=
1fe90 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1fea0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
1feb0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 73  rnal==0 );.    s
1fec0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1fed0 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
1fee0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
1fef0 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
1ff00 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->aInJournal = s
1ff10 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
1ff20 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1ff30 2f 38 20 2b 20 31 20 29 3b 0a 20 20 20 20 70 61  /8 + 1 );.    pa
1ff40 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
1ff50 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
1ff60 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b  r->aInJournal ){
1ff70 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1ff80 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
1ff90 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
1ffa0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
1ffb0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1ffc0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1ffd0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
1ffe0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
1fff0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
20000 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
20010 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20020 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49  ff>0 || rc!=SQLI
20030 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65 72  TE_OK );.  pager
20040 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
20050 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20060 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65  *.** Make a page
20070 20 64 69 72 74 79 2e 20 20 53 65 74 20 69 74 73   dirty.  Set its
20080 20 64 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20   dirty flag and 
20090 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 64 69  add it to the di
200a0 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74  rty.** page list
200b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
200c0 20 6d 61 6b 65 44 69 72 74 79 28 50 67 48 64 72   makeDirty(PgHdr
200d0 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
200e0 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20  g->dirty==0 ){. 
200f0 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
20100 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
20110 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
20120 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69   1;.    pPg->pDi
20130 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 44  rty = pPager->pD
20140 69 72 74 79 3b 0a 20 20 20 20 69 66 28 20 70 50  irty;.    if( pP
20150 61 67 65 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a  ager->pDirty ){.
20160 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44        pPager->pD
20170 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79  irty->pPrevDirty
20180 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
20190 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74    pPg->pPrevDirt
201a0 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
201b0 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b  r->pDirty = pPg;
201c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
201d0 6b 65 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e  ke a page clean.
201e0 20 20 43 6c 65 61 72 20 69 74 73 20 64 69 72 74    Clear its dirt
201f0 79 20 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65  y bit and remove
20200 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20   it from the.** 
20210 64 69 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e  dirty page list.
20220 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
20230 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20  makeClean(PgHdr 
20240 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
20250 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 70  ->dirty ){.    p
20260 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
20270 20 20 20 69 66 28 20 70 50 67 2d 3e 70 44 69 72     if( pPg->pDir
20280 74 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ty ){.      asse
20290 72 74 28 20 70 50 67 2d 3e 70 44 69 72 74 79 2d  rt( pPg->pDirty-
202a0 3e 70 50 72 65 76 44 69 72 74 79 3d 3d 70 50 67  >pPrevDirty==pPg
202b0 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   );.      pPg->p
202c0 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74  Dirty->pPrevDirt
202d0 79 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69  y = pPg->pPrevDi
202e0 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  rty;.    }.    i
202f0 66 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72  f( pPg->pPrevDir
20300 74 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ty ){.      asse
20310 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69  rt( pPg->pPrevDi
20320 72 74 79 2d 3e 70 44 69 72 74 79 3d 3d 70 50 67  rty->pDirty==pPg
20330 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   );.      pPg->p
20340 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74  PrevDirty->pDirt
20350 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b  y = pPg->pDirty;
20360 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20370 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
20380 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3d 3d 70  Pager->pDirty==p
20390 50 67 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  Pg );.      pPg-
203a0 3e 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20  >pPager->pDirty 
203b0 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20  = pPg->pDirty;. 
203c0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a     }.  }.}.../*.
203d0 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70  ** Mark a data p
203e0 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
203f0 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77  .  The page is w
20400 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
20410 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69  journal .** if i
20420 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
20430 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f  lready.  This ro
20440 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
20450 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69  lled before maki
20460 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  ng.** changes to
20470 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54   a page..**.** T
20480 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
20490 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
204a0 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  lled, the pager 
204b0 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a  creates a new.**
204c0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71   journal and acq
204d0 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44  uires a RESERVED
204e0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
204f0 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52  abase.  If the R
20500 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
20510 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71  could not be acq
20520 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74  uired, this rout
20530 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
20540 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a  TE_BUSY.  The.**
20550 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
20560 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20   must check for 
20570 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75  that return valu
20580 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  e and be careful
20590 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67   not to.** chang
205a0 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
205b0 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69  until this routi
205c0 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
205d0 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
205e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
205f0 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69  could not be wri
20600 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65  tten because the
20610 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a   disk is full,.*
20620 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * then this rout
20630 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
20640 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73  TE_FULL and does
20650 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f   an immediate ro
20660 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73  llback..** All s
20670 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20  ubsequent write 
20680 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65  attempts also re
20690 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
206a0 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20   until there.** 
206b0 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  is a call to sql
206c0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28  ite3PagerCommit(
206d0 29 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65  ) or sqlite3Page
206e0 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a  rRollback() to.*
206f0 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  * reset..*/.stat
20700 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
20710 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  te(PgHdr *pPg){.
20720 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
20730 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
20740 67 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g);.  Pager *pPa
20750 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
20760 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
20770 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43  LITE_OK;..  /* C
20780 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a  heck for errors.
20790 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
207a0 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a 20  r->errCode ){ . 
207b0 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
207c0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20  ->errCode;.  }. 
207d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61   if( pPager->rea
207e0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74  dOnly ){.    ret
207f0 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
20800 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
20810 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
20820 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  er );..  CHECK_P
20830 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
20840 49 66 20 74 68 69 73 20 70 61 67 65 20 77 61 73  If this page was
20850 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75   previously acqu
20860 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74  ired with noCont
20870 65 6e 74 3d 3d 31 2c 20 74 68 61 74 20 6d 65 61  ent==1, that mea
20880 6e 73 0a 20 20 2a 2a 20 77 65 20 64 69 64 6e 27  ns.  ** we didn'
20890 74 20 72 65 61 6c 6c 79 20 72 65 61 64 20 69 6e  t really read in
208a0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
208b0 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
208c0 63 61 6e 20 68 61 70 70 65 6e 0a 20 20 2a 2a 20  can happen.  ** 
208d0 28 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 77 68  (for example) wh
208e0 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 62  en the page is b
208f0 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74 68  eing moved to th
20900 65 20 66 72 65 65 6c 69 73 74 2e 20 20 42 75 74  e freelist.  But
20910 0a 20 20 2a 2a 20 6e 6f 77 20 77 65 20 61 72 65  .  ** now we are
20920 20 28 70 65 72 68 61 70 73 29 20 6d 6f 76 69 6e   (perhaps) movin
20930 67 20 74 68 65 20 70 61 67 65 20 6f 66 66 20 6f  g the page off o
20940 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 66  f the freelist f
20950 6f 72 0a 20 20 2a 2a 20 72 65 75 73 65 20 61 6e  or.  ** reuse an
20960 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  d we need to kno
20970 77 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  w its original c
20980 6f 6e 74 65 6e 74 20 73 6f 20 74 68 61 74 20 63  ontent so that c
20990 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 63 61 6e 20  ontent.  ** can 
209a0 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
209b0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
209c0 6c 2e 20 20 53 6f 20 64 6f 20 74 68 65 20 72 65  l.  So do the re
209d0 61 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20  ad at this.  ** 
209e0 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  time..  */.  rc 
209f0 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74  = pager_get_cont
20a00 65 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20  ent(pPg);.  if( 
20a10 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
20a20 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d   rc;.  }..  /* M
20a30 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
20a40 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70  dirty.  If the p
20a50 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
20a60 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a  been written.  *
20a70 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * to the journal
20a80 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74   then we can ret
20a90 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a  urn right away..
20aa0 20 20 2a 2f 0a 20 20 6d 61 6b 65 44 69 72 74 79    */.  makeDirty
20ab0 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67  (pPg);.  if( pPg
20ac0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
20ad0 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28  pageInStatement(
20ae0 70 50 67 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  pPg) || pPager->
20af0 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b  stmtInUse==0) ){
20b00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
20b10 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d  tyCache = 1;.  }
20b20 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66  else{..    /* If
20b30 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
20b40 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
20b50 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
20b60 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  o be.    ** writ
20b70 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73  ten to the trans
20b80 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f  action journal o
20b90 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74  r the ckeckpoint
20ba0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
20bb0 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a  or both..    **.
20bc0 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65      ** First che
20bd0 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74  ck to see that t
20be0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
20bf0 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e  ournal exists an
20c00 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20  d.    ** create 
20c10 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  it if it does no
20c20 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
20c30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
20c40 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
20c50 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  K );.    rc = sq
20c60 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
20c70 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  pPg, 0);.    if(
20c80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20c90 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
20ca0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
20cb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
20cc0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
20cd0 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ED );.    if( !p
20ce0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
20cf0 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73  en && pPager->us
20d00 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
20d10 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
20d20 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
20d30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
20d40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
20d50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
20d60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20d70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
20d80 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75   !pPager->useJou
20d90 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  rnal );.    pPag
20da0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
20db0 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68   1;.  .    /* Th
20dc0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
20dd0 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
20de0 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
20df0 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
20e00 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
20e10 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
20e20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
20e30 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
20e40 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
20e50 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
20e60 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
20e70 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
20e80 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
20e90 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  if( !pPg->inJour
20ea0 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e  nal && (pPager->
20eb0 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45  useJournal || ME
20ec0 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69 66  MDB) ){.      if
20ed0 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ( (int)pPg->pgno
20ee0 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
20ef0 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
20f00 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20    int szPg;.    
20f10 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
20f20 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 69 73  .          PgHis
20f30 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
20f40 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
20f50 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
20f60 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
20f70 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
20f80 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
20f90 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
20fa0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  no);.          a
20fb0 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f  ssert( pHist->pO
20fc0 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rig==0 );.      
20fd0 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67      pHist->pOrig
20fe0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
20ff0 63 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c( pPager->pageS
21000 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ize );.         
21010 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69   if( pHist->pOri
21020 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g ){.           
21030 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70   memcpy(pHist->p
21040 4f 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44  Orig, PGHDR_TO_D
21050 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
21060 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
21070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21090 20 20 75 33 32 20 63 6b 73 75 6d 2c 20 73 61 76    u32 cksum, sav
210a0 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ed;.          ch
210b0 61 72 20 2a 70 44 61 74 61 32 2c 20 2a 70 45 6e  ar *pData2, *pEn
210c0 64 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  d;..          /*
210d0 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   We should never
210e0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
210f0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70  urnal file the p
21100 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  age that.       
21110 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
21120 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
21130 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
21140 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65  g assert verifie
21150 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  s.          ** t
21160 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a  hat we do not. *
21170 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
21180 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50  rt( pPg->pgno!=P
21190 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
211a0 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ger) );.        
211b0 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43    pData2 = CODEC
211c0 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
211d0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a   pPg->pgno, 7);.
211e0 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20            cksum 
211f0 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
21200 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61  ager, (u8*)pData
21210 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45  2);.          pE
21220 6e 64 20 3d 20 70 44 61 74 61 32 20 2b 20 70 50  nd = pData2 + pP
21230 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
21240 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32            pData2
21250 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20   -= 4;.         
21260 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29   saved = *(u32*)
21270 70 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20  pEnd;.          
21280 70 75 74 33 32 62 69 74 73 28 70 45 6e 64 2c 20  put32bits(pEnd, 
21290 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  cksum);.        
212a0 20 20 73 7a 50 67 20 3d 20 70 50 61 67 65 72 2d    szPg = pPager-
212b0 3e 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20  >pageSize+8;.   
212c0 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
212d0 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67  (pData2, pPg->pg
212e0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  no);.          r
212f0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
21300 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
21310 70 44 61 74 61 32 2c 20 73 7a 50 67 2c 20 70 50  pData2, szPg, pP
21320 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21330 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  );.          IOT
21340 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25  RACE(("JOUT %p %
21350 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  d %lld %d\n", pP
21360 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
21370 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21380 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
21390 6e 61 6c 4f 66 66 2c 20 73 7a 50 67 29 29 3b 0a  nalOff, szPg));.
213a0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 5f            PAGER_
213b0 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
213c0 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29  er_writej_count)
213d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
213e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
213f0 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20  = szPg;.        
21400 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4a    PAGERTRACE5("J
21410 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
21420 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61  d needSync=%d ha
21430 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
21440 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
21450 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
21460 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
21470 64 53 79 6e 63 2c 20 70 61 67 65 72 5f 70 61 67  dSync, pager_pag
21480 65 68 61 73 68 28 70 50 67 29 29 3b 0a 20 20 20  ehash(pPg));.   
21490 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29 70 45         *(u32*)pE
214a0 6e 64 20 3d 20 73 61 76 65 64 3b 0a 0a 20 20 20  nd = saved;..   
214b0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72         /* An err
214c0 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 77  or has occured w
214d0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
214e0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
214f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 72  .          ** tr
21500 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
21510 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79  e rolled back by
21520 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65   the layer above
21530 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
21540 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
21550 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21560 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
21570 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   rc;.          }
21580 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ..          pPag
21590 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
215a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
215b0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
215c0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
215d0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
215e0 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  nal[pPg->pgno/8]
215f0 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
21600 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o&7);.          
21610 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
21620 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
21630 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
21640 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
21650 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21660 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
21670 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
21680 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
21690 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
216a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
216b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 67  lse{.        pPg
216c0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
216d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
216e0 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d  rted && !pPager-
216f0 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20  >noSync;.       
21700 20 50 41 47 45 52 54 52 41 43 45 34 28 22 41 50   PAGERTRACE4("AP
21710 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20  PEND %d page %d 
21720 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
21730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21740 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
21750 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
21760 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20  >needSync);.    
21770 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
21780 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  g->needSync ){. 
21790 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
217a0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
217b0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e     }.      pPg->
217c0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
217d0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
217e0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
217f0 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
21800 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
21810 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a  not in it,.    *
21820 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
21830 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
21840 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
21850 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68  ournal.  Note th
21860 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  at.    ** the st
21870 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
21880 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66  format differs f
21890 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64  rom the standard
218a0 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a   journal format.
218b0 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69      ** in that i
218c0 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63  t omits the chec
218d0 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65  ksums and the he
218e0 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ader..    */.   
218f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
21900 74 49 6e 55 73 65 20 0a 20 20 20 20 20 26 26 20  tInUse .     && 
21910 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74  !pageInStatement
21920 28 70 50 67 29 20 0a 20 20 20 20 20 26 26 20 28  (pPg) .     && (
21930 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  int)pPg->pgno<=p
21940 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
21950 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73  .    ){.      as
21960 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
21970 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
21980 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
21990 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
219a0 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
219b0 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
219c0 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
219d0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
219e0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61  ager);.        a
219f0 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53  ssert( pHist->pS
21a00 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
21a10 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
21a20 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
21a30 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
21a40 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
21a50 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
21a60 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
21a70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20  y(pHist->pStmt, 
21a80 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
21a90 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
21aa0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Size);.        }
21ab0 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
21ac0 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE3("STMT-JOURN
21ad0 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
21ae0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
21af0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
21b00 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f         page_add_
21b10 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
21b20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
21b30 20 20 20 20 20 20 20 20 69 36 34 20 6f 66 66 73          i64 offs
21b40 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  et = pPager->stm
21b50 74 4e 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  tNRec*(4+pPager-
21b60 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
21b70 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
21b80 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
21b90 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
21ba0 6e 6f 2c 20 37 29 2d 34 3b 0a 20 20 20 20 20 20  no, 7)-4;.      
21bb0 20 20 70 75 74 33 32 62 69 74 73 28 70 44 61 74    put32bits(pDat
21bc0 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  a2, pPg->pgno);.
21bd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
21be0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
21bf0 65 72 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32  er->stfd, pData2
21c00 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
21c10 7a 65 2b 34 2c 20 6f 66 66 73 65 74 29 3b 0a 20  ze+4, offset);. 
21c20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
21c30 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E3("STMT-JOURNAL
21c40 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
21c50 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
21c60 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
21c70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
21c80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21c90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
21ca0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21cb0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
21cc0 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  c++;.        ass
21cd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
21ce0 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Stmt!=0 );.     
21cf0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
21d00 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
21d10 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
21d20 26 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  &7);.      }.   
21d30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64   }.  }..  /* Upd
21d40 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
21d50 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e   size and return
21d60 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
21d70 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
21d80 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
21d90 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
21da0 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70  Size<(int)pPg->p
21db0 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
21dc0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d  r->dbSize = pPg-
21dd0 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21  >pgno;.    if( !
21de0 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
21df0 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47  >dbSize==PENDING
21e00 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61  _BYTE/pPager->pa
21e10 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
21e20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b  pPager->dbSize++
21e30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
21e40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21e50 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
21e60 69 73 20 75 73 65 64 20 74 6f 20 6d 61 72 6b 20  is used to mark 
21e70 61 20 64 61 74 61 2d 70 61 67 65 20 61 73 20 77  a data-page as w
21e80 72 69 74 61 62 6c 65 2e 20 49 74 20 75 73 65 73  ritable. It uses
21e90 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72 69 74 65   .** pager_write
21ea0 28 29 20 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75  () to open a jou
21eb0 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 74  rnal file (if it
21ec0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
21ed0 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69  open).** and wri
21ee0 74 65 20 74 68 65 20 70 61 67 65 20 2a 70 44 61  te the page *pDa
21ef0 74 61 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ta to the journa
21f00 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  l..**.** The dif
21f10 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
21f20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
21f30 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  d pager_write() 
21f40 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
21f50 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65  function also de
21f60 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65  als with the spe
21f70 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20  cial case where 
21f80 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a  2 or more pages.
21f90 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67  ** fit on a sing
21fa0 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20  le disk sector. 
21fb0 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c  In this case all
21fc0 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67   co-resident pag
21fd0 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20  es.** must have 
21fe0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
21ff0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
22000 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
22010 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
22020 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61  3PagerWrite(DbPa
22030 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20  ge *pDbPage){.  
22040 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22050 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50  OK;..  PgHdr *pP
22060 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50  g = pDbPage;.  P
22070 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
22080 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67  Pg->pPager;.  Pg
22090 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f  no nPagePerSecto
220a0 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63  r = (pPager->sec
220b0 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e  torSize/pPager->
220c0 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 70 61  pageSize);..  pa
220d0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
220e0 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26  ;.  if( !MEMDB &
220f0 26 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  & nPagePerSector
22100 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  >1 ){.    Pgno n
22110 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20  PageCount;      
22120 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
22130 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
22140 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
22150 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20  .    Pgno pg1;  
22160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22170 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20  * First page of 
22180 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
22190 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f  s located on. */
221a0 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  .    int nPage; 
221b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
221c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
221d0 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  s starting at pg
221e0 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  1 to journal */.
221f0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
22200 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
22210 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  ;..    /* Set th
22220 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67  e doNotSync flag
22230 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62   to 1. This is b
22240 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74  ecause we cannot
22250 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c   allow a journal
22260 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74  .    ** header t
22270 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 74  o be written bet
22280 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a  ween the pages j
22290 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73  ournaled by this
222a0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a   function..    *
222b0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
222c0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d  ager->doNotSync=
222d0 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
222e0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b  ->doNotSync = 1;
222f0 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72  ..    /* This tr
22300 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74  ick assumes that
22310 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73   both the page-s
22320 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
22330 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61  ize are.    ** a
22340 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20  n integer power 
22350 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61  of 2. It sets va
22360 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68  riable pg1 to th
22370 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20  e identifier.   
22380 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
22390 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
223a0 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
223b0 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ed on..    */.  
223c0 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70    pg1 = ((pPg->p
223d0 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65  gno-1) & ~(nPage
223e0 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20  PerSector-1)) + 
223f0 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f 75  1;..    nPageCou
22400 6e 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  nt = sqlite3Page
22410 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
22420 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  r);.    if( pPg-
22430 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74  >pgno>nPageCount
22440 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
22450 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70  = (pPg->pgno - p
22460 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  g1)+1;.    }else
22470 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50   if( (pg1+nPageP
22480 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67  erSector-1)>nPag
22490 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
224a0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75  nPage = nPageCou
224b0 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65  nt+1-pg1;.    }e
224c0 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  lse{.      nPage
224d0 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f   = nPagePerSecto
224e0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  r;.    }.    ass
224f0 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20  ert(nPage>0);.  
22500 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50    assert(pg1<=pP
22510 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73  g->pgno);.    as
22520 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29  sert((pg1+nPage)
22530 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  >pPg->pgno);..  
22540 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
22550 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  Page && rc==SQLI
22560 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20  TE_OK; ii++){.  
22570 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67      Pgno pg = pg
22580 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64  1+ii;.      PgHd
22590 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20  r *pPage;.      
225a0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e  if( !pPager->aIn
225b0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 67 3d 3d 70  Journal || pg==p
225c0 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 0a 20 20 20  Pg->pgno || .   
225d0 20 20 20 20 20 20 20 70 67 3e 70 50 61 67 65 72         pg>pPager
225e0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 7c 7c 20  ->origDbSize || 
225f0 21 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  !(pPager->aInJou
22600 72 6e 61 6c 5b 70 67 2f 38 5d 26 28 31 3c 3c 28  rnal[pg/8]&(1<<(
22610 70 67 26 37 29 29 29 0a 20 20 20 20 20 20 29 20  pg&7))).      ) 
22620 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  {.        if( pg
22630 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
22640 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
22650 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22660 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
22670 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20  , pg, &pPage);. 
22680 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
22690 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
226a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
226b0 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
226c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
226d0 66 28 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79  f( pPage->needSy
226e0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
226f0 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
22700 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
22710 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
22720 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
22730 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
22740 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
22750 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61    }else if( (pPa
22760 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ge = pager_looku
22770 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 20 29  p(pPager, pg)) )
22780 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
22790 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  age->needSync ){
227a0 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53  .          needS
227b0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
227c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
227d0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
227e0 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66  PgHdr.needSync f
227f0 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61  lag is set for a
22800 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20  ny of the nPage 
22810 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74  pages .    ** st
22820 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74  arting at pg1, t
22830 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20  hen it needs to 
22840 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f  be set for all o
22850 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a  f them. Because.
22860 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74      ** writing t
22870 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e  o any of these n
22880 50 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64  Page pages may d
22890 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73  amage the others
228a0 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  , the.    ** jou
228b0 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63  rnal file must c
228c0 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20  ontain sync()ed 
228d0 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66  copies of all of
228e0 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66   them.    ** bef
228f0 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20  ore any of them 
22900 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f  can be written o
22910 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
22920 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
22930 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63      if( needSync
22940 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 69   ){.      for(ii
22950 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20  =0; ii<nPage && 
22960 6e 65 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29 7b  needSync; ii++){
22970 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a  .        PgHdr *
22980 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
22990 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 31  okup(pPager, pg1
229a0 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  +ii);.        if
229b0 28 20 70 50 61 67 65 20 29 20 70 50 61 67 65 2d  ( pPage ) pPage-
229c0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
229d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
229e0 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64  ert(pPager->need
229f0 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Sync);.    }..  
22a00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
22a10 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29  ->doNotSync==1 )
22a20 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
22a30 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d  NotSync = 0;.  }
22a40 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
22a50 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61  ager_write(pDbPa
22a60 67 65 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  ge);.  }.  pager
22a70 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
22a80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22a90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
22aa0 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76   if the page giv
22ab0 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
22ac0 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  nt was previousl
22ad0 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73  y passed.** to s
22ae0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
22af0 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ().  In other wo
22b00 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
22b10 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20   if it is ok.** 
22b20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f  to change the co
22b30 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
22b40 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  e..*/.#ifndef ND
22b50 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33  EBUG.int sqlite3
22b60 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
22b70 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
22b80 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72   return pPg->dir
22b90 74 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ty;.}.#endif..#i
22ba0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22bb0 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52  T_VACUUM./*.** R
22bc0 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65  eplace the conte
22bd0 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70  nt of a single p
22be0 61 67 65 20 77 69 74 68 20 74 68 65 20 69 6e 66  age with the inf
22bf0 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
22c00 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  third.** argumen
22c10 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
22c20 33 50 61 67 65 72 4f 76 65 72 77 72 69 74 65 28  3PagerOverwrite(
22c30 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
22c40 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a  gno pgno, void *
22c50 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
22c60 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pPg;.  int rc;.
22c70 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
22c80 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71  ager);.  rc = sq
22c90 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
22ca0 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67  ager, pgno, &pPg
22cb0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
22cc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
22cd0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
22ce0 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 69  rite(pPg);.    i
22cf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22d00 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
22d10 28 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  (sqlite3PagerGet
22d20 44 61 74 61 28 70 50 67 29 2c 20 70 44 61 74 61  Data(pPg), pData
22d30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
22d40 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ze);.    }.    s
22d50 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
22d60 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67  (pPg);.  }.  pag
22d70 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
22d80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22d90 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
22da0 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
22db0 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
22dc0 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20  ager that it is 
22dd0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
22de0 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e  .** write the in
22df0 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67  formation on pag
22e00 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68  e pPg back to th
22e10 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f  e disk, even tho
22e20 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65  ugh.** that page
22e30 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64   might be marked
22e40 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a   as dirty..**.**
22e50 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73   The overlying s
22e60 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61  oftware layer ca
22e70 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
22e80 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65   when all of the
22e90 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20   data.** on the 
22ea0 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e  given page is un
22eb0 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72  used.  The pager
22ec0 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20   marks the page 
22ed0 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74  as clean so.** t
22ee0 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
22ef0 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64  get written to d
22f00 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73  isk..**.** Tests
22f10 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20   show that this 
22f20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
22f30 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a  gether with the.
22f40 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  ** sqlite3PagerD
22f50 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65  ontRollback() be
22f60 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64  low, more than d
22f70 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a  ouble the speed.
22f80 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45  ** of large INSE
22f90 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e  RT operations an
22fa0 64 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20  d quadruple the 
22fb0 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44  speed of large D
22fc0 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68  ELETEs..**.** Wh
22fd0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
22fe0 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74  is called, set t
22ff0 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  he alwaysRollbac
23000 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a  k flag to true..
23010 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ** Subsequent ca
23020 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61  lls to sqlite3Pa
23030 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
23040 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70  ) for the same p
23050 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72  age.** will ther
23060 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65  eafter be ignore
23070 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  d.  This is nece
23080 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61  ssary to avoid a
23090 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72   problem.** wher
230a0 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61  e a page with da
230b0 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ta is added to t
230c0 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69  he freelist duri
230d0 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a  ng one part of.*
230e0 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * a transaction 
230f0 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f  then removed fro
23100 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  m the freelist d
23110 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61  uring a later pa
23120 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d  rt.** of the sam
23130 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
23140 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d  d reused for som
23150 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e  e other purpose.
23160 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20    When it.** is 
23170 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74  first added to t
23180 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69  he freelist, thi
23190 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
231a0 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65  led.  When reuse
231b0 64 2c 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  d,.** the sqlite
231c0 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
231d0 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20  ck() routine is 
231e0 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63  called.  But bec
231f0 61 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  ause the.** page
23200 20 63 6f 6e 74 61 69 6e 73 20 63 72 69 74 69 63   contains critic
23210 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c  al data, we stil
23220 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72  l need to be sur
23230 65 20 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f 6c  e it gets.** rol
23240 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74  led back in spit
23250 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  e of the sqlite3
23260 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
23270 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69  k() call..*/.voi
23280 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  d sqlite3PagerDo
23290 6e 74 57 72 69 74 65 28 44 62 50 61 67 65 20 2a  ntWrite(DbPage *
232a0 70 44 62 50 61 67 65 29 7b 0a 20 20 50 67 48 64  pDbPage){.  PgHd
232b0 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65  r *pPg = pDbPage
232c0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
232d0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
232e0 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20  ..  if( MEMDB ) 
232f0 72 65 74 75 72 6e 3b 0a 20 20 70 61 67 65 72 45  return;.  pagerE
23300 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
23310 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
23320 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  ack = 1;.  if( p
23330 50 67 2d 3e 64 69 72 74 79 20 26 26 20 21 70 50  Pg->dirty && !pP
23340 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
23350 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
23360 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
23370 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
23380 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
23390 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e  Size==(int)pPg->
233a0 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e  pgno && pPager->
233b0 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65  origDbSize<pPage
233c0 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
233d0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61     /* If this pa
233e0 67 65 73 20 69 73 20 74 68 65 20 6c 61 73 74 20  ges is the last 
233f0 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  page in the file
23400 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61   and the file ha
23410 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a  s grown.      **
23420 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
23430 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
23440 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72   then do NOT mar
23450 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
23460 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68  ean..      ** Wh
23470 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
23480 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d  file grows, we m
23490 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68  ust make sure th
234a0 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
234b0 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77  .      ** gets w
234c0 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20  ritten at least 
234d0 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68 65  once so that the
234e0 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20   disk file will 
234f0 62 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20  be the correct. 
23500 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66       ** size. If
23510 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74   you do not writ
23520 65 20 74 68 69 73 20 70 61 67 65 20 61 6e 64 20  e this page and 
23530 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
23540 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  file.      ** on
23550 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75   the disk ends u
23560 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c  p being too smal
23570 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64  l, that can lead
23580 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20   to database.   
23590 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e     ** corruption
235a0 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74   during the next
235b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
235c0 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65      */.    }else
235d0 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
235e0 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20  CE3("DONT_WRITE 
235f0 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
23600 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47  , pPg->pgno, PAG
23610 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
23620 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43       IOTRACE(("C
23630 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  LEAN %p %d\n", p
23640 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
23650 29 29 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65  )).      makeCle
23660 61 6e 28 70 50 67 29 3b 0a 23 69 66 64 65 66 20  an(pPg);.#ifdef 
23670 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
23680 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  ES.      pPg->pa
23690 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
236a0 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
236b0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ndif.    }.  }. 
236c0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
236d0 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  er);.}../*.** A 
236e0 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
236f0 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
23700 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72  ager that if a r
23710 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a  ollback occurs,.
23720 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  ** it is not nec
23730 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72  essary to restor
23740 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68  e the data on th
23750 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54  e given page.  T
23760 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61  his.** means tha
23770 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  t the pager does
23780 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63   not have to rec
23790 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61  ord the given pa
237a0 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c  ge in the.** rol
237b0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  lback journal..*
237c0 2a 0a 2a 2a 20 49 66 20 77 65 20 68 61 76 65 20  *.** If we have 
237d0 6e 6f 74 20 79 65 74 20 61 63 74 75 61 6c 6c 79  not yet actually
237e0 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
237f0 74 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 28  t of this page (
23800 69 66 0a 2a 2a 20 74 68 65 20 50 67 48 64 72 2e  if.** the PgHdr.
23810 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 69 73  needRead flag is
23820 20 73 65 74 29 20 74 68 65 6e 20 74 68 69 73 20   set) then this 
23830 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73 20  routine acts as 
23840 61 20 70 72 6f 6d 69 73 65 0a 2a 2a 20 74 68 61  a promise.** tha
23850 74 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  t we will never 
23860 6e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 65  need to read the
23870 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 6e   page content in
23880 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 20   the future..** 
23890 73 6f 20 74 68 65 20 6e 65 65 64 52 65 61 64 20  so the needRead 
238a0 66 6c 61 67 20 63 61 6e 20 62 65 20 63 6c 65 61  flag can be clea
238b0 72 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  red at this poin
238c0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
238d0 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
238e0 61 63 6b 28 44 62 50 61 67 65 20 2a 70 50 67 29  ack(DbPage *pPg)
238f0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
23900 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
23910 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ..  pagerEnter(p
23920 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74  Pager);.  assert
23930 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
23940 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
23950 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
23960 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
23970 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
23980 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
23990 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61  ack || pPager->a
239a0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c  lwaysRollback ||
239b0 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b   MEMDB ) return;
239c0 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a  .  if( !pPg->inJ
239d0 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70  ournal && (int)p
239e0 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
239f0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
23a00 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
23a10 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
23a20 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  !=0 );.    pPage
23a30 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50  r->aInJournal[pP
23a40 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
23a50 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
23a60 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
23a70 61 6c 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d  al = 1;.    pPg-
23a80 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20  >needRead = 0;. 
23a90 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
23aa0 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
23ab0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
23ac0 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
23ad0 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
23ae0 37 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 50 41  7);.    }.    PA
23af0 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f  GERTRACE3("DONT_
23b00 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64  ROLLBACK page %d
23b10 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e   of %d\n", pPg->
23b20 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
23b30 61 67 65 72 29 29 3b 0a 20 20 20 20 49 4f 54 52  ager));.    IOTR
23b40 41 43 45 28 28 22 47 41 52 42 41 47 45 20 25 70  ACE(("GARBAGE %p
23b50 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
23b60 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 7d 0a  pPg->pgno)).  }.
23b70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
23b80 6d 74 49 6e 55 73 65 20 0a 20 20 20 26 26 20 21  mtInUse .   && !
23b90 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28  pageInStatement(
23ba0 70 50 67 29 20 0a 20 20 20 26 26 20 28 69 6e 74  pPg) .   && (int
23bb0 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  )pPg->pgno<=pPag
23bc0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20  er->stmtSize .  
23bd0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
23be0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
23bf0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
23c00 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
23c10 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
23c20 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
23c30 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  t!=0 );.    pPag
23c40 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
23c50 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
23c60 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
23c70 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  }.  pagerLeave(p
23c80 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Pager);.}.../*.*
23c90 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
23ca0 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72  s called to incr
23cb0 65 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62 61  ement the databa
23cc0 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63  se file change-c
23cd0 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65  ounter,.** store
23ce0 64 20 61 74 20 62 79 74 65 20 32 34 20 6f 66 20  d at byte 24 of 
23cf0 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
23d00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
23d10 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
23d20 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50  ounter(Pager *pP
23d30 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65  ager, int isDire
23d40 63 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ct){.  PgHdr *pP
23d50 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e  gHdr;.  u32 chan
23d60 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e  ge_counter;.  in
23d70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
23d80 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ;..  if( !pPager
23d90 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
23da0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  e ){.    /* Open
23db0 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66   page 1 of the f
23dc0 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ile for writing.
23dd0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
23de0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
23df0 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29  ger, 1, &pPgHdr)
23e00 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
23e10 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
23e20 20 72 63 3b 0a 0a 20 20 20 20 69 66 28 20 21 69   rc;..    if( !i
23e30 73 44 69 72 65 63 74 20 29 7b 0a 20 20 20 20 20  sDirect ){.     
23e40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
23e50 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b  erWrite(pPgHdr);
23e60 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
23e70 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
23e80 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
23e90 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
23ea0 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
23eb0 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
23ec0 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
23ed0 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f  */.    change_co
23ee0 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47  unter = sqlite3G
23ef0 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 61  et4byte((u8*)pPa
23f00 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
23f10 3b 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75  ;.    change_cou
23f20 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33  nter++;.    put3
23f30 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 50 47  2bits(((char*)PG
23f40 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 48  HDR_TO_DATA(pPgH
23f50 64 72 29 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f  dr))+24, change_
23f60 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 69  counter);..    i
23f70 66 28 20 69 73 44 69 72 65 63 74 20 26 26 20 70  f( isDirect && p
23f80 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
23f90 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ods ){.      con
23fa0 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20  st void *zBuf = 
23fb0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
23fc0 67 48 64 72 29 3b 0a 20 20 20 20 20 20 72 63 20  gHdr);.      rc 
23fd0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
23fe0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75  (pPager->fd, zBu
23ff0 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
24000 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  ize, 0);.    }..
24010 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
24020 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  he page referenc
24030 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
24040 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
24050 64 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  dr);.    pPager-
24060 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
24070 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
24080 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24090 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
240a0 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70  e file for the p
240b0 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61  ager pPager. zMa
240c0 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74  ster points to t
240d0 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20  he name.** of a 
240e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
240f0 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
24100 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
24110 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a  the individual.*
24120 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
24130 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e  zMaster may be N
24140 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e  ULL, which is in
24150 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20  terpreted as no 
24160 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
24170 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61  l (a single data
24180 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
24190 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
241a0 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68  utine ensures th
241b0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
241c0 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69  s synced, all di
241d0 72 74 79 20 70 61 67 65 73 20 77 72 69 74 74 65  rty pages writte
241e0 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  n.** to the data
241f0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
24200 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24210 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79  synced. The only
24220 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72   thing that.** r
24230 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74  emains to commit
24240 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
24250 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
24260 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
24270 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75  or.** master jou
24280 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65  rnal file if spe
24290 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e  cified)..**.** N
242a0 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73  ote that if zMas
242b0 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20  ter==NULL, this 
242c0 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69  does not overwri
242d0 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61  te a previous va
242e0 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f  lue.** passed to
242f0 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72   an sqlite3Pager
24300 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
24310 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   call..**.** If 
24320 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e 63  parameter nTrunc
24330 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
24340 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  en the pager fil
24350 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74  e is truncated t
24360 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67 65  o.** nTrunc page
24370 73 20 28 74 68 69 73 20 69 73 20 75 73 65 64 20  s (this is used 
24380 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  by auto-vacuum d
24390 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e  atabases)..*/.in
243a0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  t sqlite3PagerCo
243b0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 50 61 67  mmitPhaseOne(Pag
243c0 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
243d0 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  t char *zMaster,
243e0 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a 20   Pgno nTrunc){. 
243f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24400 5f 4f 4b 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  _OK;..  PAGERTRA
24410 43 45 34 28 22 44 41 54 41 42 41 53 45 20 53 59  CE4("DATABASE SY
24420 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73  NC: File=%s zMas
24430 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64  ter=%s nTrunc=%d
24440 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67  \n", .      pPag
24450 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
24460 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b  Master, nTrunc);
24470 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
24480 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ager);..  /* If 
24490 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
244a0 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
244b0 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
244c0 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
244d0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
244e0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
244f0 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  n called, it is 
24500 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
24510 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
24520 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e!=PAGER_SYNCED 
24530 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  && !MEMDB && pPa
24540 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
24550 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
24560 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  g;..#ifdef SQLIT
24570 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
24580 57 52 49 54 45 0a 20 20 20 20 2f 2a 20 54 68 65  WRITE.    /* The
24590 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
245a0 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
245b0 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20 6f 66  e used if all of
245c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c   the.    ** foll
245d0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
245e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
245f0 20 2b 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74   + The file-syst
24600 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65 20  em supports the 
24610 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f  atomic-write pro
24620 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20 2a 2a  perty for.    **
24630 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20        blocks of 
24640 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20  size page-size, 
24650 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  and.    **    + 
24660 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e  This commit is n
24670 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  ot part of a mul
24680 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74  ti-file transact
24690 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ion, and.    ** 
246a0 20 20 20 2b 20 45 78 61 63 74 6c 79 20 6f 6e 65     + Exactly one
246b0 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 6d   page has been m
246c0 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f 72  odified and stor
246d0 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
246e0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
246f0 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69    ** If the opti
24700 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  mization can be 
24710 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6a  used, then the j
24720 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
24730 20 6e 65 76 65 72 0a 20 20 20 20 2a 2a 20 62 65   never.    ** be
24740 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69   created for thi
24750 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  s transaction.. 
24760 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73     */.    int us
24770 65 41 74 6f 6d 69 63 57 72 69 74 65 20 3d 20 28  eAtomicWrite = (
24780 0a 20 20 20 20 20 20 20 20 21 7a 4d 61 73 74 65  .        !zMaste
24790 72 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50  r && .        pP
247a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
247b0 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  ==jrnlBufferSize
247c0 28 70 50 61 67 65 72 29 20 26 26 20 0a 20 20 20  (pPager) && .   
247d0 20 20 20 20 20 6e 54 72 75 6e 63 3d 3d 30 20 26       nTrunc==0 &
247e0 26 20 0a 20 20 20 20 20 20 20 20 28 30 3d 3d 70  & .        (0==p
247f0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 7c 7c  Pager->pDirty ||
24800 20 30 3d 3d 70 50 61 67 65 72 2d 3e 70 44 69 72   0==pPager->pDir
24810 74 79 2d 3e 70 44 69 72 74 79 29 0a 20 20 20 20  ty->pDirty).    
24820 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65 41 74  );.    if( useAt
24830 6f 6d 69 63 57 72 69 74 65 20 29 7b 0a 20 20 20  omicWrite ){.   
24840 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
24850 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74   nRec field in t
24860 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
24870 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 66   */.      int of
24880 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
24890 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65  ournalHdr + size
248a0 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
248b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
248c0 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 31 29  pPager->nRec==1)
248d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
248e0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
248f0 3e 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50  >jfd, offset, pP
24900 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20  ager->nRec);..  
24910 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
24920 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65  e db file change
24930 20 63 6f 75 6e 74 65 72 2e 20 54 68 65 20 66 6f   counter. The fo
24940 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c  llowing call wil
24950 6c 20 6d 6f 64 69 66 79 0a 20 20 20 20 20 20 2a  l modify.      *
24960 2a 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  * the in-memory 
24970 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
24980 66 20 70 61 67 65 20 31 20 74 6f 20 69 6e 63 6c  f page 1 to incl
24990 75 64 65 20 74 68 65 20 75 70 64 61 74 65 64 0a  ude the updated.
249a0 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 20        ** change 
249b0 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e  counter and then
249c0 20 77 72 69 74 65 20 70 61 67 65 20 31 20 64 69   write page 1 di
249d0 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61  rectly to the da
249e0 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
249f0 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66  file. Because of
24a00 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
24a10 65 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  e property of th
24a20 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74  e host file-syst
24a30 65 6d 2c 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  em, .      ** th
24a40 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20  is is safe..    
24a50 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
24a60 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
24a70 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
24a80 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1);.    }else{.
24a90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24aa0 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28  e3JournalCreate(
24ab0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
24ac0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
24ad0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
24ae0 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 20  c_exit;.    }.. 
24af0 20 20 20 69 66 28 20 21 75 73 65 41 74 6f 6d 69     if( !useAtomi
24b00 63 57 72 69 74 65 20 29 0a 23 65 6e 64 69 66 0a  cWrite ).#endif.
24b10 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73  .    /* If a mas
24b20 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
24b30 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64   name has alread
24b40 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
24b50 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  o the.    ** jou
24b60 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
24b70 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71 75 69  no sync is requi
24b80 72 65 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e  red. This happen
24b90 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20  s when it is.   
24ba0 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65   ** written, the
24bb0 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 66 61  n the process fa
24bc0 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65 20 66  ils to upgrade f
24bd0 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 74  rom a RESERVED t
24be0 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  o an.    ** EXCL
24bf0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20  USIVE lock. The 
24c00 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 70 72  next time the pr
24c10 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f 20 63  ocess tries to c
24c20 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a  ommit the.    **
24c30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65   transaction the
24c40 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68   m-j name will h
24c50 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
24c60 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
24c70 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
24c80 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20  ->setMaster ){. 
24c90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
24ca0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
24cb0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
24cc0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
24cd0 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
24ce0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
24cf0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
24d00 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69  to sync_exit;.#i
24d10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24d20 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
24d30 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30     if( nTrunc!=0
24d40 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
24d50 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
24d60 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20  on has made the 
24d70 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72  database smaller
24d80 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  , then all pages
24d90 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  .        ** bein
24da0 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74  g discarded by t
24db0 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75  he truncation mu
24dc0 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  st be written to
24dd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
24de0 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20       ** file..  
24df0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
24e00 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20   Pgno i;.       
24e10 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47   int iSkip = PAG
24e20 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
24e30 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  r);.        for(
24e40 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d   i=nTrunc+1; i<=
24e50 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
24e60 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20  ze; i++ ){.     
24e70 20 20 20 20 20 69 66 28 20 21 28 70 50 61 67 65       if( !(pPage
24e80 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f  r->aInJournal[i/
24e90 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29  8] & (1<<(i&7)))
24ea0 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a   && i!=iSkip ){.
24eb0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
24ec0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
24ed0 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67  (pPager, i, &pPg
24ee0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
24ef0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24f00 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
24f10 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  t;.            r
24f20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
24f30 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20  Write(pPg);.    
24f40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
24f50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
24f60 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
24f70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
24f80 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
24f90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24fa0 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23      } .      }.#
24fb0 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
24fc0 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
24fd0 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  nal(pPager, zMas
24fe0 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
24ff0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
25000 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
25010 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
25020 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
25030 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
25040 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
25050 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 23  to sync_exit;..#
25060 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
25070 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
25080 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20    if( nTrunc!=0 
25090 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
250a0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
250b0 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e  te(pPager, nTrun
250c0 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
250d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
250e0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
250f0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
25100 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72  /* Write all dir
25110 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ty pages to the 
25120 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
25130 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
25140 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
25150 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ages(pPager);.  
25160 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
25170 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29  te_pagelist(pPg)
25180 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
25190 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
251a0 20 77 68 69 6c 65 28 20 70 50 67 20 26 26 20 21   while( pPg && !
251b0 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 20 70 50  pPg->dirty ){ pP
251c0 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b  g = pPg->pDirty;
251d0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
251e0 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20  >pDirty = pPg;. 
251f0 20 20 20 20 20 67 6f 74 6f 20 73 79 6e 63 5f 65       goto sync_e
25200 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  xit;.    }.    p
25210 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
25220 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20  0;..    /* Sync 
25230 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25240 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  e. */.    if( !p
25250 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
25260 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
25270 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
25280 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
25290 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  nc_flags);.    }
252a0 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
252b0 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  BSYNC %p\n", pPa
252c0 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65  ger))..    pPage
252d0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
252e0 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65  _SYNCED;.  }else
252f0 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 6e 54   if( MEMDB && nT
25300 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  runc!=0 ){.    r
25310 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
25320 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  Truncate(pPager,
25330 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73   nTrunc);.  }..s
25340 79 6e 63 5f 65 78 69 74 3a 0a 20 20 69 66 28 20  ync_exit:.  if( 
25350 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
25360 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  _BLOCKED ){.    
25370 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  /* pager_incr_ch
25380 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 6d 61  angecounter() ma
25390 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74  y attempt to obt
253a0 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ain an exclusive
253b0 0a 20 20 20 20 20 2a 20 6c 6f 63 6b 20 74 6f 20  .     * lock to 
253c0 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
253d0 61 6e 64 20 72 65 74 75 72 6e 20 49 4f 45 52 52  and return IOERR
253e0 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73 69  _BLOCKED. But si
253f0 6e 63 65 20 0a 20 20 20 20 20 2a 20 74 68 65 72  nce .     * ther
25400 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
25410 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 63 6f  he cache is inco
25420 6e 73 69 73 74 65 6e 74 2c 20 69 74 27 73 0a 20  nsistent, it's. 
25430 20 20 20 20 2a 20 62 65 74 74 65 72 20 74 6f 20      * better to 
25440 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
25450 53 59 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  SY..     */.    
25460 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
25470 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61  ;.  }.  pagerLea
25480 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
25490 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
254a0 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68  ** Commit all ch
254b0 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
254c0 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73  abase and releas
254d0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
254e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
254f0 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20  ommit fails for 
25500 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f  any reason, a ro
25510 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69  llback attempt i
25520 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e  s made.** and an
25530 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
25540 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65  eturned.  If the
25550 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20   commit worked, 
25560 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
25570 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
25580 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
25590 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65  mitPhaseTwo(Page
255a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
255b0 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
255c0 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  Pg;..  if( pPage
255d0 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
255e0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
255f0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
25600 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
25610 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e<PAGER_RESERVED
25620 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
25630 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
25640 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
25650 61 67 65 72 29 3b 0a 20 20 50 41 47 45 52 54 52  ager);.  PAGERTR
25660 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c  ACE2("COMMIT %d\
25670 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
25680 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
25690 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70  B ){.    pPg = p
256a0 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
256b0 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29  ty_pages(pPager)
256c0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67  ;.    while( pPg
256d0 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74   ){.      PgHist
256e0 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
256f0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
25700 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 63  pPager);.      c
25710 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73  learHistory(pHis
25720 74 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64  t);.      pPg->d
25730 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
25740 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
25750 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d   0;.      pHist-
25760 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
25770 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
25780 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
25790 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
257a0 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
257b0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d  = 0;.      pPg =
257c0 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20   pPg->pDirty;.  
257d0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
257e0 70 44 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 6e  pDirty = 0;.#ifn
257f0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66  def NDEBUG.    f
25800 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
25810 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
25820 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
25830 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
25840 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
25850 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
25860 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
25870 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c   !pPg->alwaysRol
25880 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61  lback );.      a
25890 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
258a0 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73  Orig );.      as
258b0 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53  sert( !pHist->pS
258c0 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  tmt );.    }.#en
258d0 64 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  dif.    pPager->
258e0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70  pStmt = 0;.    p
258f0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
25900 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
25910 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25920 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
25930 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
25940 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d  Open || !pPager-
25950 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20  >dirtyCache );. 
25960 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25970 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
25980 4e 43 45 44 20 7c 7c 20 21 70 50 61 67 65 72 2d  NCED || !pPager-
25990 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20  >dirtyCache );. 
259a0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
259b0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
259c0 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  er);.  rc = page
259d0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
259e0 72 63 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  rc);.  pagerLeav
259f0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
25a00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25a10 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   Rollback all ch
25a20 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61  anges.  The data
25a30 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20  base falls back 
25a40 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  to PAGER_SHARED 
25a50 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d  mode..** All in-
25a60 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
25a70 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65  es revert to the
25a80 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  ir original data
25a90 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68   contents..** Th
25aa0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c  e journal is del
25ab0 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  eted..**.** This
25ac0 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20   routine cannot 
25ad0 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65  fail unless some
25ae0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
25af0 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a  s not following.
25b00 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c  ** the correct l
25b10 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  ocking protocol 
25b20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  or unless some o
25b30 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
25b40 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68  is writing trash
25b50 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
25b60 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43  l file (SQLITE_C
25b70 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e  ORRUPT) or.** un
25b80 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c  less a prior mal
25b90 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51  loc() failed (SQ
25ba0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70  LITE_NOMEM).  Ap
25bb0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a  propriate error.
25bc0 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74  ** codes are ret
25bd0 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68  urned for all th
25be0 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20  ese occasions.  
25bf0 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51  Otherwise,.** SQ
25c00 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
25c10 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
25c20 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
25c30 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
25c40 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 41 47  .  int rc;.  PAG
25c50 45 52 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41  ERTRACE2("ROLLBA
25c60 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  CK %d\n", PAGERI
25c70 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
25c80 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50  ( MEMDB ){.    P
25c90 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72  gHdr *p;.    for
25ca0 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  (p=pPager->pAll;
25cb0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c   p; p=p->pNextAl
25cc0 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74  l){.      PgHist
25cd0 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20  ory *pHist;.    
25ce0 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c    assert( !p->al
25cf0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
25d00 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69        if( !p->di
25d10 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rty ){.        a
25d20 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74  ssert( !((PgHist
25d30 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48  ory *)PGHDR_TO_H
25d40 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d  IST(p, pPager))-
25d50 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
25d60 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48    assert( !((PgH
25d70 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54  istory *)PGHDR_T
25d80 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
25d90 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  ))->pStmt );.   
25da0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
25db0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48       }..      pH
25dc0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
25dd0 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a  IST(p, pPager);.
25de0 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
25df0 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  >pOrig ){.      
25e00 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
25e10 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73 74  O_DATA(p), pHist
25e20 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d  ->pOrig, pPager-
25e30 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
25e40 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
25e50 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25  "ROLLBACK-PAGE %
25e60 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70  d of %d\n", p->p
25e70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
25e80 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ger));.      }el
25e90 73 65 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45  se{.        PAGE
25ea0 52 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64  RTRACE3("PAGE %d
25eb0 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c   is clean on %d\
25ec0 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
25ed0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
25ee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65       }.      cle
25ef0 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29  arHistory(pHist)
25f00 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79  ;.      p->dirty
25f10 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
25f20 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
25f30 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d      pHist->inStm
25f40 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69  t = 0;.      pHi
25f50 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  st->pPrevStmt = 
25f60 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74  pHist->pNextStmt
25f70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
25f80 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
25f90 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
25fa0 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
25fb0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
25fc0 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
25fd0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
25fe0 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70  Dirty = 0;.    p
25ff0 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
26000 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
26010 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f  Size = pPager->o
26020 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 70  rigDbSize;.    p
26030 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61  ager_truncate_ca
26040 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  che(pPager);.   
26050 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
26060 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  se = 0;.    pPag
26070 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
26080 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
26090 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
260a0 20 20 7d 0a 0a 20 20 70 61 67 65 72 45 6e 74 65    }..  pagerEnte
260b0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
260c0 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43   !pPager->dirtyC
260d0 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d  ache || !pPager-
260e0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
260f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
26100 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
26110 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65  Pager);.    page
26120 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
26130 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
26140 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
26150 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61  ->errCode && pPa
26160 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
26170 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  LITE_FULL ){.   
26180 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
26190 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
261a0 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67  IVE ){.      pag
261b0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
261c0 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 0);.    }.  
261d0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
261e0 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
261f0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
26200 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
26210 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
26220 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
26230 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63   int rc2;.    rc
26240 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
26250 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
26260 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e    rc2 = pager_en
26270 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
26280 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
26290 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
262a0 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
262b0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
262c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
262d0 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
262e0 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 61 67 65  );.  }.  /* page
262f0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
26300 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
26310 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a  Size = -1;..  /*
26320 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
26330 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c  urs during a ROL
26340 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f  LBACK, we can no
26350 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68   longer trust th
26360 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 63 61 63  e pager.  ** cac
26370 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65  he. So call page
26380 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65  r_error() on the
26390 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65   way out to make
263a0 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 2a 2a   any error .  **
263b0 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a   persistent..  *
263c0 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65  /.  rc = pager_e
263d0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
263e0 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
263f0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
26400 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
26410 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
26420 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
26430 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
26440 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ly.  Return FALS
26450 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61  E.** if the data
26460 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f  base is (in theo
26470 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ry) writable..*/
26480 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
26490 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65  rIsreadonly(Page
264a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
264b0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61  turn pPager->rea
264c0 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dOnly;.}../*.** 
264d0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
264e0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
264f0 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  to the pager..*/
26500 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
26510 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20  rRefcount(Pager 
26520 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
26530 72 6e 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b  rn pPager->nRef;
26540 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
26550 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69  E_TEST./*.** Thi
26560 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
26570 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
26580 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
26590 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33  .*/.int *sqlite3
265a0 50 61 67 65 72 53 74 61 74 73 28 50 61 67 65 72  PagerStats(Pager
265b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61   *pPager){.  sta
265c0 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20  tic int a[11];. 
265d0 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[0] = pPager->
265e0 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70  nRef;.  a[1] = p
265f0 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20  Pager->nPage;.  
26600 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d  a[2] = pPager->m
26610 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20  xPage;.  a[3] = 
26620 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
26630 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d    a[4] = pPager-
26640 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d  >state;.  a[5] =
26650 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
26660 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65  ;.  a[6] = pPage
26670 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20  r->nHit;.  a[7] 
26680 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b  = pPager->nMiss;
26690 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a  .  a[8] = 0;  /*
266a0 20 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67   Used to be pPag
266b0 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61  er->nOvfl */.  a
266c0 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  [9] = pPager->nR
266d0 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70  ead;.  a[10] = p
266e0 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20  Pager->nWrite;. 
266f0 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e   return a;.}.#en
26700 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  dif../*.** Set t
26710 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c  he statement rol
26720 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a  lback point..**.
26730 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
26740 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
26750 20 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61   with the transa
26760 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c  ction journal al
26770 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20  ready.** open.  
26780 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20  A new statement 
26790 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74  journal is creat
267a0 65 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  ed that can be u
267b0 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a  sed to rollback.
267c0 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20  ** changes of a 
267d0 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61  single SQL comma
267e0 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67  nd within a larg
267f0 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  er transaction..
26800 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
26810 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67  gerStmtBegin(Pag
26820 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
26830 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
26840 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
26850 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Use );.  assert(
26860 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
26870 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
26880 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
26890 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20  ->dbSize>=0 );. 
268a0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54   PAGERTRACE2("ST
268b0 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20  MT-BEGIN %d\n", 
268c0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
268d0 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
268e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
268f0 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20  tInUse = 1;.    
26900 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
26910 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
26920 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e;.    return SQ
26930 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
26940 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
26950 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70  nalOpen ){.    p
26960 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
26970 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  pen = 1;.    ret
26980 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
26990 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
269a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
269b0 20 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65   );.  pagerLeave
269c0 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
269d0 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71  er->aInStmt = sq
269e0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
269f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f   pPager->dbSize/
26a00 38 20 2b 20 31 20 29 3b 0a 20 20 70 61 67 65 72  8 + 1 );.  pager
26a10 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
26a20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
26a30 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Stmt==0 ){.    /
26a40 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  * sqlite3OsLock(
26a50 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
26a60 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20  ED_LOCK); */.   
26a70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
26a80 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  OMEM;.  }.#ifnde
26a90 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20  f NDEBUG.  rc = 
26aa0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
26ab0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
26ac0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
26ad0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
26ae0 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66  oto stmt_begin_f
26af0 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28  ailed;.  assert(
26b00 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
26b10 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  ze == pPager->jo
26b20 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64  urnalOff );.#end
26b30 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  if.  pPager->stm
26b40 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  tJSize = pPager-
26b50 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70  >journalOff;.  p
26b60 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
26b70 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
26b80 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
26b90 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  HdrOff = 0;.  pP
26ba0 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20  ager->stmtCksum 
26bb0 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
26bc0 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67  nit;.  if( !pPag
26bd0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
26be0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26bf0 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  PagerOpentemp(pP
26c00 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
26c10 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20  er->stfd, 0);.  
26c20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
26c30 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
26c40 64 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  d;.    pPager->s
26c50 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  tmtOpen = 1;.   
26c60 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
26c70 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  c = 0;.  }.  pPa
26c80 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
26c90 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
26ca0 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62  ITE_OK;. .stmt_b
26cb0 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69  egin_failed:.  i
26cc0 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  f( pPager->aInSt
26cd0 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mt ){.    sqlite
26ce0 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61  3_free(pPager->a
26cf0 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61  InStmt);.    pPa
26d00 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30  ger->aInStmt = 0
26d10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
26d20 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
26d30 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50  PagerStmtBegin(P
26d40 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
26d50 20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72   int rc;.  pager
26d60 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
26d70 20 72 63 20 3d 20 70 61 67 65 72 53 74 6d 74 42   rc = pagerStmtB
26d80 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  egin(pPager);.  
26d90 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
26da0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
26db0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
26dc0 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f   a statement..*/
26dd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
26de0 72 53 74 6d 74 43 6f 6d 6d 69 74 28 50 61 67 65  rStmtCommit(Page
26df0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70 61  r *pPager){.  pa
26e00 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
26e10 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
26e20 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
26e30 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e   PgHdr *pPg, *pN
26e40 65 78 74 3b 0a 20 20 20 20 50 41 47 45 52 54 52  ext;.    PAGERTR
26e50 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49  ACE2("STMT-COMMI
26e60 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
26e70 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69  (pPager));.    i
26e80 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
26e90 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54     /* sqlite3OsT
26ea0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
26eb0 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20  stfd, 0); */.   
26ec0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26ed0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
26ee0 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
26ef0 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->aInStmt = 0;. 
26f00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26f10 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
26f20 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d  pStmt; pPg; pPg=
26f30 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
26f40 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
26f50 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
26f60 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
26f70 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70         pNext = p
26f80 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3b  Hist->pNextStmt;
26f90 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
26fa0 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29   pHist->inStmt )
26fb0 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d  ;.        pHist-
26fc0 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
26fd0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65       pHist->pPre
26fe0 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70  vStmt = pHist->p
26ff0 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
27000 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
27010 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
27020 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d  ;.        pHist-
27030 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
27040 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
27050 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d  ager->stmtNRec =
27060 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
27070 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
27080 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
27090 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
270a0 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
270b0 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 4c 65 61   = 0;.  pagerLea
270c0 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
270d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
270e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
270f0 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  k a statement..*
27100 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
27110 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50  erStmtRollback(P
27120 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
27130 20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72   int rc;.  pager
27140 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
27150 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
27160 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 41  tInUse ){.    PA
27170 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d  GERTRACE2("STMT-
27180 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20  ROLLBACK %d\n", 
27190 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
271a0 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ;.    if( MEMDB 
271b0 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
271c0 70 50 67 3b 0a 20 20 20 20 20 20 50 67 48 69 73  pPg;.      PgHis
271d0 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20  tory *pHist;.   
271e0 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
271f0 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70  r->pStmt; pPg; p
27200 50 67 3d 70 48 69 73 74 2d 3e 70 4e 65 78 74 53  Pg=pHist->pNextS
27210 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 70 48  tmt){.        pH
27220 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
27230 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
27240 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48  ;.        if( pH
27250 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
27260 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50          memcpy(P
27270 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
27280 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c  ), pHist->pStmt,
27290 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
272a0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
272b0 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69 73 74  lite3_free(pHist
272c0 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
272d0 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
272e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
272f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
27300 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
27310 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b  Pager->stmtSize;
27320 0a 20 20 20 20 20 20 70 61 67 65 72 5f 74 72 75  .      pager_tru
27330 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
27340 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
27350 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
27360 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
27370 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
27380 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
27390 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
273a0 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70  agerStmtCommit(p
273b0 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
273c0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
273d0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
273e0 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
273f0 3d 20 30 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  = 0;.  pagerLeav
27400 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
27410 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
27420 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
27430 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
27440 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
27450 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
27460 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
27470 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
27480 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
27490 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ger->zFilename;.
274a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
274b0 74 68 65 20 56 46 53 20 73 74 72 75 63 74 75 72  the VFS structur
274c0 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e  e for the pager.
274d0 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  .*/.const sqlite
274e0 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61  3_vfs *sqlite3Pa
274f0 67 65 72 56 66 73 28 50 61 67 65 72 20 2a 70 50  gerVfs(Pager *pP
27500 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
27510 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a  pPager->pVfs;.}.
27520 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
27530 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74  e directory of t
27540 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27550 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
27560 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72  *sqlite3PagerDir
27570 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
27580 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
27590 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
275a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
275b0 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
275c0 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
275d0 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  al file..*/.cons
275e0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
275f0 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  agerJournalname(
27600 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
27610 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
27620 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a  >zJournal;.}../*
27630 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
27640 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73  if fsync() calls
27650 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f   are disabled fo
27660 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52  r this pager.  R
27670 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
27680 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65  f fsync()s are e
27690 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79  xecuted normally
276a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
276b0 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65  PagerNosync(Page
276c0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
276d0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53  turn pPager->noS
276e0 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  ync;.}..#ifdef S
276f0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
27700 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
27710 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67  dec for this pag
27720 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  er.*/.void sqlit
27730 65 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28  e3PagerSetCodec(
27740 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
27750 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64  ,.  void *(*xCod
27760 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
27770 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  Pgno,int),.  voi
27780 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a  d *pCodecArg.){.
27790 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
277a0 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61   = xCodec;.  pPa
277b0 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d  ger->pCodecArg =
277c0 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65   pCodecArg;.}.#e
277d0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
277e0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
277f0 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  CUUM./*.** Move 
27800 74 68 65 20 70 61 67 65 20 70 50 67 20 74 6f 20  the page pPg to 
27810 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e  location pgno in
27820 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a   the file. .**.*
27830 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
27840 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  no references to
27850 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f   the page previo
27860 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a  usly located at.
27870 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77  ** pgno (which w
27880 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74  e call pPgOld) t
27890 68 6f 75 67 68 20 74 68 61 74 20 70 61 67 65 20  hough that page 
278a0 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  is allowed to be
278b0 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49  .** in cache.  I
278c0 66 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69  f the page previ
278d0 6f 75 73 20 6c 6f 63 61 74 65 64 20 61 74 20 70  ous located at p
278e0 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  gno is not alrea
278f0 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c  dy.** in the rol
27900 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69  lback journal, i
27910 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65  t is not put the
27920 72 65 20 62 79 20 62 79 20 74 68 69 73 20 72 6f  re by by this ro
27930 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  utine..**.** Ref
27940 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
27950 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76  age pPg remain v
27960 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61  alid. Updating a
27970 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20  ny.** meta-data 
27980 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
27990 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73  pPg (i.e. data s
279a0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78  tored in the nEx
279b0 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c  tra bytes.** all
279c0 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
279d0 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74  h the page) is t
279e0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
279f0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e  y of the caller.
27a00 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63  .**.** A transac
27a10 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74  tion must be act
27a20 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ive when this ro
27a30 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
27a40 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a   It used to be.*
27a50 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20  * required that 
27a60 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
27a70 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  saction was not 
27a80 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73  active, but this
27a90 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20   restriction.** 
27aa0 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  has been removed
27ab0 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e   (CREATE INDEX n
27ac0 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70  eeds to move a p
27ad0 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65  age when a state
27ae0 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
27af0 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a  ion is active)..
27b00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
27b10 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65  gerMovepage(Page
27b20 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67  r *pPager, DbPag
27b30 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e  e *pPg, Pgno pgn
27b40 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
27b50 4f 6c 64 3b 20 20 2f 2a 20 54 68 65 20 70 61 67  Old;  /* The pag
27b60 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  e being overwrit
27b70 74 65 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  ten. */.  int h;
27b80 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63  .  Pgno needSync
27b90 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 70 61 67  Pgno = 0;..  pag
27ba0 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
27bb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
27bc0 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47  nRef>0 );..  PAG
27bd0 45 52 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25  ERTRACE5("MOVE %
27be0 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53  d page %d (needS
27bf0 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f  ync=%d) moves to
27c00 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50   %d\n", .      P
27c10 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
27c20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
27c30 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b  needSync, pgno);
27c40 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56  .  IOTRACE(("MOV
27c50 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70  E %p %d %d\n", p
27c60 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
27c70 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65  , pgno))..  page
27c80 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50  r_get_content(pP
27c90 67 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e  g);.  if( pPg->n
27ca0 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e  eedSync ){.    n
27cb0 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50  eedSyncPgno = pP
27cc0 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73  g->pgno;.    ass
27cd0 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
27ce0 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 67 6e 6f  nal || (int)pgno
27cf0 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
27d00 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
27d10 74 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 3b  t( pPg->dirty );
27d20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
27d30 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
27d40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  .  }..  /* Unlin
27d50 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20  k pPg from it's 
27d60 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20  hash-chain */.  
27d70 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
27d80 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20  pPager, pPg);.. 
27d90 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65   /* If the cache
27da0 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65   contains a page
27db0 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
27dc0 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69  r pgno, remove i
27dd0 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73  t.  ** from it's
27de0 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73   hash chain. Als
27df0 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64 72 2e  o, if the PgHdr.
27e00 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73 65 74  needSync was set
27e10 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20   for .  ** page 
27e20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20  pgno before the 
27e30 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e  'move' operation
27e40 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  , it needs to be
27e50 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20   retained .  ** 
27e60 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76  for the page mov
27e70 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  ed there..  */. 
27e80 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
27e90 20 30 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70   0;.  pPgOld = p
27ea0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
27eb0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
27ec0 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61   pPgOld ){.    a
27ed0 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e  ssert( pPgOld->n
27ee0 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e  Ref==0 );.    un
27ef0 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
27f00 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20  ager, pPgOld);. 
27f10 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
27f20 4f 6c 64 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e  Old);.    pPg->n
27f30 65 65 64 53 79 6e 63 20 3d 20 70 50 67 4f 6c 64  eedSync = pPgOld
27f40 2d 3e 6e 65 65 64 53 79 6e 63 3b 0a 20 20 7d 65  ->needSync;.  }e
27f50 6c 73 65 7b 0a 20 20 20 20 70 50 67 2d 3e 6e 65  lse{.    pPg->ne
27f60 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a  edSync = 0;.  }.
27f70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
27f80 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74  nJournal && (int
27f90 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f  )pgno<=pPager->o
27fa0 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
27fb0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
27fc0 3d 20 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  =  (pPager->aInJ
27fd0 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26  ournal[pgno/8] &
27fe0 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21   (1<<(pgno&7)))!
27ff0 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  =0;.  }else{.   
28000 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
28010 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
28020 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
28030 30 20 7c 7c 20 28 69 6e 74 29 70 67 6e 6f 3e 70  0 || (int)pgno>p
28040 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
28050 65 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  e );.  }..  /* C
28060 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e  hange the page n
28070 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e  umber for pPg an
28080 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f  d insert it into
28090 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68   the new hash-ch
280a0 61 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ain. */.  assert
280b0 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70  ( pgno!=0 );.  p
280c0 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
280d0 0a 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70  .  h = pgno & (p
280e0 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b  Pager->nHash-1);
280f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
28100 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61  Hash[h] ){.    a
28110 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
28120 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
28130 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  sh==0 );.    pPa
28140 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70  ger->aHash[h]->p
28150 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
28160 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
28170 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
28180 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65  Hash[h];.  pPage
28190 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
281a0 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48  g;.  pPg->pPrevH
281b0 61 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65  ash = 0;..  make
281c0 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50  Dirty(pPg);.  pP
281d0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
281e0 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65   = 1;..  if( nee
281f0 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20  dSyncPgno ){.   
28200 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50   /* If needSyncP
28210 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  gno is non-zero,
28220 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
28230 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20  l file needs to 
28240 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28  be .    ** sync(
28250 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64  )ed before any d
28260 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
28270 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
28280 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e  page needSyncPgn
28290 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e  o..    ** Curren
282a0 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67  tly, no such pag
282b0 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
282c0 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74  page-cache and t
282d0 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  he .    ** Pager
282e0 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20  .aInJournal bit 
282f0 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68  has been set. Th
28300 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  is needs to be r
28310 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69  emedied by loadi
28320 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  ng.    ** the pa
28330 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
28340 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74  r-cache and sett
28350 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
28360 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20  edSync flag..   
28370 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
28380 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
28390 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20   call may cause 
283a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
283b0 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20  ync. So make.   
283c0 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67   ** sure the Pag
283d0 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
283e0 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20   is set too..   
283f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   */.    int rc;.
28400 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64      PgHdr *pPgHd
28410 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
28420 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
28430 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
28440 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
28450 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  er, needSyncPgno
28460 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
28470 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28480 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
28490 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
284a0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67  ync = 1;.    pPg
284b0 48 64 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  Hdr->needSync = 
284c0 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 69  1;.    pPgHdr->i
284d0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
284e0 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 48    makeDirty(pPgH
284f0 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dr);.    sqlite3
28500 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
28510 72 29 3b 0a 20 20 7d 0a 0a 20 20 70 61 67 65 72  r);.  }..  pager
28520 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
28530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28540 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
28550 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
28560 74 65 72 20 74 6f 20 74 68 65 20 64 61 74 61 20  ter to the data 
28570 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
28580 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
28590 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
285a0 44 61 74 61 28 44 62 50 61 67 65 20 2a 70 50 67  Data(DbPage *pPg
285b0 29 7b 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44  ){.  return PGHD
285c0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
285d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
285e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
285f0 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79   Pager.nExtra by
28600 74 65 73 20 6f 66 20 22 65 78 74 72 61 22 20 73  tes of "extra" s
28610 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74  pace .** allocat
28620 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
28630 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
28640 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
28650 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
28660 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
28670 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
28680 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72  pPg->pPager;.  r
28690 65 74 75 72 6e 20 28 70 50 61 67 65 72 3f 50 47  eturn (pPager?PG
286a0 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
286b0 2c 20 70 50 61 67 65 72 29 3a 30 29 3b 0a 7d 0a  , pPager):0);.}.
286c0 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74  ./*.** Get/set t
286d0 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
286e0 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
286f0 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20  Parameter eMode 
28700 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f  must be one.** o
28710 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  f PAGER_LOCKINGM
28720 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52  ODE_QUERY, PAGER
28730 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
28740 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52  MAL or .** PAGER
28750 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
28760 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65 20 70  LUSIVE. If the p
28770 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
28780 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20  _QUERY, then.** 
28790 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
287a0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
287b0 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a  alue specified..
287c0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
287d0 65 64 20 76 61 6c 75 65 20 69 73 20 65 69 74 68  ed value is eith
287e0 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  er PAGER_LOCKING
287f0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a  MODE_NORMAL or.*
28800 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  * PAGER_LOCKINGM
28810 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69  ODE_EXCLUSIVE, i
28820 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20 63 75  ndicating the cu
28830 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20  rrent (possibly 
28840 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b  updated).** lock
28850 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  ing-mode..*/.int
28860 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63   sqlite3PagerLoc
28870 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a  kingMode(Pager *
28880 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64  pPager, int eMod
28890 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d  e){.  assert( eM
288a0 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
288b0 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20  NGMODE_QUERY.   
288c0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
288d0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
288e0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  MODE_NORMAL.    
288f0 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
28900 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
28910 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
28920 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
28930 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
28940 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74  RY<0 );.  assert
28950 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
28960 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26  ODE_NORMAL>=0 &&
28970 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
28980 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20  DE_EXCLUSIVE>=0 
28990 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d  );.  if( eMode>=
289a0 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  0 && !pPager->te
289b0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50  mpFile ){.    pP
289c0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
289d0 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d  ode = eMode;.  }
289e0 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70  .  return (int)p
289f0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
28a00 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  Mode;.}..#if def
28a10 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
28a20 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
28a30 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
28a40 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
28a50 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
28a60 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74   file lock for t
28a70 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
28a80 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
28a90 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f  lue is one of NO
28aa0 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
28ab0 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
28ac0 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f  K,.** PENDING_LO
28ad0 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45  CK, or EXCLUSIVE
28ae0 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _LOCK..*/.int sq
28af0 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 73 74  lite3PagerLockst
28b00 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
28b10 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  r){.  return sql
28b20 69 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65 28  ite3OsLockState(
28b30 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a 23  pPager->fd);.}.#
28b40 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
28b50 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
28b60 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67   Print a listing
28b70 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63   of all referenc
28b80 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68 65  ed pages and the
28b90 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f  ir ref count..*/
28ba0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
28bb0 65 72 52 65 66 64 75 6d 70 28 50 61 67 65 72 20  erRefdump(Pager 
28bc0 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
28bd0 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50  r *pPg;.  for(pP
28be0 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
28bf0 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
28c00 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28  extAll){.    if(
28c10 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20   pPg->nRef<=0 ) 
28c20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71  continue;.    sq
28c30 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
28c40 28 22 50 41 47 45 20 25 33 64 20 61 64 64 72 3d  ("PAGE %3d addr=
28c50 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a  %p nRef=%d\n", .
28c60 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f         pPg->pgno
28c70 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
28c80 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29  pPg), pPg->nRef)
28c90 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
28ca0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
28cb0 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a  _OMIT_DISKIO */.