/ Hex Artifact Content
Login

Artifact 89dfc6a0bd72898d147264517a43bdf35348dd2c:


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: 32 20 32 30 30 37 2f 30 38 2f 32 34 20 30 33 3a  2 2007/08/24 03:
0360: 35 31 3a 33 34 20 64 72 68 20 45 78 70 20 24 0a  51:34 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 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d  ./*.** Each in-m
1600: 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 61  emory image of a
1610: 20 70 61 67 65 20 62 65 67 69 6e 73 20 77 69 74   page begins wit
1620: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
1630: 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20  header..** This 
1640: 68 65 61 64 65 72 20 69 73 20 6f 6e 6c 79 20 76  header is only v
1650: 69 73 69 62 6c 65 20 74 6f 20 74 68 69 73 20 70  isible to this p
1660: 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68  ager module.  Th
1670: 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65  e client.** code
1680: 20 74 68 61 74 20 63 61 6c 6c 73 20 70 61 67 65   that calls page
1690: 72 20 73 65 65 73 20 6f 6e 6c 79 20 74 68 65 20  r sees only the 
16a0: 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77  data that follow
16b0: 73 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  s the header..**
16c0: 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64 65 20  .** Client code 
16d0: 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69  should call sqli
16e0: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
16f0: 6f 6e 20 61 20 70 61 67 65 20 70 72 69 6f 72 20  on a page prior 
1700: 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79  to making.** any
1710: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
1720: 6f 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68  o that page.  Th
1730: 65 20 66 69 72 73 74 20 74 69 6d 65 20 73 71 6c  e first time sql
1740: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1750: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  .** is called, t
1760: 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
1770: 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 77 72   contents are wr
1780: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 72  itten into the r
1790: 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e  ollback.** journ
17a0: 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a  al and PgHdr.inJ
17b0: 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72  ournal and PgHdr
17c0: 2e 6e 65 65 64 53 79 6e 63 20 61 72 65 20 73 65  .needSync are se
17d0: 74 2e 20 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a  t.  Later, once.
17e0: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70  ** the journal p
17f0: 61 67 65 20 68 61 73 20 6d 61 64 65 20 69 74 20  age has made it 
1800: 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75  onto the disk su
1810: 72 66 61 63 65 2c 20 50 67 48 64 72 2e 6e 65 65  rface, PgHdr.nee
1820: 64 53 79 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61  dSync.** is clea
1830: 72 65 64 2e 20 20 54 68 65 20 6d 6f 64 69 66 69  red.  The modifi
1840: 65 64 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62  ed page cannot b
1850: 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69  e written back i
1860: 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
1870: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
1880: 65 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72  e until the jour
1890: 6e 61 6c 20 70 61 67 65 73 20 68 61 73 20 62 65  nal pages has be
18a0: 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  en synced to dis
18b0: 6b 20 61 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48  k and the.** PgH
18c0: 64 72 2e 6e 65 65 64 53 79 6e 63 20 68 61 73 20  dr.needSync has 
18d0: 62 65 65 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a  been cleared..**
18e0: 0a 2a 2a 20 54 68 65 20 50 67 48 64 72 2e 64 69  .** The PgHdr.di
18f0: 72 74 79 20 66 6c 61 67 20 69 73 20 73 65 74 20  rty flag is set 
1900: 77 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65  when sqlite3Page
1910: 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
1920: 65 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65  ed and.** is cle
1930: 61 72 65 64 20 61 67 61 69 6e 20 77 68 65 6e 20  ared again when 
1940: 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1950: 20 69 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b   is written back
1960: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
1970: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
1980: 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 74 61 69 6c 73  e..**.** Details
1990: 20 6f 66 20 69 6d 70 6f 72 74 61 6e 74 20 73 74   of important st
19a0: 72 75 63 74 75 72 65 20 65 6c 65 6d 65 6e 74 73  ructure elements
19b0: 3a 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63  :.**.** needSync
19c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68  .**.**     If th
19d0: 69 73 20 69 73 20 74 72 75 65 2c 20 74 68 69 73  is is true, this
19e0: 20 6d 65 61 6e 73 20 74 68 61 74 20 69 74 20 69   means that it i
19f0: 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 77 72  s not safe to wr
1a00: 69 74 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  ite the page.** 
1a10: 20 20 20 20 63 6f 6e 74 65 6e 74 20 74 6f 20 74      content to t
1a20: 68 65 20 64 61 74 61 62 61 73 65 20 62 65 63 61  he database beca
1a30: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  use the original
1a40: 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 65 64 0a   content needed.
1a50: 2a 2a 20 20 20 20 20 66 6f 72 20 72 6f 6c 6c 62  **     for rollb
1a60: 61 63 6b 20 68 61 73 20 6e 6f 74 20 62 79 20 73  ack has not by s
1a70: 79 6e 63 65 64 20 74 6f 20 74 68 65 20 6d 61 69  ynced to the mai
1a80: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
1a90: 61 6c 2e 0a 2a 2a 20 20 20 20 20 54 68 65 20 6f  al..**     The o
1aa0: 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20  riginal content 
1ab0: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 77 72  may have been wr
1ac0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 72 6f 6c  itten to the rol
1ad0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  lback journal.**
1ae0: 20 20 20 20 20 62 75 74 20 69 74 20 68 61 73 20       but it has 
1af0: 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 73 79 6e  not yet been syn
1b00: 63 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e  ced.  So we cann
1b10: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
1b20: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
1b30: 66 69 6c 65 20 62 65 63 61 75 73 65 20 70 6f 77  file because pow
1b40: 65 72 20 66 61 69 6c 75 72 65 20 6d 69 67 68 74  er failure might
1b50: 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20   cause the page 
1b60: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
1b70: 69 6c 65 0a 2a 2a 20 20 20 20 20 74 6f 20 6e 65  ile.**     to ne
1b80: 76 65 72 20 72 65 61 63 68 20 74 68 65 20 64 69  ver reach the di
1b90: 73 6b 2e 20 20 49 74 20 69 73 20 61 73 20 69 66  sk.  It is as if
1ba0: 20 74 68 65 20 77 72 69 74 65 20 74 6f 20 74 68   the write to th
1bb0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
1bc0: 2a 20 20 20 20 20 64 6f 65 73 20 6e 6f 74 20 6f  *     does not o
1bd0: 63 63 75 72 20 75 6e 74 69 6c 20 74 68 65 20 6a  ccur until the j
1be0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
1bf0: 79 6e 63 65 64 2e 0a 2a 2a 20 20 20 20 20 0a 2a  ynced..**     .*
1c00: 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20  *     This flag 
1c10: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
1c20: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 65 78 61  page content exa
1c30: 63 74 6c 79 20 6d 61 74 63 68 65 73 20 77 68 61  ctly matches wha
1c40: 74 0a 2a 2a 20 20 20 20 20 63 75 72 72 65 6e 74  t.**     current
1c50: 6c 79 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ly exists in the
1c60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1c70: 20 54 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c   The needSync fl
1c80: 61 67 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 20 20  ag is also.**   
1c90: 20 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 6f    false if the o
1ca0: 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20  riginal content 
1cb0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
1cc0: 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   to the main rol
1cd0: 6c 62 61 63 6b 0a 2a 2a 20 20 20 20 20 6a 6f 75  lback.**     jou
1ce0: 72 6e 61 6c 20 61 6e 64 20 73 79 6e 63 65 64 2e  rnal and synced.
1cf0: 20 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65    If the page re
1d00: 70 72 65 73 65 6e 74 73 20 61 20 6e 65 77 20 70  presents a new p
1d10: 61 67 65 20 74 68 61 74 20 68 61 73 0a 2a 2a 20  age that has.** 
1d20: 20 20 20 20 62 65 65 6e 20 61 64 64 65 64 20 6f      been added o
1d30: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
1d40: 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69  he database duri
1d50: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  ng the current.*
1d60: 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f  *     transactio
1d70: 6e 2c 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  n, the needSync 
1d80: 66 6c 61 67 20 69 73 20 74 72 75 65 20 75 6e 74  flag is true unt
1d90: 69 6c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  il the original 
1da0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
1db0: 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  size in the jour
1dc0: 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73 20 62  nal header has b
1dd0: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
1de0: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 69 6e 4a 6f 75 72  sk..**.** inJour
1df0: 6e 61 6c 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68  nal.**.**     Th
1e00: 69 73 20 69 73 20 74 72 75 65 20 69 66 20 74 68  is is true if th
1e10: 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  e original page 
1e20: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
1e30: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a   into the main.*
1e40: 2a 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 6a  *     rollback j
1e50: 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 69 73  ournal.  This is
1e60: 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20 66 6f   always false fo
1e70: 72 20 6e 65 77 20 70 61 67 65 73 20 61 64 64 65  r new pages adde
1e80: 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20  d to.**     the 
1e90: 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
1ea0: 61 73 65 20 66 69 6c 65 20 64 75 72 69 6e 67 20  ase file during 
1eb0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
1ec0: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 20 20 20 20  saction..**     
1ed0: 41 6e 64 20 74 68 69 73 20 66 6c 61 67 20 73 61  And this flag sa
1ee0: 79 73 20 6e 6f 74 68 69 6e 67 20 61 62 6f 75 74  ys nothing about
1ef0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
1f00: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
1f10: 20 20 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63     has been sync
1f20: 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 46 6f 72  ed to disk.  For
1f30: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
1f40: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  in the original.
1f50: 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65 20  **     database 
1f60: 66 69 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  file, the follow
1f70: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ing expression s
1f80: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
1f90: 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  true:.**.**     
1fa0: 20 20 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70    inJournal = (p
1fb0: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1fc0: 6c 5b 28 70 67 6e 6f 2d 31 29 2f 38 5d 20 26 20  l[(pgno-1)/8] & 
1fd0: 28 31 3c 3c 28 28 70 67 6e 6f 2d 31 29 25 38 29  (1<<((pgno-1)%8)
1fe0: 29 21 3d 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54  )!=0.**.**     T
1ff0: 68 65 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  he pPager->aInJo
2000: 75 72 6e 61 6c 5b 5d 20 61 72 72 61 79 20 69 73  urnal[] array is
2010: 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20   only valid for 
2020: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
2030: 20 20 20 20 70 61 67 65 73 20 6f 66 20 74 68 65      pages of the
2040: 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 74 20 6e   database, not n
2050: 65 77 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ew pages that ar
2060: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 65  e added to the e
2070: 6e 64 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65  nd.**     of the
2080: 20 64 61 74 61 62 61 73 65 2c 20 73 6f 20 6f 62   database, so ob
2090: 76 69 6f 75 73 6c 79 20 74 68 65 20 61 62 6f 76  viously the abov
20a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
20b0: 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 76 61  not be.**     va
20c0: 6c 69 64 20 66 6f 72 20 6e 65 77 20 70 61 67 65  lid for new page
20d0: 73 2e 20 20 46 6f 72 20 6e 65 77 20 70 61 67 65  s.  For new page
20e0: 73 20 69 6e 4a 6f 75 72 6e 61 6c 20 69 73 20 61  s inJournal is a
20f0: 6c 77 61 79 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 64  lways 0..**.** d
2100: 69 72 74 79 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57  irty.**.**     W
2110: 68 65 6e 20 74 72 75 65 2c 20 74 68 69 73 20 6d  hen true, this m
2120: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f  eans that the co
2130: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
2140: 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20  e has been.**   
2150: 20 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 6e    modified and n
2160: 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74  eeds to be writt
2170: 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  en back to the d
2180: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2190: 20 20 20 20 20 49 66 20 66 61 6c 73 65 2c 20 69       If false, i
21a0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74  t means that eit
21b0: 68 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  her the content 
21c0: 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 0a 2a  of the page is.*
21d0: 2a 20 20 20 20 20 75 6e 63 68 61 6e 67 65 64 20  *     unchanged 
21e0: 6f 72 20 65 6c 73 65 20 74 68 65 20 63 6f 6e 74  or else the cont
21f0: 65 6e 74 20 69 73 20 75 6e 69 6d 70 6f 72 74 61  ent is unimporta
2200: 6e 74 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74  nt and we do not
2210: 0a 2a 2a 20 20 20 20 20 63 61 72 65 20 77 68 65  .**     care whe
2220: 74 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 69  ther or not it i
2230: 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a  s preserved..**.
2240: 2a 2a 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ** alwaysRollbac
2250: 6b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73  k.**.**     This
2260: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
2270: 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
2280: 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 73  Rollback() API s
2290: 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 20 20 20 20  hould be.**     
22a0: 69 67 6e 6f 72 65 64 20 66 6f 72 20 74 68 69 73  ignored for this
22b0: 20 70 61 67 65 2e 20 20 54 68 65 20 44 6f 6e 74   page.  The Dont
22c0: 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 61  Rollback() API a
22d0: 74 74 65 6d 70 74 73 20 74 6f 20 73 61 79 0a 2a  ttempts to say.*
22e0: 2a 20 20 20 20 20 74 68 61 74 20 74 68 65 20 63  *     that the c
22f0: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
2300: 67 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 75 6e  ge on disk is un
2310: 69 6d 70 6f 72 74 61 6e 74 20 28 69 74 20 69 73  important (it is
2320: 20 61 6e 0a 2a 2a 20 20 20 20 20 75 6e 75 73 65   an.**     unuse
2330: 64 20 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72  d page on the fr
2340: 65 65 6c 69 73 74 29 20 73 6f 20 74 68 61 74 20  eelist) so that 
2350: 69 74 20 69 73 20 75 6e 6e 65 63 65 73 73 61 72  it is unnecessar
2360: 79 20 74 6f 20 0a 2a 2a 20 20 20 20 20 72 6f 6c  y to .**     rol
2370: 6c 62 61 63 6b 20 63 68 61 6e 67 65 73 20 74 6f  lback changes to
2380: 20 74 68 69 73 20 70 61 67 65 20 62 65 63 61 75   this page becau
2390: 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  se the content o
23a0: 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20  f the page.**   
23b0: 20 20 63 61 6e 20 63 68 61 6e 67 65 20 77 69 74    can change wit
23c0: 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68  hout changing th
23d0: 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
23e0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
23f0: 0a 2a 2a 20 20 20 20 20 66 6c 61 67 20 6f 76 65  .**     flag ove
2400: 72 72 69 64 65 73 20 61 6e 79 20 44 6f 6e 74 52  rrides any DontR
2410: 6f 6c 6c 62 61 63 6b 28 29 20 61 74 74 65 6d 70  ollback() attemp
2420: 74 2e 20 20 54 68 69 73 20 66 6c 61 67 20 69 73  t.  This flag is
2430: 20 73 65 74 0a 2a 2a 20 20 20 20 20 77 68 65 6e   set.**     when
2440: 20 61 20 70 61 67 65 20 74 68 61 74 20 6f 72 69   a page that ori
2450: 67 69 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65  ginally containe
2460: 64 20 76 61 6c 69 64 20 64 61 74 61 20 69 73 20  d valid data is 
2470: 61 64 64 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20  added to.**     
2480: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 4c  the freelist.  L
2490: 61 74 65 72 20 69 6e 20 74 68 65 20 73 61 6d 65  ater in the same
24a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
24b0: 69 73 20 70 61 67 65 20 6d 69 67 68 74 0a 2a 2a  is page might.**
24c0: 20 20 20 20 20 62 65 20 70 75 6c 6c 65 64 20 66       be pulled f
24d0: 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
24e0: 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20   and reused for 
24f0: 73 6f 6d 65 74 68 69 6e 67 20 64 69 66 66 65 72  something differ
2500: 65 6e 74 0a 2a 2a 20 20 20 20 20 61 6e 64 20 61  ent.**     and a
2510: 74 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65  t that point the
2520: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
2530: 41 50 49 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  API will be call
2540: 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 20 20  ed because.**   
2550: 20 20 70 61 67 65 73 20 74 61 6b 65 6e 20 66 72    pages taken fr
2560: 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
2570: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  do not need to b
2580: 65 20 70 72 6f 74 65 63 74 65 64 20 62 79 0a 2a  e protected by.*
2590: 2a 20 20 20 20 20 74 68 65 20 72 6f 6c 6c 62 61  *     the rollba
25a0: 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 42 75 74  ck journal.  But
25b0: 20 74 68 69 73 20 66 6c 61 67 20 73 61 79 73 20   this flag says 
25c0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 77 61  that the page wa
25d0: 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 6f 72 69  s.**     not ori
25e0: 67 69 6e 61 6c 6c 79 20 70 61 72 74 20 6f 66 20  ginally part of 
25f0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20  the freelist so 
2600: 74 68 61 74 20 69 74 20 73 74 69 6c 6c 20 6e 65  that it still ne
2610: 65 64 73 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65  eds to.**     be
2620: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20   rolled back in 
2630: 73 70 69 74 65 20 6f 66 20 61 6e 79 20 73 75 62  spite of any sub
2640: 73 65 71 75 65 6e 74 20 44 6f 6e 74 52 6f 6c 6c  sequent DontRoll
2650: 62 61 63 6b 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a  back() calls..**
2660: 0a 2a 2a 20 6e 65 65 64 52 65 61 64 20 0a 2a 2a  .** needRead .**
2670: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61  .**     This fla
2680: 67 20 6d 65 61 6e 73 20 28 77 68 65 6e 20 74 72  g means (when tr
2690: 75 65 29 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ue) that the con
26a0: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
26b0: 20 68 61 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20   has.**     not 
26c0: 79 65 74 20 62 65 65 6e 20 6c 6f 61 64 65 64 20  yet been loaded 
26d0: 66 72 6f 6d 20 64 69 73 6b 2e 20 20 54 68 65 20  from disk.  The 
26e0: 69 6e 2d 6d 65 6d 6f 72 79 20 63 6f 6e 74 65 6e  in-memory conten
26f0: 74 20 69 73 20 6a 75 73 74 0a 2a 2a 20 20 20 20  t is just.**    
2700: 20 67 61 72 62 61 67 65 2e 20 20 28 41 63 74 75   garbage.  (Actu
2710: 61 6c 6c 79 2c 20 77 65 20 7a 65 72 6f 20 74 68  ally, we zero th
2720: 65 20 63 6f 6e 74 65 6e 74 2c 20 62 75 74 20 79  e content, but y
2730: 6f 75 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a  ou should not.**
2740: 20 20 20 20 20 6d 61 6b 65 20 61 6e 79 20 61 73       make any as
2750: 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20  sumptions about 
2760: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6e 65 76 65  the content neve
2770: 72 74 68 65 6c 65 73 73 2e 29 20 20 49 66 20 74  rtheless.)  If t
2780: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e  he.**     conten
2790: 74 20 69 73 20 6e 65 65 64 65 64 20 69 6e 20 74  t is needed in t
27a0: 68 65 20 66 75 74 75 72 65 2c 20 69 74 20 73 68  he future, it sh
27b0: 6f 75 6c 64 20 62 65 20 72 65 61 64 20 66 72 6f  ould be read fro
27c0: 6d 20 74 68 65 0a 2a 2a 20 20 20 20 20 6f 72 69  m the.**     ori
27d0: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
27e0: 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ile..*/.typedef 
27f0: 73 74 72 75 63 74 20 50 67 48 64 72 20 50 67 48  struct PgHdr PgH
2800: 64 72 3b 0a 73 74 72 75 63 74 20 50 67 48 64 72  dr;.struct PgHdr
2810: 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67   {.  Pager *pPag
2820: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
2830: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
2840: 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20 70   to which this p
2850: 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20  age belongs */. 
2860: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
2890: 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
28a0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
28b0: 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76 48 61  xtHash, *pPrevHa
28c0: 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c  sh;  /* Hash col
28d0: 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72  lision chain for
28e0: 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20   PgHdr.pgno */. 
28f0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 46 72 65   PgHdr *pNextFre
2900: 65 2c 20 2a 70 50 72 65 76 46 72 65 65 3b 20 20  e, *pPrevFree;  
2910: 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f 66 20 70  /* Freelist of p
2920: 61 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d  ages where nRef=
2930: 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  =0 */.  PgHdr *p
2940: 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20  NextAll;        
2950: 20 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74         /* A list
2960: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f   of all pages */
2970: 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b  .  u8 inJournal;
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2990: 20 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73    /* TRUE if has
29a0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
29b0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
29c0: 20 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20   dirty;         
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e0: 54 52 55 45 20 69 66 20 77 65 20 6e 65 65 64 20  TRUE if we need 
29f0: 74 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63 68  to write back ch
2a00: 61 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65  anges */.  u8 ne
2a10: 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  edSync;         
2a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e            /* Syn
2a30: 63 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  c journal before
2a40: 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 70 61   writing this pa
2a50: 67 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79  ge */.  u8 alway
2a60: 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  sRollback;      
2a70: 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c         /* Disabl
2a80: 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  e DontRollback()
2a90: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
2aa0: 2f 0a 20 20 75 38 20 6e 65 65 64 52 65 61 64 3b  /.  u8 needRead;
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 2f 2a 20 52 65 61 64 20 63 6f 6e 74 65     /* Read conte
2ad0: 6e 74 20 69 66 20 50 61 67 65 72 57 72 69 74 65  nt if PagerWrite
2ae0: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a  () is called */.
2af0: 20 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66    short int nRef
2b00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
2b20: 65 72 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  ers of this page
2b30: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69   */.  PgHdr *pDi
2b40: 72 74 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79  rty, *pPrevDirty
2b50: 3b 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61  ;    /* Dirty pa
2b60: 67 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 6f 74  ges */.  u32 not
2b70: 55 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  Used;           
2b80: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
2b90: 72 20 73 70 61 63 65 20 2a 2f 0a 23 69 66 64 65  r space */.#ifde
2ba0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
2bb0: 41 47 45 53 0a 20 20 75 33 32 20 70 61 67 65 48  AGES.  u32 pageH
2bc0: 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  ash;.#endif.  /*
2bd0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
2be0: 65 20 62 79 74 65 73 20 6f 66 20 70 61 67 65 20  e bytes of page 
2bf0: 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73  data follow this
2c00: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20   header */.  /* 
2c10: 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74  Pager.nExtra byt
2c20: 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61  es of local data
2c30: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67 65   follow the page
2c40: 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   data */.};../*.
2c50: 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ** For an in-mem
2c60: 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62 61 73  ory only databas
2c70: 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20 69 6e  e, some extra in
2c80: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 63  formation is rec
2c90: 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65  orded about.** e
2ca0: 61 63 68 20 70 61 67 65 20 73 6f 20 74 68 61 74  ach page so that
2cb0: 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20   changes can be 
2cc0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a  rolled back.  (J
2cd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65  ournal files are
2ce0: 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72   not.** used for
2cf0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
2d00: 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c  ases.)  The foll
2d10: 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  owing informatio
2d20: 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a  n is added to.**
2d30: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
2d40: 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f  y EXTRA block fo
2d50: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
2d60: 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bases..**.** Thi
2d70: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f  s information co
2d80: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 61 64  uld have been ad
2d90: 64 65 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ded directly to 
2da0: 74 68 65 20 50 67 48 64 72 20 73 74 72 75 63 74  the PgHdr struct
2db0: 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e  ure..** But then
2dc0: 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 75   it would take u
2dd0: 70 20 61 6e 20 65 78 74 72 61 20 38 20 62 79 74  p an extra 8 byt
2de0: 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e  es of storage on
2df0: 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a 2a 20   every PgHdr.** 
2e00: 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61  even for disk-ba
2e10: 73 65 64 20 64 61 74 61 62 61 73 65 73 2e 20 20  sed databases.  
2e20: 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f 75 74  Splitting it out
2e30: 20 73 61 76 65 73 20 38 20 62 79 74 65 73 2e 20   saves 8 bytes. 
2e40: 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79   This.** is only
2e50: 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20 30 2e   a savings of 0.
2e60: 38 25 20 62 75 74 20 74 68 6f 73 65 20 70 65 72  8% but those per
2e70: 63 65 6e 74 61 67 65 73 20 61 64 64 20 75 70 2e  centages add up.
2e80: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
2e90: 63 74 20 50 67 48 69 73 74 6f 72 79 20 50 67 48  ct PgHistory PgH
2ea0: 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74 20 50  istory;.struct P
2eb0: 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75 38 20  gHistory {.  u8 
2ec0: 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f  *pOrig;     /* O
2ed0: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74 65 78  riginal page tex
2ee0: 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f 20 74  t.  Restore to t
2ef0: 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f  his on a full ro
2f00: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a  llback */.  u8 *
2f10: 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65  pStmt;     /* Te
2f20: 78 74 20 61 73 20 69 74 20 77 61 73 20 61 74 20  xt as it was at 
2f30: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
2f40: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
2f50: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 50 67 48 64  tement */.  PgHd
2f60: 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70  r *pNextStmt, *p
2f70: 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69  PrevStmt;  /* Li
2f80: 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  st of pages in t
2f90: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
2fa0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53  rnal */.  u8 inS
2fb0: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
2fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
2fd0: 20 69 66 20 69 6e 20 74 68 65 20 73 74 61 74 65   if in the state
2fe0: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  ment subjournal 
2ff0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d  */.};../*.** A m
3000: 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e  acro used for in
3010: 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63  voking the codec
3020: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
3030: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3040: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65  E_HAS_CODEC.# de
3050: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
3060: 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64  N,X) if( P->xCod
3070: 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64  ec!=0 ){ P->xCod
3080: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
3090: 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69  D,N,X); }.# defi
30a0: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
30b0: 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d 3e 78  X) ((char*)(P->x
30c0: 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64  Codec!=0?P->xCod
30d0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
30e0: 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65  D,N,X):D)).#else
30f0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
3100: 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d  (P,D,N,X) /* NO-
3110: 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43  OP */.# define C
3120: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28  ODEC2(P,D,N,X) (
3130: 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64 69 66  (char*)D).#endif
3140: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
3150: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50  a pointer to a P
3160: 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e  gHdr into a poin
3170: 74 65 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a  ter to its data.
3180: 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69  ** and back agai
3190: 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47  n..*/.#define PG
31a0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20  HDR_TO_DATA(P)  
31b0: 28 28 76 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d  ((void*)(&(P)[1]
31c0: 29 29 0a 23 64 65 66 69 6e 65 20 44 41 54 41 5f  )).#define DATA_
31d0: 54 4f 5f 50 47 48 44 52 28 44 29 20 20 28 26 28  TO_PGHDR(D)  (&(
31e0: 28 50 67 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d  (PgHdr*)(D))[-1]
31f0: 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f  ).#define PGHDR_
3200: 54 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28  TO_EXTRA(G,P) ((
3210: 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29 28  void*)&((char*)(
3220: 26 28 47 29 5b 31 5d 29 29 5b 28 50 29 2d 3e 70  &(G)[1]))[(P)->p
3230: 61 67 65 53 69 7a 65 5d 29 0a 23 64 65 66 69 6e  ageSize]).#defin
3240: 65 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  e PGHDR_TO_HIST(
3250: 50 2c 50 47 52 29 20 20 5c 0a 20 20 20 20 20 20  P,PGR)  \.      
3260: 20 20 20 20 20 20 28 28 50 67 48 69 73 74 6f 72        ((PgHistor
3270: 79 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50  y*)&((char*)(&(P
3280: 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e 70 61  )[1]))[(PGR)->pa
3290: 67 65 53 69 7a 65 2b 28 50 47 52 29 2d 3e 6e 45  geSize+(PGR)->nE
32a0: 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  xtra])../*.** A 
32b0: 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20  open page cache 
32c0: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
32d0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
32e0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
32f0: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 6d   Pager.errCode m
3300: 61 79 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c  ay be set to SQL
3310: 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
3320: 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a  E_CORRUPT, or.**
3330: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e   or SQLITE_FULL.
3340: 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65   Once one of the
3350: 20 66 69 72 73 74 20 74 68 72 65 65 20 65 72 72   first three err
3360: 6f 72 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70  ors occurs, it p
3370: 65 72 73 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69  ersists.** and i
3380: 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 74 68  s returned as th
3390: 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76 65 72  e result of ever
33a0: 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20 41 50  y major pager AP
33b0: 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20  I call.  The.** 
33c0: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72 65 74 75  SQLITE_FULL retu
33d0: 72 6e 20 63 6f 64 65 20 69 73 20 73 6c 69 67 68  rn code is sligh
33e0: 74 6c 79 20 64 69 66 66 65 72 65 6e 74 2e 20 49  tly different. I
33f0: 74 20 70 65 72 73 69 73 74 73 20 6f 6e 6c 79 20  t persists only 
3400: 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78  until the.** nex
3410: 74 20 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c  t successful rol
3420: 6c 62 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d  lback is perform
3430: 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ed on the pager 
3440: 63 61 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20  cache. Also,.** 
3450: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73  SQLITE_FULL does
3460: 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20   not affect the 
3470: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
3480: 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  ) and sqlite3Pag
3490: 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50  erLookup().** AP
34a0: 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69  Is, they may sti
34b0: 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65  ll be used succe
34c0: 73 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75  ssfully..*/.stru
34d0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
34e0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
34f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
3500: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
3510: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 6a  for IO */.  u8 j
3520: 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20  ournalOpen;     
3530: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3540: 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  if journal file 
3550: 64 65 73 63 72 69 70 74 6f 72 73 20 69 73 20 76  descriptors is v
3560: 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  alid */.  u8 jou
3570: 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20  rnalStarted;    
3580: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3590: 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e   header of journ
35a0: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a  al is synced */.
35b0: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35d0: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
35e0: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
35f0: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52  file */.  u8 noR
3600: 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20  eadlock;        
3610: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
3620: 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e  bother to obtain
3630: 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20   readlocks */.  
3640: 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20  u8 stmtOpen;    
3650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3660: 72 75 65 20 69 66 20 74 68 65 20 73 74 61 74 65  rue if the state
3670: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  ment subjournal 
3680: 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20  is open */.  u8 
3690: 73 74 6d 74 49 6e 55 73 65 3b 20 20 20 20 20 20  stmtInUse;      
36a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
36b0: 20 77 65 20 61 72 65 20 69 6e 20 61 20 73 74 61   we are in a sta
36c0: 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
36d0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74  ction */.  u8 st
36e0: 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20  mtAutoopen;     
36f0: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73         /* Open s
3700: 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  tmt journal when
3710: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73   main journal is
3720: 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e   opened*/.  u8 n
3730: 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  oSync;          
3740: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
3750: 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  t sync the journ
3760: 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  al if true */.  
3770: 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20  u8 fullSync;    
3780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3790: 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66  o extra syncs of
37a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
37b0: 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20   robustness */. 
37c0: 20 75 38 20 73 79 6e 63 5f 66 6c 61 67 73 3b 20   u8 sync_flags; 
37d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37e0: 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e 4f 52 4d  One of SYNC_NORM
37f0: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
3800: 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20  */.  u8 state;  
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3820: 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   /* PAGER_UNLOCK
3830: 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45  , _SHARED, _RESE
3840: 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20  RVED, etc. */.  
3850: 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20  u8 tempFile;    
3860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
3870: 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65  Filename is a te
3880: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mporary file */.
3890: 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20    u8 readOnly;  
38a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
38b0: 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
38c0: 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
38d0: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38f0: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66 73  /* True if an fs
3900: 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64 20  ync() is needed 
3910: 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  on the journal *
3920: 2f 0a 20 20 75 38 20 64 69 72 74 79 43 61 63 68  /.  u8 dirtyCach
3930: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3940: 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65  /* True if cache
3950: 64 20 70 61 67 65 73 20 68 61 76 65 20 63 68 61  d pages have cha
3960: 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77  nged */.  u8 alw
3970: 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20  aysRollback;    
3980: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
3990: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
39a0: 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f  for all pages */
39b0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
39c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
39d0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
39e0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
39f0: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
3a00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3a10: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
3a20: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
3a30: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
3a40: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63  /.  u8 doNotSync
3a50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3a60: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c  /* Boolean. Whil
3a70: 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73  e true, do not s
3a80: 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a  pill the cache *
3a90: 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65  /.  u8 exclusive
3aa0: 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Mode;           
3ab0: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65  /* Boolean. True
3ac0: 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   if locking_mode
3ad0: 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20  ==EXCLUSIVE */. 
3ae0: 20 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44   u8 changeCountD
3af0: 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  one;         /* 
3b00: 53 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d  Set after increm
3b10: 65 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67  enting the chang
3b20: 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  e-counter */.  i
3b30: 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20  nt errCode;     
3b40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
3b50: 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e  e of several kin
3b60: 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a  ds of errors */.
3b70: 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20    int dbSize;   
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b90: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
3ba0: 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   in the file */.
3bb0: 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65    int origDbSize
3bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3bd0: 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74   dbSize before t
3be0: 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67  he current chang
3bf0: 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53  e */.  int stmtS
3c00: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
3c10: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61     /* Size of da
3c20: 74 61 62 61 73 65 20 28 69 6e 20 70 61 67 65 73  tabase (in pages
3c30: 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28  ) at stmt_begin(
3c40: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b  ) */.  int nRec;
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3c70: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
3c80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
3c90: 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b    u32 cksumInit;
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3cb0: 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61   Quasi-random va
3cc0: 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65  lue added to eve
3cd0: 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  ry checksum */. 
3ce0: 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20   int stmtNRec;  
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3d00: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
3d10: 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75  s in stmt subjou
3d20: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  rnal */.  int nE
3d30: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
3d40: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
3d50: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
3d60: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
3d70: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  age */.  int pag
3d80: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
3d90: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3da0: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
3db0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
3dc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3dd0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
3de0: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
3df0: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  pages */.  int n
3e00: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
3e10: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3e20: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
3e30: 67 65 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e  ges with PgHdr.n
3e40: 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d  Ref>0 */.  int m
3e50: 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  xPage;          
3e60: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
3e70: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  m number of page
3e80: 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63  s to hold in cac
3e90: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  he */.  Pgno mxP
3ea0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
3eb0: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
3ec0: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
3ed0: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
3ee0: 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b   u8 *aInJournal;
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3f00: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
3f10: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
3f20: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
3f30: 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20  u8 *aInStmt;    
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3f50: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
3f60: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
3f70: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  base */.  char *
3f80: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
3f90: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
3fa0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3fb0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
3fc0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
3fd0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
3fe0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
3ff0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65  */.  char *zDire
4000: 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20  ctory;          
4010: 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f   /* Directory ho
4020: 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ld database and 
4030: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
4040: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
4050: 2a 66 64 2c 20 2a 6a 66 64 3b 20 20 20 20 20 2f  *fd, *jfd;     /
4060: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
4070: 72 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  rs for database 
4080: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  and journal */. 
4090: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73   sqlite3_file *s
40a0: 74 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  tfd;         /* 
40b0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
40c0: 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e  for the statemen
40d0: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20  t subjournal*/. 
40e0: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42   BusyHandler *pB
40f0: 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20  usyHandler;  /* 
4100: 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
4110: 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f  e.busyHandler */
4120: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
4130: 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 2f  , *pLast;      /
4140: 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 70  * List of free p
4150: 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20  ages */.  PgHdr 
4160: 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20 20  *pFirstSynced;  
4170: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66        /* First f
4180: 72 65 65 20 70 61 67 65 20 77 69 74 68 20 50 67  ree page with Pg
4190: 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Hdr.needSync==0 
41a0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c  */.  PgHdr *pAll
41b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
41c0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
41d0: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
41e0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
41f0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
4200: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73  f pages in the s
4210: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
4220: 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  nal */.  PgHdr *
4230: 70 44 69 72 74 79 3b 20 20 20 20 20 20 20 20 20  pDirty;         
4240: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
4250: 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
4260: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
4270: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
4280: 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65   /* Current byte
4290: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
42a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
42b0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
42d0: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
42e0: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
42f0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
4300: 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20 20  stmtHdrOff;     
4310: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
4320: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
4330: 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74 61  written this sta
4340: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20  tement */.  i64 
4350: 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20 20  stmtCksum;      
4360: 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d          /* cksum
4370: 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65 6d  Init when statem
4380: 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 20  ent was started 
4390: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53 69  */.  i64 stmtJSi
43a0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
43b0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
43c0: 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69  nal at stmt_begi
43d0: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63  n() */.  int sec
43e0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
43f0: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
4400: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
4410: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23  ng rollback */.#
4420: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
4430: 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  T.  int nHit, nM
4440: 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  iss;            
4450: 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e  /* Cache hits an
4460: 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69  d missing */.  i
4470: 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65  nt nRead, nWrite
4480: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
4490: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
44a0: 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e  d/written */.#en
44b0: 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  dif.  void (*xDe
44c0: 73 74 72 75 63 74 6f 72 29 28 44 62 50 61 67 65  structor)(DbPage
44d0: 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20  *,int); /* Call 
44e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
44f0: 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20  n freeing pages 
4500: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
4510: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c 69  niter)(DbPage*,i
4520: 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74  nt);   /* Call t
4530: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
4540: 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73   reloading pages
4550: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
4560: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f  E_HAS_CODEC.  vo
4570: 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
4580: 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
4590: 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20  nt); /* Routine 
45a0: 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20  for en/decoding 
45b0: 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
45c0: 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20  pCodecArg;      
45d0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
45e0: 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65  rgument to xCode
45f0: 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  c() */.#endif.  
4600: 69 6e 74 20 6e 48 61 73 68 3b 20 20 20 20 20 20  int nHash;      
4610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4620: 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ize of the pager
4630: 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
4640: 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68 3b 20   PgHdr **aHash; 
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4660: 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61  Hash table to ma
4670: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  p page number to
4680: 20 50 67 48 64 72 20 2a 2f 0a 23 69 66 64 65 66   PgHdr */.#ifdef
4690: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
46a0: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
46b0: 0a 20 20 50 61 67 65 72 20 2a 70 4e 65 78 74 3b  .  Pager *pNext;
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
46d0: 2a 20 44 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20  * Doubly linked 
46e0: 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20 6f  list of pagers o
46f0: 6e 20 77 68 69 63 68 20 2a 2f 0a 20 20 50 61 67  n which */.  Pag
4700: 65 72 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20  er *pPrev;      
4710: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
4720: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
4730: 72 79 28 29 20 77 69 6c 6c 20 77 6f 72 6b 20 2a  ry() will work *
4740: 2f 0a 20 20 69 6e 74 20 69 49 6e 55 73 65 4d 4d  /.  int iInUseMM
4750: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4760: 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 75  /* Non-zero if u
4770: 6e 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 4d 4d  navailable to MM
4780: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 55 73 65   */.  int iInUse
4790: 44 42 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  DB;             
47a0: 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66    /* Non-zero if
47b0: 20 69 6e 20 73 71 6c 69 74 65 33 5f 72 65 6c 65   in sqlite3_rele
47c0: 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 2a 2f 0a  ase_memory() */.
47d0: 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70  #endif.  char *p
47e0: 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20  TmpSpace;       
47f0: 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61       /* Pager.pa
4800: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
4810: 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73  space for tmp us
4820: 65 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69  e */.  char dbFi
4830: 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20  leVers[16];     
4840: 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68     /* Changes wh
4850: 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20  enever database 
4860: 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a  file changes */.
4870: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  };../*.** The fo
4880: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
4890: 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f  ariables hold co
48a0: 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a  unters used for.
48b0: 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  ** testing purpo
48c0: 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65  ses only.  These
48d0: 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f   variables do no
48e0: 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20  t exist in.** a 
48f0: 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c  non-testing buil
4900: 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  d.  These variab
4910: 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65  les are not thre
4920: 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64  ad-safe..*/.#ifd
4930: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
4940: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4950: 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20  _readdb_count = 
4960: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
4970: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65  of full pages re
4980: 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e  ad from DB */.in
4990: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
49a0: 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20  writedb_count = 
49b0: 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
49c0: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69  f full pages wri
49d0: 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e  tten to DB */.in
49e0: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
49f0: 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30  writej_count = 0
4a00: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
4a10: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
4a20: 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 69 6e  to journal */.in
4a30: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
4a40: 70 67 66 72 65 65 5f 63 6f 75 6e 74 20 3d 20 30  pgfree_count = 0
4a50: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
4a60: 66 20 63 61 63 68 65 20 70 61 67 65 73 20 66 72  f cache pages fr
4a70: 65 65 64 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  eed */.# define 
4a80: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
4a90: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
4aa0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
4ab0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
4ac0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
4ad0: 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74  able points to t
4ae0: 68 65 20 68 65 61 64 20 6f 66 20 61 20 64 6f 75  he head of a dou
4af0: 62 6c 65 2d 6c 69 6e 6b 65 64 20 6c 69 73 74 0a  ble-linked list.
4b00: 2a 2a 20 6f 66 20 61 6c 6c 20 70 61 67 65 72 73  ** of all pagers
4b10: 20 74 68 61 74 20 61 72 65 20 65 6c 69 67 69 62   that are eligib
4b20: 6c 65 20 66 6f 72 20 70 61 67 65 20 73 74 65 61  le for page stea
4b30: 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20 73  ling by the.** s
4b40: 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d  qlite3_release_m
4b50: 65 6d 6f 72 79 28 29 20 69 6e 74 65 72 66 61 63  emory() interfac
4b60: 65 2e 20 20 41 63 63 65 73 73 20 74 6f 20 74 68  e.  Access to th
4b70: 69 73 20 6c 69 73 74 20 69 73 0a 2a 2a 20 70 72  is list is.** pr
4b80: 6f 74 65 63 74 65 64 20 62 79 20 74 68 65 20 53  otected by the S
4b90: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
4ba0: 49 43 5f 4d 45 4d 32 20 6d 75 74 65 78 2e 0a 2a  IC_MEM2 mutex..*
4bb0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
4bc0: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
4bd0: 4e 41 47 45 4d 45 4e 54 0a 73 74 61 74 69 63 20  NAGEMENT.static 
4be0: 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 50 61  Pager *sqlite3Pa
4bf0: 67 65 72 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6e  gerList = 0;.#en
4c00: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  dif.../*.** Jour
4c10: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
4c20: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
4c30: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
4c40: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
4c50: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
4c60: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
4c70: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
4c80: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
4c90: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72  .**.** Since ver
4ca0: 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20  sion 2.8.0, the 
4cb0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
4cc0: 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e  ontains addition
4cd0: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
4ce0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
4cf0: 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  n.  If the power
4d00: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
4d10: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69   journal is begi
4d20: 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65  n.** written, se
4d30: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
4d40: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
4d50: 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ear in the journ
4d60: 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72  al.** file after
4d70: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
4d80: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
4d90: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
4da0: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
4db0: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
4dc0: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
4dd0: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
4de0: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
4df0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
4e00: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
4e10: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
4e20: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
4e30: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
4e40: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
4e50: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
4e60: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
4e70: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a  on for the new j
4e80: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
4e90: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
4ea0: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
4eb0: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
4ec0: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
4ed0: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
4ee0: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
4ef0: 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72  r and the pPager
4f00: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
4f10: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
4f20: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
4f30: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
4f40: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
4f50: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
4f60: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
4f70: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
4f80: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
4f90: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
4fa0: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
4fb0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
4fc0: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
4fd0: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
4fe0: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
4ff0: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
5000: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
5010: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
5020: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
5030: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
5040: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
5050: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
5060: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
5070: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
5080: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
5090: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
50a0: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
50b0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
50c0: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
50d0: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
50e0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
50f0: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
5100: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
5110: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
5120: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
5130: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
5140: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
5150: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
5160: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
5170: 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a  0x63, 0xd7,.};..
5180: 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*.** The size o
5190: 66 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  f the header and
51a0: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e   of each page in
51b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
51c0: 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79  determined.** by
51d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
51e0: 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  acros..*/.#defin
51f0: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
5200: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
5210: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
5220: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
5230: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
5240: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
5250: 20 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   In the future, 
5260: 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a  this could be.**
5270: 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c   set to some val
5280: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
5290: 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72   disk controller
52a0: 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a  . The important.
52b0: 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ** characteristi
52c0: 63 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20  c is that it is 
52d0: 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73  the same size as
52e0: 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a   a disk sector..
52f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
5300: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5310: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
5320: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
5330: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
5340: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
5350: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
5360: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5370: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
5380: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
5390: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
53a0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
53b0: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
53c0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
53d0: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
53e0: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
53f0: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
5400: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
5410: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
5420: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
5430: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
5440: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
5450: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
5460: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
5470: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
5480: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61  #endif../*.** Pa
5490: 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f  ge number PAGER_
54a0: 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72  MJ_PGNO is never
54b0: 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69   used in an SQLi
54c0: 74 65 20 64 61 74 61 62 61 73 65 20 28 69 74 20  te database (it 
54d0: 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66  is.** reserved f
54e0: 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e  or working aroun
54f0: 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69  d a windows/posi
5500: 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74  x incompatibilit
5510: 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65  y). It is.** use
5520: 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d in the journal
5530: 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74   to signify that
5540: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
5550: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
5560: 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65  le .** is devote
5570: 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d  d to storing a m
5580: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
5590: 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e  me - there are n
55a0: 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a  o more pages to.
55b0: 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65  ** roll back. Se
55c0: 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66  e comments for f
55d0: 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73  unction writeMas
55e0: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
55f0: 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20   details..*/./* 
5600: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a  #define PAGER_MJ
5610: 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e  _PGNO(x) (PENDIN
5620: 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67  G_BYTE/((x)->pag
5630: 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69  eSize)) */.#defi
5640: 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  ne PAGER_MJ_PGNO
5650: 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59  (x) ((PENDING_BY
5660: 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a  TE/((x)->pageSiz
5670: 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  e))+1)../*.** Th
5680: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
5690: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
56a0: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
56b0: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
56c0: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
56d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  ./*.** The pager
56e0: 45 6e 74 65 72 28 29 20 61 6e 64 20 70 61 67 65  Enter() and page
56f0: 72 4c 65 61 76 65 28 29 20 72 6f 75 74 69 6e 65  rLeave() routine
5700: 73 20 61 63 71 75 69 72 65 20 61 6e 64 20 72 65  s acquire and re
5710: 6c 65 61 73 65 0a 2a 2a 20 61 20 6d 75 74 65 78  lease.** a mutex
5720: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 72 2e 20   on each pager. 
5730: 20 54 68 65 20 6d 75 74 65 78 20 69 73 20 72 65   The mutex is re
5740: 63 75 72 73 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  cursive..**.** T
5750: 68 69 73 20 69 73 20 61 20 73 70 65 63 69 61 6c  his is a special
5760: 2d 70 75 72 70 6f 73 65 20 6d 75 74 65 78 2e 20  -purpose mutex. 
5770: 20 49 74 20 6f 6e 6c 79 20 70 72 6f 76 69 64 65   It only provide
5780: 73 20 6d 75 74 75 61 6c 20 65 78 63 6c 75 73 69  s mutual exclusi
5790: 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68  on.** between th
57a0: 65 20 42 74 72 65 65 20 61 6e 64 20 74 68 65 20  e Btree and the 
57b0: 4d 65 6d 6f 72 79 20 4d 61 6e 61 67 65 6d 65 6e  Memory Managemen
57c0: 74 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73  t sqlite3_releas
57d0: 65 5f 6d 65 6d 6f 72 79 28 29 0a 2a 2a 20 66 75  e_memory().** fu
57e0: 6e 63 74 69 6f 6e 2e 20 20 49 74 20 64 6f 65 73  nction.  It does
57f0: 20 6e 6f 74 20 70 72 65 76 65 6e 74 2c 20 66 6f   not prevent, fo
5800: 72 20 65 78 61 6d 70 6c 65 2c 20 74 77 6f 20 42  r example, two B
5810: 74 72 65 65 73 20 66 72 6f 6d 20 61 63 63 65 73  trees from acces
5820: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 73 61 6d 65  sing.** the same
5830: 20 70 61 67 65 72 20 61 74 20 74 68 65 20 73 61   pager at the sa
5840: 6d 65 20 74 69 6d 65 2e 20 20 4f 74 68 65 72 20  me time.  Other 
5850: 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20  general-purpose 
5860: 6d 75 74 65 78 65 73 20 69 6e 0a 2a 2a 20 74 68  mutexes in.** th
5870: 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 68 61  e btree layer ha
5880: 6e 64 6c 65 20 74 68 61 74 20 63 68 6f 72 65 2e  ndle that chore.
5890: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
58a0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
58b0: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 73 74 61  MANAGEMENT.  sta
58c0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 45 6e  tic void pagerEn
58d0: 74 65 72 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ter(Pager *p){. 
58e0: 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 2b 2b     p->iInUseDB++
58f0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e  ;.    if( p->iIn
5900: 55 73 65 4d 4d 20 26 26 20 70 2d 3e 69 49 6e 55  UseMM && p->iInU
5910: 73 65 44 42 3d 3d 31 20 29 7b 0a 20 20 20 20 20  seDB==1 ){.     
5920: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
5930: 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 6d 75 74  mutex;.      mut
5940: 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
5950: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
5960: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d  MUTEX_STATIC_MEM
5970: 32 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 49 6e  2);.      p->iIn
5980: 55 73 65 44 42 20 3d 20 30 3b 0a 20 20 20 20 20  UseDB = 0;.     
5990: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
59a0: 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20  nter(mutex);.   
59b0: 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 20 3d     p->iInUseDB =
59c0: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
59d0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
59e0: 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
59f0: 61 73 73 65 72 74 28 20 70 2d 3e 69 49 6e 55 73  assert( p->iInUs
5a00: 65 4d 4d 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  eMM==0 );.  }.  
5a10: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
5a20: 72 4c 65 61 76 65 28 50 61 67 65 72 20 2a 70 29  rLeave(Pager *p)
5a30: 7b 0a 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44  {.    p->iInUseD
5a40: 42 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  B--;.    assert(
5a50: 20 70 2d 3e 69 49 6e 55 73 65 44 42 3e 3d 30 20   p->iInUseDB>=0 
5a60: 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64  );.  }.#else.# d
5a70: 65 66 69 6e 65 20 70 61 67 65 72 45 6e 74 65 72  efine pagerEnter
5a80: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 70 61 67  (X).# define pag
5a90: 65 72 4c 65 61 76 65 28 58 29 0a 23 65 6e 64 69  erLeave(X).#endi
5aa0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  f../*.** Enable 
5ab0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
5ac0: 74 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64 65  tracking (for de
5ad0: 62 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a  bugging) here:.*
5ae0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
5af0: 44 45 42 55 47 0a 20 20 69 6e 74 20 70 61 67 65  DEBUG.  int page
5b00: 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  r3_refinfo_enabl
5b10: 65 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  e = 0;.  static 
5b20: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e  void pager_refin
5b30: 66 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20  fo(PgHdr *p){.  
5b40: 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74    static int cnt
5b50: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70   = 0;.    if( !p
5b60: 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e  ager3_refinfo_en
5b70: 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  able ) return;. 
5b80: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
5b90: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52  rintf(.       "R
5ba0: 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d  EFCNT: %4d addr=
5bb0: 25 70 20 6e 52 65 66 3d 25 2d 33 64 20 74 6f 74  %p nRef=%-3d tot
5bc0: 61 6c 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  al=%d\n",.      
5bd0: 20 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f   p->pgno, PGHDR_
5be0: 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e  TO_DATA(p), p->n
5bf0: 52 65 66 2c 20 70 2d 3e 70 50 61 67 65 72 2d 3e  Ref, p->pPager->
5c00: 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  nRef.    );.    
5c10: 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65  cnt++;   /* Some
5c20: 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62  thing to set a b
5c30: 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a  reakpoint on */.
5c40: 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46    }.# define REF
5c50: 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72  INFO(X)  pager_r
5c60: 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a  efinfo(X).#else.
5c70: 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f  # define REFINFO
5c80: 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
5c90: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
5ca0: 20 70 61 67 65 20 2a 70 50 67 20 68 61 73 20 61   page *pPg has a
5cb0: 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
5cc0: 74 65 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65  ten to the state
5cd0: 6d 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ment.** journal 
5ce0: 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 20 73 6e  (or statement sn
5cf0: 61 70 73 68 6f 74 20 68 61 73 20 62 65 65 6e 20  apshot has been 
5d00: 63 72 65 61 74 65 64 2c 20 69 66 20 2a 70 50 67  created, if *pPg
5d10: 20 69 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61   is part.** of a
5d20: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
5d30: 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  base)..*/.static
5d40: 20 69 6e 74 20 70 61 67 65 49 6e 53 74 61 74 65   int pageInState
5d50: 6d 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29  ment(PgHdr *pPg)
5d60: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
5d70: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
5d80: 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
5d90: 20 20 20 20 72 65 74 75 72 6e 20 50 47 48 44 52      return PGHDR
5da0: 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
5db0: 61 67 65 72 29 2d 3e 69 6e 53 74 6d 74 3b 0a 20  ager)->inStmt;. 
5dc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f   }else{.    Pgno
5dd0: 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
5de0: 6f 3b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70  o;.    u8 *a = p
5df0: 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3b 0a  Pager->aInStmt;.
5e00: 20 20 20 20 72 65 74 75 72 6e 20 28 61 20 26 26      return (a &&
5e10: 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67   (int)pgno<=pPag
5e20: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 26 26 20  er->stmtSize && 
5e30: 28 61 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c  (a[pgno/8] & (1<
5e40: 3c 28 70 67 6e 6f 26 37 29 29 29 29 3b 0a 20 20  <(pgno&7))));.  
5e50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
5e60: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
5e70: 65 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62  e pager hash tab
5e80: 6c 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74  le to N.  N must
5e90: 20 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f   be a power.** o
5ea0: 66 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  f two..*/.static
5eb0: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 69   void pager_resi
5ec0: 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50 61  ze_hash_table(Pa
5ed0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
5ee0: 20 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61   N){.  PgHdr **a
5ef0: 48 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73  Hash, *pPg;.  as
5f00: 73 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e 26  sert( N>0 && (N&
5f10: 28 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 70  (N-1))==0 );.  p
5f20: 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
5f30: 29 3b 0a 20 20 61 48 61 73 68 20 3d 20 73 71 6c  );.  aHash = sql
5f40: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
5f50: 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29  sizeof(aHash[0])
5f60: 2a 4e 20 29 3b 0a 20 20 70 61 67 65 72 45 6e 74  *N );.  pagerEnt
5f70: 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  er(pPager);.  if
5f80: 28 20 61 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20  ( aHash==0 ){.  
5f90: 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20    /* Failure to 
5fa0: 72 65 68 61 73 68 20 69 73 20 6e 6f 74 20 61 6e  rehash is not an
5fb0: 20 65 72 72 6f 72 2e 20 20 49 74 20 69 73 20 6f   error.  It is o
5fc0: 6e 6c 79 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  nly a performanc
5fd0: 65 20 68 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65  e hit. */.    re
5fe0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
5ff0: 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
6000: 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65  >aHash);.  pPage
6010: 72 2d 3e 6e 48 61 73 68 20 3d 20 4e 3b 0a 20 20  r->nHash = N;.  
6020: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20  pPager->aHash = 
6030: 61 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 50 67  aHash;.  for(pPg
6040: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
6050: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
6060: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 6e 74 20  xtAll){.    int 
6070: 68 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  h;.    if( pPg->
6080: 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pgno==0 ){.     
6090: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
60a0: 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50  extHash==0 && pP
60b0: 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  g->pPrevHash==0 
60c0: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  );.      continu
60d0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 20 3d  e;.    }.    h =
60e0: 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d   pPg->pgno & (N-
60f0: 31 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  1);.    pPg->pNe
6100: 78 74 48 61 73 68 20 3d 20 61 48 61 73 68 5b 68  xtHash = aHash[h
6110: 5d 3b 0a 20 20 20 20 69 66 28 20 61 48 61 73 68  ];.    if( aHash
6120: 5b 68 5d 20 29 7b 0a 20 20 20 20 20 20 61 48 61  [h] ){.      aHa
6130: 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68  sh[h]->pPrevHash
6140: 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
6150: 20 20 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67    aHash[h] = pPg
6160: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
6170: 48 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  Hash = 0;.  }.}.
6180: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
6190: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
61a0: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
61b0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
61c0: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
61d0: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
61e0: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
61f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
6200: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
6210: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
6220: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
6230: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
6240: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
6250: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
6260: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
6270: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6280: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
6290: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
62a0: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
62b0: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
62c0: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
62d0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
62e0: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
62f0: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
6300: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
6310: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
6320: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
6330: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
6340: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
6350: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
6360: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
6370: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
6380: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
6390: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
63a0: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
63b0: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
63c0: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
63d0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
63e0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
63f0: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
6400: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
6410: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
6420: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
6430: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
6440: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
6450: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
6460: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
6470: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
6480: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
6490: 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20  32 val){.  char 
64a0: 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69  ac[4];.  put32bi
64b0: 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72  ts(ac, val);.  r
64c0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
64d0: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20  rite(fd, ac, 4, 
64e0: 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  offset);.}../*.*
64f0: 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20 69 73  * If file pFd is
6500: 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69   open, call sqli
6510: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e  te3OsUnlock() on
6520: 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   it..*/.static i
6530: 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  nt osUnlock(sqli
6540: 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69  te3_file *pFd, i
6550: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28  nt eLock){.  if(
6560: 20 21 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 20   !pFd->pMethods 
6570: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6580: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
6590: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55  eturn sqlite3OsU
65a0: 6e 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b  nlock(pFd, eLock
65b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
65c0: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
65d0: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
65e0: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
65f0: 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
6600: 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  n.** can be used
6610: 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72   with this pager
6620: 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  . The optimizati
6630: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  on can be used i
6640: 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68  f:.**.**  (a) th
6650: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
6660: 20 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72   by OsDeviceChar
6670: 61 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e  acteristics() in
6680: 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20  dicates that.** 
6690: 20 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20       a database 
66a0: 70 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74  page may be writ
66b0: 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20  ten atomically, 
66c0: 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20  and.**  (b) the 
66d0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
66e0: 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  y OsSectorSize()
66f0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
6700: 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74   equal.**      t
6710: 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  o the page size.
6720: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70  .**.** If the op
6730: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f  timization canno
6740: 74 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20  t be used, 0 is 
6750: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
6760: 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20  can be used,.** 
6770: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
6780: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73  eturned is the s
6790: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
67a0: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a  al file when it.
67b0: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c  ** contains roll
67c0: 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78  back data for ex
67d0: 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a  actly one page..
67e0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
67f0: 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
6800: 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20  RITE.static int 
6810: 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50  jrnlBufferSize(P
6820: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
6830: 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20   int dc;        
6840: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61     /* Device cha
6850: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
6860: 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20    int nSector;  
6870: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
6880: 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  ze */.  int nPag
6890: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  e;        /* Pag
68a0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69  e size */.  sqli
68b0: 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70  te3_file *fd = p
68c0: 50 61 67 65 72 2d 3e 66 64 3b 0a 0a 20 20 69 66  Pager->fd;..  if
68d0: 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ( fd->pMethods )
68e0: 7b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74  {.    dc = sqlit
68f0: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
6900: 74 65 72 69 73 74 69 63 73 28 66 64 29 3b 0a 20  teristics(fd);. 
6910: 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 73 71 6c     nSector = sql
6920: 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
6930: 28 66 64 29 3b 0a 20 20 20 20 6e 50 61 67 65 20  (fd);.    nPage 
6940: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
6950: 7a 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ze;.  }..  asser
6960: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
6970: 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
6980: 38 29 29 3b 0a 20 20 61 73 73 65 72 74 28 53 51  8));.  assert(SQ
6990: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
69a0: 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
69b0: 29 3b 0a 0a 20 20 69 66 28 20 21 66 64 2d 3e 70  );..  if( !fd->p
69c0: 4d 65 74 68 6f 64 73 20 7c 7c 20 28 64 63 26 28  Methods || (dc&(
69d0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
69e0: 4d 49 43 7c 28 6e 50 61 67 65 3e 3e 38 29 29 26  MIC|(nPage>>8))&
69f0: 26 6e 53 65 63 74 6f 72 3c 3d 6e 50 61 67 65 29  &nSector<=nPage)
6a00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4a   ){.    return J
6a10: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
6a20: 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f  ager) + JOURNAL_
6a30: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
6a40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
6a50: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
6a60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
6a70: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68  uld be called wh
6a80: 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  en an error occu
6a90: 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  rs within the pa
6aa0: 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65  ger.** code. The
6ab0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
6ac0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
6ad0: 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74  the pager struct
6ae0: 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ure, the.** seco
6af0: 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  nd the error-cod
6b00: 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
6b10: 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
6b20: 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
6b30: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
6b40: 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
6b50: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
6b60: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
6b70: 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
6b80: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
6b90: 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
6ba0: 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
6bb0: 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49  CORRUPT, or SQLI
6bc0: 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65  TE_FULL.** the e
6bd0: 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72  rror becomes per
6be0: 73 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62  sistent. All sub
6bf0: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
6c00: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a  s on this Pager.
6c10: 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  ** will immediat
6c20: 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73  ely return the s
6c30: 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ame error code..
6c40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
6c50: 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
6c60: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
6c70: 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
6c80: 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
6c90: 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  t(.       pPager
6ca0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
6cb0: 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20  E_FULL ||.      
6cc0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
6cd0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20  ==SQLITE_OK ||. 
6ce0: 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
6cf0: 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d  rrCode & 0xff)==
6d00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29  SQLITE_IOERR.  )
6d10: 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32 3d  ;.  if(.    rc2=
6d20: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
6d30: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
6d40: 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32  IOERR ||.    rc2
6d50: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
6d60: 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  .  ){.    pPager
6d70: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
6d80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6d90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  .}../*.** If SQL
6da0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
6db0: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
6dc0: 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74  we do some sanit
6dd0: 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e  y checking.** on
6de0: 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67   the cache using
6df0: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
6e00: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
6e10: 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61  for testing.** a
6e20: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
6e30: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
6e40: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
6e50: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33  /*.** Return a 3
6e60: 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68  2-bit hash of th
6e70: 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20  e page data for 
6e80: 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
6e90: 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68   u32 pager_datah
6ea0: 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75  ash(int nByte, u
6eb0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
6ec0: 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68  ata){.  u32 hash
6ed0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
6ee0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74   for(i=0; i<nByt
6ef0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
6f00: 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20  h = (hash*1039) 
6f10: 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  + pData[i];.  }.
6f20: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
6f30: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
6f40: 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  r_pagehash(PgHdr
6f50: 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
6f60: 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  rn pager_datahas
6f70: 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d  h(pPage->pPager-
6f80: 3e 70 61 67 65 53 69 7a 65 2c 20 0a 20 20 20 20  >pageSize, .    
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fa0: 20 20 20 20 28 75 6e 73 69 67 6e 65 64 20 63 68      (unsigned ch
6fb0: 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  ar *)PGHDR_TO_DA
6fc0: 54 41 28 70 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f  TA(pPage));.}../
6fd0: 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50  *.** The CHECK_P
6fe0: 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  AGE macro takes 
6ff0: 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61  a PgHdr* as an a
7000: 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49  rgument. If SQLI
7010: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a  TE_CHECK_PAGES.*
7020: 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  * is defined, an
7030: 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20  d NDEBUG is not 
7040: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
7050: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63  rt() statement c
7060: 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68  hecks.** that th
7070: 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72  e page is either
7080: 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20   dirty or still 
7090: 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63  matches the calc
70a0: 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68  ulated page-hash
70b0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45  ..*/.#define CHE
70c0: 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b  CK_PAGE(x) check
70d0: 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76  Page(x).static v
70e0: 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67  oid checkPage(Pg
70f0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
7100: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
7110: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65  ->pPager;.  asse
7120: 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61  rt( !pPg->pageHa
7130: 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72  sh || pPager->er
7140: 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42 20 7c  rCode || MEMDB |
7150: 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 7c 7c 20  | pPg->dirty || 
7160: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65  .      pPg->page
7170: 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65  Hash==pager_page
7180: 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a  hash(pPg) );.}..
7190: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61  #else.#define pa
71a0: 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59  ger_datahash(X,Y
71b0: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
71c0: 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20  er_pagehash(X)  
71d0: 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  0.#define CHECK_
71e0: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a  PAGE(x).#endif..
71f0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
7200: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
7210: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
7220: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
7230: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65   be open..** The
7240: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7250: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61  file name is rea
7260: 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f  d from the end o
7270: 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a  f the file and .
7280: 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ** written into 
7290: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
72a0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
72b0: 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72  loc(). *pzMaster
72c0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f   is.** set to po
72d0: 69 6e 74 20 61 74 20 74 68 65 20 6d 65 6d 6f 72  int at the memor
72e0: 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  y and SQLITE_OK 
72f0: 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61  returned. The ca
7300: 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c  ller must.** sql
7310: 69 74 65 33 5f 66 72 65 65 28 29 20 2a 70 7a 4d  ite3_free() *pzM
7320: 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
7330: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
7340: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
7350: 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73 74 65 72  resent *pzMaster
7360: 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
7370: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
7380: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
7390: 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72  c int readMaster
73a0: 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f  Journal(sqlite3_
73b0: 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61  file *pJrnl, cha
73c0: 72 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20  r **pzMaster){. 
73d0: 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c   int rc;.  u32 l
73e0: 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20  en;.  i64 szJ;. 
73f0: 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e   u32 cksum;.  in
7400: 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t i;.  unsigned 
7410: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
7420: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
7430: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
7440: 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61  ader */..  *pzMa
7450: 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20  ster = 0;..  rc 
7460: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
7470: 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29  ize(pJrnl, &szJ)
7480: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
7490: 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20  TE_OK || szJ<16 
74a0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
74b0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
74c0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
74d0: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  len);.  if( rc!=
74e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
74f0: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  rn rc;..  rc = r
7500: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
7510: 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29   szJ-12, &cksum)
7520: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
7530: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
7540: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
7550: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
7560: 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38  aMagic, 8, szJ-8
7570: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7580: 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70  ITE_OK || memcmp
7590: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
75a0: 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65 74  lMagic, 8) ) ret
75b0: 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61  urn rc;..  *pzMa
75c0: 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29 73  ster = (char *)s
75d0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
75e0: 28 6c 65 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21  (len+1);.  if( !
75f0: 2a 70 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  *pzMaster ){.   
7600: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
7610: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  OMEM;.  }.  rc =
7620: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
7630: 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c  Jrnl, *pzMaster,
7640: 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e   len, szJ-16-len
7650: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7660: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
7670: 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 7a 4d 61  lite3_free(*pzMa
7680: 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61  ster);.    *pzMa
7690: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65  ster = 0;.    re
76a0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
76b0: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
76c0: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
76d0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
76e0: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
76f0: 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29  i=0; i<len; i++)
7700: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28  {.    cksum -= (
7710: 2a 70 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20  *pzMaster)[i];. 
7720: 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29   }.  if( cksum )
7730: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
7740: 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74  checksum doesn't
7750: 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e   add up, then on
7760: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
7770: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20   disk sectors.  
7780: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
7790: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
77a0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63  al filename is c
77b0: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d  orrupted. This m
77c0: 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  eans.    ** defi
77d0: 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b  nitely roll back
77e0: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
77f0: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
7800: 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20  eport a (nul).  
7810: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
7820: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  nal filename..  
7830: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
7840: 5f 66 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29  _free(*pzMaster)
7850: 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20  ;.    *pzMaster 
7860: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
7870: 20 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65    (*pzMaster)[le
7880: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20  n] = '\0';.  }. 
7890: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
78a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
78b0: 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Seek the journal
78c0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
78d0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
78e0: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65  tor boundary whe
78f0: 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  re a.** journal 
7900: 68 65 61 64 65 72 20 6d 61 79 20 62 65 20 72 65  header may be re
7910: 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50  ad or written. P
7920: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
7930: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 0a  is updated with.
7940: 2a 2a 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20  ** the new seek 
7950: 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e  offset..**.** i.
7960: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
7970: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
7980: 2a 20 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20  * Input Offset  
7990: 20 20 20 20 20 20 20 20 20 20 20 20 4f 75 74 70              Outp
79a0: 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d  ut Offset.** ---
79b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79d0: 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20  ----.** 0       
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79f0: 20 20 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20    0.** 512      
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a10: 20 35 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20   512.** 100     
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a30: 20 20 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20    512.** 2000   
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a50: 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73     2048.** .*/.s
7a60: 74 61 74 69 63 20 76 6f 69 64 20 73 65 65 6b 4a  tatic void seekJ
7a70: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
7a80: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
7a90: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
7aa0: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
7ab0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
7ac0: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
7ad0: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
7ae0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
7af0: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
7b00: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
7b10: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
7b20: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
7b30: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
7b40: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
7b50: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
7b60: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
7b70: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
7b80: 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  er) );.  pPager-
7b90: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66  >journalOff = of
7ba0: 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  fset;.}../*.** T
7bb0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7bc0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
7bd0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
7be0: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
7bf0: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
7c00: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
7c10: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
7c20: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
7c30: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
7c40: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
7c50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
7c60: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
7c70: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
7c80: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
7c90: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
7ca0: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
7cb0: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
7cc0: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
7cd0: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
7ce0: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
7cf0: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
7d00: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
7d10: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
7d20: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
7d30: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
7d40: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
7d50: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
7d60: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
7d70: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
7d80: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
7d90: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
7da0: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
7db0: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
7dc0: 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20  _SZ - 24) bytes 
7dd0: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
7de0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
7df0: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
7e00: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
7e10: 20 63 68 61 72 20 7a 48 65 61 64 65 72 5b 73 69   char zHeader[si
7e20: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7e30: 69 63 29 2b 31 36 5d 3b 0a 20 20 69 6e 74 20 72  ic)+16];.  int r
7e40: 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  c;..  if( pPager
7e50: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20  ->stmtHdrOff==0 
7e60: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
7e70: 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67  tmtHdrOff = pPag
7e80: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
7e90: 20 20 7d 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e    }..  seekJourn
7ea0: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
7eb0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7ec0: 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
7ed0: 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 6d 65 6d  urnalOff;..  mem
7ee0: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
7ef0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
7f00: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7f10: 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  ));..  /* .  ** 
7f20: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
7f30: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
7f40: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
7f50: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
7f60: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
7f70: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
7f80: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
7f90: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
7fa0: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
7fb0: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
7fc0: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
7fd0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
7fe0: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
7ff0: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
8000: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
8010: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
8020: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
8030: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
8040: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
8050: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
8060: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
8070: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
8080: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
8090: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
80a0: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
80b0: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
80c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
80d0: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
80e0: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
80f0: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
8100: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
8110: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
8120: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
8130: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
8140: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
8150: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
8160: 69 6c 75 72 65 20 6f 63 63 75 72 65 64 20 77 68  ilure occured wh
8170: 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20  ilst writing to 
8180: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
8190: 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e   file it may con
81a0: 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67  tain some garbag
81b0: 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72  e data. There ar
81c0: 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a  e two scenarios.
81d0: 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20    ** where this 
81e0: 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f  risk can be igno
81f0: 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  red:.  **.  **  
8200: 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65   * When the page
8210: 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  r is in no-sync 
8220: 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e  mode. Corruption
8230: 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20   can follow a.  
8240: 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69  **     power fai
8250: 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73  lure in this cas
8260: 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20  e anyway..  **. 
8270: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
8280: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
8290: 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69  FE_APPEND flag i
82a0: 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72  s set. This guar
82b0: 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20  antees.  **     
82c0: 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74  that garbage dat
82d0: 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e  a is never appen
82e0: 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ded to the journ
82f0: 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  al file..  */.  
8300: 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66  assert(pPager->f
8310: 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61  d->pMethods||pPa
8320: 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 3b 0a 20 20  ger->noSync);.  
8330: 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  if( (pPager->noS
8340: 79 6e 63 29 20 0a 20 20 20 7c 7c 20 28 73 71 6c  ync) .   || (sql
8350: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
8360: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
8370: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
8380: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
8390: 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 75 74 33  ) .  ){.    put3
83a0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
83b0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
83c0: 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66  gic)], 0xfffffff
83d0: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
83e0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
83f0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
8400: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 29 3b 0a  nalMagic)], 0);.
8410: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
8420: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
8430: 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a  initialiser */ .
8440: 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e    sqlite3Randomn
8450: 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65  ess(sizeof(pPage
8460: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26  r->cksumInit), &
8470: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
8480: 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  t);.  put32bits(
8490: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
84a0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
84b0: 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  ], pPager->cksum
84c0: 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Init);.  /* The 
84d0: 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  initial database
84e0: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
84f0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
8500: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
8510: 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+8], pPager->
8520: 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68  dbSize);.  /* Th
8530: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
8540: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
8550: 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33  rocess */.  put3
8560: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
8570: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
8580: 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72  gic)+12], pPager
8590: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20  ->sectorSize);. 
85a0: 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
85b0: 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
85c0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
85d0: 6f 75 72 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f  ournalHdr, sizeo
85e0: 66 28 7a 48 65 61 64 65 72 29 29 29 0a 20 20 72  f(zHeader))).  r
85f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
8600: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
8610: 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  zHeader, sizeof(
8620: 7a 48 65 61 64 65 72 29 2c 70 50 61 67 65 72 2d  zHeader),pPager-
8630: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
8640: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8650: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
8660: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20  R_SZ(pPager);.. 
8670: 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
8680: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
8690: 77 72 69 74 74 65 6e 20 73 75 63 63 65 73 73 66  written successf
86a0: 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a  ully. Seek the j
86b0: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
86c0: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
86d0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
86e0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
86f0: 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tor..  */.  if( 
8700: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8710: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
8720: 54 41 49 4c 20 25 70 20 25 6c 6c 64 5c 6e 22 2c  TAIL %p %lld\n",
8730: 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
8740: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 29 0a  >journalOff-1)).
8750: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8760: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
8770: 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 2c 20  jfd, "\000", 1, 
8780: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8790: 66 66 2d 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ff-1);.  }.  ret
87a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
87b0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
87c0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
87d0: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
87e0: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65  ed. A journal he
87f0: 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f  ader file.** (JO
8800: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
8810: 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d  es) is read from
8820: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
8830: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
8840: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65  rnal.** file. Se
8850: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
8860: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
8870: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20  ournalHdr() for 
8880: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
8890: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
88a0: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
88b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
88c0: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
88d0: 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69  ssfully, *nRec i
88e0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
88f0: 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72  ber of.** page r
8900: 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  ecords following
8910: 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64   this header and
8920: 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20   *dbSize is set 
8930: 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
8940: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62  he.** database b
8950: 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
8960: 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20  ction began, in 
8970: 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61  pages. Also, pPa
8980: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a  ger->cksumInit.*
8990: 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
89a0: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
89b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
89c0: 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  er. SQLITE_OK is
89d0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20   returned.** in 
89e0: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
89f0: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
8a00: 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65  header file appe
8a10: 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70  ars to be corrup
8a20: 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
8a30: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
8a40: 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64  and *nRec and *d
8a50: 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65  bSize are not se
8a60: 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48  t.  If JOURNAL_H
8a70: 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63  DR_SZ bytes.** c
8a80: 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72  annot be read fr
8a90: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
8aa0: 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ile an error cod
8ab0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
8ac0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
8ad0: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50  dJournalHdr(.  P
8ae0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20  ager *pPager, . 
8af0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
8b00: 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20  ,.  u32 *pNRec, 
8b10: 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a  .  u32 *pDbSize.
8b20: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
8b30: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
8b40: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
8b50: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
8b60: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
8b70: 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 0a    i64 jrnlOff;..
8b80: 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72    seekJournalHdr
8b90: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
8ba0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8bb0: 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ff+JOURNAL_HDR_S
8bc0: 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72  Z(pPager) > jour
8bd0: 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  nalSize ){.    r
8be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
8bf0: 45 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66  E;.  }.  jrnlOff
8c00: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
8c10: 61 6c 4f 66 66 3b 0a 0a 20 20 72 63 20 3d 20 73  alOff;..  rc = s
8c20: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
8c30: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
8c40: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
8c50: 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66  , jrnlOff);.  if
8c60: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
8c70: 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73  ;.  jrnlOff += s
8c80: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 3b 0a 0a  izeof(aMagic);..
8c90: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61    if( memcmp(aMa
8ca0: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
8cb0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
8cc0: 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  c))!=0 ){.    re
8cd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
8ce0: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65  ;.  }..  rc = re
8cf0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
8d00: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70  >jfd, jrnlOff, p
8d10: 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20  NRec);.  if( rc 
8d20: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
8d30: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
8d40: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
8d50: 6c 4f 66 66 2b 34 2c 20 26 70 50 61 67 65 72 2d  lOff+4, &pPager-
8d60: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69  >cksumInit);.  i
8d70: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
8d80: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
8d90: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
8da0: 64 2c 20 6a 72 6e 6c 4f 66 66 2b 38 2c 20 70 44  d, jrnlOff+8, pD
8db0: 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  bSize);.  if( rc
8dc0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
8dd0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
8de0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
8df0: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
8e00: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
8e10: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
8e20: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
8e30: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
8e40: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
8e50: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
8e60: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
8e70: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
8e80: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
8e90: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
8ea0: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
8eb0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
8ec0: 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
8ed0: 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  ue.  ** of Pager
8ee0: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
8ef0: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
8f00: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
8f10: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ne..  */.  rc = 
8f20: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
8f30: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b  r->jfd, jrnlOff+
8f40: 31 32 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67  12, (u32 *)&pPag
8f50: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
8f60: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
8f70: 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72  rn rc;..  pPager
8f80: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
8f90: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8fa0: 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
8fb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
8fc0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
8fd0: 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
8fe0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
8ff0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
9000: 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
9010: 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
9020: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
9030: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
9040: 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
9050: 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
9060: 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
9070: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
9080: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
9090: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
90a0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
90b0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
90c0: 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
90d0: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
90e0: 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
90f0: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
9100: 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
9110: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62   is:.**.** + 4 b
9120: 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50  ytes: PAGER_MJ_P
9130: 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65  GNO..** + N byte
9140: 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  s: length of mas
9150: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
9160: 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  ..** + 4 bytes: 
9170: 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  N.** + 4 bytes: 
9180: 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
9190: 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
91a0: 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
91b0: 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
91c0: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
91d0: 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
91e0: 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
91f0: 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
9200: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
9210: 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  rnal name..**.**
9220: 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61   If zMaster is a
9230: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f   NULL pointer (o
9240: 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67  ccurs for a sing
9250: 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
9260: 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68  saction), .** th
9270: 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
9280: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
9290: 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
92a0: 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
92b0: 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
92c0: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
92d0: 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a  rc;.  int len; .
92e0: 20 20 69 6e 74 20 69 3b 20 0a 20 20 69 36 34 20    int i; .  i64 
92f0: 6a 72 6e 6c 4f 66 66 3b 0a 20 20 75 33 32 20 63  jrnlOff;.  u32 c
9300: 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72  ksum = 0;.  char
9310: 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f   zBuf[sizeof(aJo
9320: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d  urnalMagic)+2*4]
9330: 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  ;..  if( !zMaste
9340: 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74  r || pPager->set
9350: 4d 61 73 74 65 72 29 20 72 65 74 75 72 6e 20 53  Master) return S
9360: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67  QLITE_OK;.  pPag
9370: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
9380: 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  1;..  len = strl
9390: 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66  en(zMaster);.  f
93a0: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69  or(i=0; i<len; i
93b0: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
93c0: 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20  = zMaster[i];.  
93d0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
93e0: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
93f0: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
9400: 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
9410: 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
9420: 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
9430: 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
9440: 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
9450: 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
9460: 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
9470: 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
9480: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
9490: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
94a0: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
94b0: 0a 20 20 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  .    seekJournal
94c0: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  Hdr(pPager);.  }
94d0: 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61  .  jrnlOff = pPa
94e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
94f0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
9500: 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30  alOff += (len+20
9510: 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  );..  rc = write
9520: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
9530: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 50 41 47  fd, jrnlOff, PAG
9540: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
9550: 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  r));.  if( rc!=S
9560: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
9570: 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20  n rc;.  jrnlOff 
9580: 2b 3d 20 34 3b 0a 0a 20 20 72 63 20 3d 20 73 71  += 4;..  rc = sq
9590: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
95a0: 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
95b0: 72 2c 20 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29  r, len, jrnlOff)
95c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
95d0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
95e0: 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20  c;.  jrnlOff += 
95f0: 6c 65 6e 3b 0a 0a 20 20 70 75 74 33 32 62 69 74  len;..  put32bit
9600: 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20  s(zBuf, len);.  
9610: 70 75 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b  put32bits(&zBuf[
9620: 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65  4], cksum);.  me
9630: 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61  mcpy(&zBuf[8], a
9640: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
9650: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
9660: 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ic));.  rc = sql
9670: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
9680: 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38  er->jfd, zBuf, 8
9690: 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  +sizeof(aJournal
96a0: 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29  Magic), jrnlOff)
96b0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
96c0: 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
96d0: 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74 75 72 6e  noSync;.  return
96e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
96f0: 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61  d or remove a pa
9700: 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  ge from the list
9710: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68   of all pages th
9720: 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a  at are in the.**
9730: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
9740: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61  al..**.** The Pa
9750: 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70 61  ger keeps a sepa
9760: 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67  rate list of pag
9770: 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72  es that are curr
9780: 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20  ently in.** the 
9790: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
97a0: 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74  l.  This helps t
97b0: 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  he sqlite3PagerS
97c0: 74 6d 74 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72  tmtCommit().** r
97d0: 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20  outine run MUCH 
97e0: 66 61 73 74 65 72 20 66 6f 72 20 74 68 65 20 63  faster for the c
97f0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
9800: 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a   there are many.
9810: 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f  ** pages in memo
9820: 72 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65  ry but only a fe
9830: 77 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61  w are in the sta
9840: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
9850: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
9860: 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
9870: 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29  list(PgHdr *pPg)
9880: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
9890: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
98a0: 0a 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48  .  PgHistory *pH
98b0: 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
98c0: 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
98d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44  ;.  assert( MEMD
98e0: 42 20 29 3b 0a 20 20 69 66 28 20 21 70 48 69 73  B );.  if( !pHis
98f0: 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20  t->inStmt ){.   
9900: 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
9910: 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20  pPrevStmt==0 && 
9920: 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74  pHist->pNextStmt
9930: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
9940: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a  Pager->pStmt ){.
9950: 20 20 20 20 20 20 50 47 48 44 52 5f 54 4f 5f 48        PGHDR_TO_H
9960: 49 53 54 28 70 50 61 67 65 72 2d 3e 70 53 74 6d  IST(pPager->pStm
9970: 74 2c 20 70 50 61 67 65 72 29 2d 3e 70 50 72 65  t, pPager)->pPre
9980: 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20  vStmt = pPg;.   
9990: 20 7d 0a 20 20 20 20 70 48 69 73 74 2d 3e 70 4e   }.    pHist->pN
99a0: 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67 65 72  extStmt = pPager
99b0: 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 70 50 61  ->pStmt;.    pPa
99c0: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
99d0: 3b 0a 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53  ;.    pHist->inS
99e0: 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  tmt = 1;.  }.}..
99f0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67  /*.** Find a pag
9a00: 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  e in the hash ta
9a10: 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61  ble given its pa
9a20: 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  ge number.  Retu
9a30: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
9a40: 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e  to the page or N
9a50: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
9a60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
9a70: 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  r *pager_lookup(
9a80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
9a90: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
9aa0: 64 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61  dr *p;.  if( pPa
9ab0: 67 65 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20  ger->aHash==0 ) 
9ac0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20  return 0;.  p = 
9ad0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 67  pPager->aHash[pg
9ae0: 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
9af0: 61 73 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65  ash-1)];.  while
9b00: 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d  ( p && p->pgno!=
9b10: 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20  pgno ){.    p = 
9b20: 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  p->pNextHash;.  
9b30: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
9b40: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
9b50: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
9b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9b70: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
9b80: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
9b90: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
9ba0: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
9bb0: 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
9bc0: 20 20 20 20 20 6f 73 55 6e 6c 6f 63 6b 28 70 50       osUnlock(pP
9bd0: 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
9be0: 4b 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  K);.      pPager
9bf0: 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
9c00: 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55       IOTRACE(("U
9c10: 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  NLOCK %p\n", pPa
9c20: 67 65 72 29 29 0a 20 20 20 20 7d 0a 20 20 20 20  ger)).    }.    
9c30: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
9c40: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
9c50: 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
9c60: 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
9c70: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63   }.}../*.** Exec
9c80: 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
9c90: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
9ca0: 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
9cb0: 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
9cc0: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
9cd0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
9ce0: 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
9cf0: 65 61 64 79 20 65 6e 74 65 72 65 64 0a 2a 2a 20  eady entered.** 
9d00: 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 2e  the error-state.
9d10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9d20: 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
9d30: 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 29  llback(Pager *p)
9d40: 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72 43 6f  {.  if( p->errCo
9d50: 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  de ) return;.  a
9d60: 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65 3e  ssert( p->state>
9d70: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
9d80: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  || p->journalOpe
9d90: 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  n==0 );.  if( p-
9da0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
9db0: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71  SERVED ){.    sq
9dc0: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
9dd0: 63 6b 28 70 29 3b 0a 20 20 7d 0a 20 20 70 61 67  ck(p);.  }.  pag
9de0: 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 20 20  er_unlock(p);.  
9df0: 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f  assert( p->errCo
9e00: 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e 61  de || !p->journa
9e10: 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65 78 63  lOpen || (p->exc
9e20: 6c 75 73 69 76 65 4d 6f 64 65 26 26 21 70 2d 3e  lusiveMode&&!p->
9e30: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b 0a 20  journalOff) );. 
9e40: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43   assert( p->errC
9e50: 6f 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d 74 4f  ode || !p->stmtO
9e60: 70 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c 75 73  pen || p->exclus
9e70: 69 76 65 4d 6f 64 65 20 29 3b 0a 7d 0a 0a 0a 2f  iveMode );.}.../
9e80: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 69  *.** Clear the i
9e90: 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
9ea0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
9eb0: 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
9ec0: 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63  of the pager bac
9ed0: 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73  k to what it was
9ee0: 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72   when it was fir
9ef0: 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41  st.** opened.  A
9f00: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ny outstanding p
9f10: 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
9f20: 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75  ated and subsequ
9f30: 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20  ent attempts.** 
9f40: 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20  to access those 
9f50: 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  pages will likel
9f60: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  y result in a co
9f70: 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69  redump..*/.stati
9f80: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
9f90: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
9fa0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c  ){.  PgHdr *pPg,
9fb0: 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70   *pNext;.  if( p
9fc0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
9fd0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70   return;.  for(p
9fe0: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
9ff0: 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
a000: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
a010: 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c  PGFREE %p %d\n",
a020: 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
a030: 6e 6f 29 29 3b 0a 20 20 20 20 50 41 47 45 52 5f  no));.    PAGER_
a040: 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
a050: 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29  er_pgfree_count)
a060: 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50  ;.    pNext = pP
a070: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
a080: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
a090: 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  g);.  }.  pPager
a0a0: 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  ->pStmt = 0;.  p
a0b0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
a0c0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
a0d0: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20  rstSynced = 0;. 
a0e0: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
a0f0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41   0;.  pPager->pA
a100: 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ll = 0;.  pPager
a110: 2d 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20 73  ->nHash = 0;.  s
a120: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
a130: 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50  er->aHash);.  pP
a140: 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
a150: 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  .  pPager->aHash
a160: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
a170: 6e 52 65 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nRef = 0;.}../*.
a180: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a190: 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69  ends a transacti
a1a0: 6f 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69  on.  A transacti
a1b0: 6f 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20 65  on is ended by e
a1c0: 69 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49  ither.** a COMMI
a1d0: 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e  T or a ROLLBACK.
a1e0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
a1f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
a200: 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61  ed, the pager ha
a210: 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
a220: 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61  le open and.** a
a230: 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
a240: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
a250: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
a260: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
a270: 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20 64  release.** the d
a280: 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64  atabase lock and
a290: 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52   acquires a SHAR
a2a0: 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70  ED lock in its p
a2b0: 6c 61 63 65 20 69 66 20 74 68 61 74 20 69 73 0a  lace if that is.
a2c0: 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ** the appropria
a2d0: 74 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20  te thing to do. 
a2e0: 20 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75   Release locks u
a2f0: 73 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f 70  sually is approp
a300: 72 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73  riate,.** unless
a310: 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75   we are in exclu
a320: 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65  sive access mode
a330: 20 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73 20   or unless this 
a340: 69 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20  is a .** COMMIT 
a350: 41 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c  AND BEGIN or ROL
a360: 4c 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e 20  LBACK AND BEGIN 
a370: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
a380: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
a390: 65 20 69 73 20 65 69 74 68 65 72 20 64 65 6c 65  e is either dele
a3a0: 74 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65 64  ted or truncated
a3b0: 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f  ..**.** TODO: Co
a3c0: 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74  nsider keeping t
a3d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
a3e0: 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61  open for tempora
a3f0: 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a  ry databases..**
a400: 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65   This might give
a410: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69   a performance i
a420: 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69  mprovement on wi
a430: 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e  ndows where open
a440: 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73  ing.** a file is
a450: 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70   an expensive op
a460: 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  eration..*/.stat
a470: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64  ic int pager_end
a480: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  _transaction(Pag
a490: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
a4a0: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
a4b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
a4c0: 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
a4d0: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
a4e0: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  ( !MEMDB );.  if
a4f0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
a500: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
a510: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
a520: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71  ITE_OK;.  }.  sq
a530: 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
a540: 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
a550: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
a560: 4f 70 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d  Open && !pPager-
a570: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
a580: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
a590: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66  lose(pPager->stf
a5a0: 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  d);.    pPager->
a5b0: 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  stmtOpen = 0;.  
a5c0: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
a5d0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
a5e0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
a5f0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
a600: 20 20 20 20 20 20 20 20 26 26 20 28 72 63 20 3d          && (rc =
a610: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
a620: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
a630: 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  0))==SQLITE_OK )
a640: 7b 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  {;.      pPager-
a650: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
a660: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
a670: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
a680: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
a690: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
a6a0: 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
a6b0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
a6c0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
a6d0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
a6e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a6f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
a700: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
a710: 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
a720: 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
a730: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
a740: 6c 69 74 65 33 5f 66 72 65 65 28 20 70 50 61 67  lite3_free( pPag
a750: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->aInJournal )
a760: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
a770: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
a780: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
a790: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
a7a0: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
a7b0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
a7c0: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
a7d0: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
a7e0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
a7f0: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sync = 0;.      
a800: 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
a810: 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  ack = 0;.#ifdef 
a820: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
a830: 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  ES.      pPg->pa
a840: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
a850: 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
a860: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
a870: 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
a880: 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  0;.    pPager->d
a890: 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20  irtyCache = 0;. 
a8a0: 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
a8b0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
a8c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a8d0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
a8e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
a8f0: 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
a900: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
a910: 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  useJournal==0 );
a920: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
a930: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
a940: 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20  de ){.    rc2 = 
a950: 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  osUnlock(pPager-
a960: 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
a970: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
a980: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
a990: 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  RED;.  }else if(
a9a0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
a9b0: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a  PAGER_SYNCED ){.
a9c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
a9d0: 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
a9e0: 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  IVE;.  }.  pPage
a9f0: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
aa00: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
aa10: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
aa20: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
aa30: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46   0;.  pPager->pF
aa40: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61  irstSynced = pPa
aa50: 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ger->pFirst;.  p
aa60: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
aa70: 2d 31 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72  -1;..  return (r
aa80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32  c==SQLITE_OK?rc2
aa90: 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  :rc);.}../*.** C
aaa0: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
aab0: 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72  n a checksum for
aac0: 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61 74   the page of dat
aad0: 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  a..**.** This is
aae0: 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
aaf0: 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61  ksum.  It is rea
ab00: 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d  lly just the sum
ab10: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64   of the .** rand
ab20: 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  om initial value
ab30: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75   and the page nu
ab40: 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72 69  mber.  We experi
ab50: 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61  mented with.** a
ab60: 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65   checksum of the
ab70: 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75   entire data, bu
ab80: 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64  t that was found
ab90: 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e   to be too slow.
aba0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
abb0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
abc0: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68   is stored at th
abd0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64  e beginning of d
abe0: 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63  ata and.** the c
abf0: 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65  hecksum is store
ac00: 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54  d at the end.  T
ac10: 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
ac20: 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  .  If journal.**
ac30: 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75   corruption occu
ac40: 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65  rs due to a powe
ac50: 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d  r failure, the m
ac60: 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61  ost likely scena
ac70: 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f  rio.** is that o
ac80: 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74  ne end or the ot
ac90: 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72  her of the recor
aca0: 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  d will be change
acb0: 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63  d.  It is.** muc
acc0: 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68  h less likely th
acd0: 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20  at the two ends 
ace0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  of the journal r
acf0: 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a  ecord will be.**
ad00: 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65   correct and the
ad10: 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75   middle be corru
ad20: 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20  pt.  Thus, this 
ad30: 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d  "checksum" schem
ad40: 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73  e,.** though fas
ad50: 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61  t and simple, ca
ad60: 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79  tches the mostly
ad70: 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20   likely kind of 
ad80: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a  corruption..**.*
ad90: 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69  * FIX ME:  Consi
ada0: 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72 79  der adding every
adb0: 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62   200th (or so) b
adc0: 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61 20  yte of the data 
add0: 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73  to the.** checks
ade0: 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69 66  um.  That way if
adf0: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73   a single page s
ae00: 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64  pans 3 or more d
ae10: 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a  isk sectors and.
ae20: 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64  ** only the midd
ae30: 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72  le sector is cor
ae40: 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74  rupt, we will st
ae50: 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f  ill have a reaso
ae60: 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20  nable.** chance 
ae70: 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63  of failing the c
ae80: 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73  hecksum and thus
ae90: 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20 70   detecting the p
aea0: 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69  roblem..*/.stati
aeb0: 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
aec0: 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
aed0: 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
aee0: 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
aef0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
af00: 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50  it;.  int i = pP
af10: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
af20: 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30  00;.  while( i>0
af30: 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d   ){.    cksum +=
af40: 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69   aData[i];.    i
af50: 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72   -= 200;.  }.  r
af60: 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
af70: 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
af80: 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63  ration */.static
af90: 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28   void makeClean(
afa0: 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  PgHdr*);../*.** 
afb0: 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
afc0: 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ge from the jour
afd0: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  nal file opened 
afe0: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
aff0: 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79  or.** jfd.  Play
b000: 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61  back this one pa
b010: 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65  ge..**.** If use
b020: 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e  Cksum==0 it mean
b030: 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64  s this journal d
b040: 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63  oes not use chec
b050: 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d  ksums.  Checksum
b060: 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65  s.** are not use
b070: 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a  d in statement j
b080: 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20  ournals because 
b090: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
b0a0: 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65  ls do not.** nee
b0b0: 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77  d to survive pow
b0c0: 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a  er failures..*/.
b0d0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b0e0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
b0f0: 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
b100: 67 65 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  ger, .  sqlite3_
b110: 66 69 6c 65 20 2a 6a 66 64 2c 0a 20 20 69 36 34  file *jfd,.  i64
b120: 20 6f 66 66 73 65 74 2c 0a 20 20 69 6e 74 20 75   offset,.  int u
b130: 73 65 43 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e 74  seCksum.){.  int
b140: 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
b150: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
b160: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
b170: 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
b180: 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
b190: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
b1a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
b1b0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
b1c0: 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
b1d0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1f0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
b200: 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
b210: 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38  checking */.  u8
b220: 20 2a 61 44 61 74 61 20 3d 20 28 75 38 20 2a 29   *aData = (u8 *)
b230: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
b240: 65 3b 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f  e;   /* Temp sto
b250: 72 61 67 65 20 66 6f 72 20 61 20 70 61 67 65 20  rage for a page 
b260: 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75  */..  /* useCksu
b270: 6d 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65  m should be true
b280: 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f   for the main jo
b290: 75 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20  urnal and false 
b2a0: 66 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  for.  ** stateme
b2b0: 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65  nt journals.  Ve
b2c0: 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20 69  rify that this i
b2d0: 73 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73  s always the cas
b2e0: 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
b2f0: 20 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75   jfd == (useCksu
b300: 6d 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  m ? pPager->jfd 
b310: 3a 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20  : pPager->stfd) 
b320: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61  );.  assert( aDa
b330: 74 61 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65  ta );..  rc = re
b340: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66  ad32bits(jfd, of
b350: 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  fset, &pgno);.  
b360: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b370: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
b380: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
b390: 65 61 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20  ead(jfd, aData, 
b3a0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
b3b0: 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 69  , offset+4);.  i
b3c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b3d0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
b3e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b3f0: 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  ff += pPager->pa
b400: 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f  geSize + 4;..  /
b410: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
b420: 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
b430: 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
b440: 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
b450: 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
b460: 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
b470: 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
b480: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
b490: 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
b4a0: 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
b4b0: 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
b4c0: 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
b4d0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
b4e0: 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
b4f0: 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
b500: 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
b510: 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
b520: 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
b530: 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
b540: 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
b550: 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
b560: 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
b570: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
b580: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONE;.  }.  if( p
b590: 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50  gno>(unsigned)pP
b5a0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
b5b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b5c0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
b5d0: 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20  useCksum ){.    
b5e0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
b5f0: 6a 66 64 2c 20 6f 66 66 73 65 74 2b 70 50 61 67  jfd, offset+pPag
b600: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20  er->pageSize+4, 
b610: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
b620: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
b630: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
b640: 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20  rnalOff += 4;.  
b650: 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75    if( pager_cksu
b660: 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29  m(pPager, aData)
b670: 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
b680: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
b690: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
b6a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
b6b0: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
b6c0: 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65  ESERVED || pPage
b6d0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
b6e0: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20  EXCLUSIVE );..  
b6f0: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
b700: 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73  is in RESERVED s
b710: 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
b720: 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
b730: 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
b740: 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
b750: 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
b760: 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
b770: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
b780: 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
b790: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
b7a0: 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
b7b0: 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
b7c0: 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
b7d0: 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74  * An exception t
b7e0: 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65  o the above rule
b7f0: 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  : If the databas
b800: 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  e is in no-sync 
b810: 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20  mode.  ** and a 
b820: 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75  page is moved du
b830: 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ring an incremen
b840: 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20  tal vacuum then 
b850: 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a  the page may.  *
b860: 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  * not be in the 
b870: 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74  pager cache. Lat
b880: 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  er: if a malloc(
b890: 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63  ) or IO error oc
b8a0: 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
b8b0: 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61   a Movepage() ca
b8c0: 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ll, then the pag
b8d0: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20  e may not be in 
b8e0: 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65  the cache.  ** e
b8f0: 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f  ither. So the co
b900: 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
b910: 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70  d in the above p
b920: 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a  aragraph is not.
b930: 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c    ** assert()abl
b940: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
b950: 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74 61  in EXCLUSIVE sta
b960: 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61  te, then we upda
b970: 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
b980: 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73 0a  he if it exists.
b990: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69    ** and the mai
b9a0: 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  n file. The page
b9b0: 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20   is then marked 
b9c0: 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a  not dirty..  **.
b9d0: 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37    ** Ticket #117
b9e0: 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  1:  The statemen
b9f0: 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  t journal might 
ba00: 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e  contain page con
ba10: 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a  tent that is.  *
ba20: 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
ba30: 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
ba40: 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
ba50: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
ba60: 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63  n..  ** This occ
ba70: 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20  urs when a page 
ba80: 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72  is changed prior
ba90: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
baa0: 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a   a statement.  *
bab0: 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61  * then changed a
bac0: 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20  gain within the 
bad0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e  statement.  When
bae0: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75   rolling back su
baf0: 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch a.  ** statem
bb00: 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20  ent we must not 
bb10: 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69  write to the ori
bb20: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75  ginal database u
bb30: 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20  nless we know.  
bb40: 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74  ** for certain t
bb50: 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  hat original pag
bb60: 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73  e contents are s
bb70: 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d  ynced into the m
bb80: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
bb90: 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
bba0: 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c  rwise, a power l
bbb0: 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20  oss might leave 
bbc0: 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e  modified data in
bbd0: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
bbe0: 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  se file without 
bbf0: 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
bc00: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
bc10: 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72   that can.  ** r
bc20: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
bc30: 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
bc40: 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63  nal form.  Two c
bc50: 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
bc60: 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72  e.  ** met befor
bc70: 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
bc80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
bc90: 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
bca0: 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c  e must be.  ** l
bcb0: 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
bcc0: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
bcd0: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
bce0: 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63  nt is fully sync
bcf0: 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d  ed.  ** in the m
bd00: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
bd10: 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
bd20: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
bd30: 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  che or else.  **
bd40: 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72   the page is mar
bd50: 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
bd60: 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  =0..  */.  pPg =
bd70: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
bd80: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 50  ager, pgno);.  P
bd90: 41 47 45 52 54 52 41 43 45 34 28 22 50 4c 41 59  AGERTRACE4("PLAY
bda0: 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20  BACK %d page %d 
bdb0: 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
bdd0: 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
bde0: 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68  gno, pager_datah
bdf0: 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ash(pPager->page
be00: 53 69 7a 65 2c 20 61 44 61 74 61 29 29 3b 0a 20  Size, aData));. 
be10: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
be20: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
be30: 49 56 45 20 26 26 20 28 70 50 67 3d 3d 30 20 7c  IVE && (pPg==0 |
be40: 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  | pPg->needSync=
be50: 3d 30 29 20 29 7b 0a 20 20 20 20 69 36 34 20 6f  =0) ){.    i64 o
be60: 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
be70: 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
be80: 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  geSize;.    rc =
be90: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
bea0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74  pPager->fd, aDat
beb0: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
bec0: 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ize, offset);.  
bed0: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
bee0: 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
bef0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
bf00: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
bf10: 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
bf20: 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
bf30: 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
bf40: 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
bf50: 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
bf60: 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
bf70: 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
bf80: 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
bf90: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
bfa0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
bfb0: 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
bfc0: 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
bfd0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
bfe0: 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
bff0: 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
c000: 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
c010: 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
c020: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
c030: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
c040: 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
c050: 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
c060: 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67    /* assert( pPg
c070: 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67  ->nRef==0 || pPg
c080: 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a  ->pgno==1 ); */.
c090: 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44      pData = PGHD
c0a0: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
c0b0: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
c0c0: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
c0d0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
c0e0: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
c0f0: 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 70  niter ){.      p
c100: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
c110: 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  (pPg, pPager->pa
c120: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  geSize);.    }.#
c130: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
c140: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
c150: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
c160: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
c170: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20  ;.#endif.    /* 
c180: 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
c190: 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
c1a0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
c1b0: 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
c1c0: 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
c1d0: 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
c1e0: 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
c1f0: 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
c200: 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
c210: 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
c220: 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
c230: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
c240: 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
c250: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
c260: 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
c270: 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
c280: 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
c290: 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
c2a0: 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72  gno, 3);.  }.  r
c2b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
c2c0: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61  ** Parameter zMa
c2d0: 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  ster is the name
c2e0: 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
c2f0: 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e  rnal file. A sin
c300: 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  gle journal.** f
c310: 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65  ile that referre
c320: 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  d to the master 
c330: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
c340: 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65   just been rolle
c350: 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  d back..** This 
c360: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
c370: 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
c380: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
c390: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
c3a0: 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  le,.** and does 
c3b0: 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  so if it is..**.
c3c0: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
c3d0: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
c3e0: 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ins the names of
c3f0: 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e   all child journ
c400: 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20  als..** To tell 
c410: 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  if a master jour
c420: 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74  nal can be delet
c430: 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63  ed, check to eac
c440: 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c  h of the.** chil
c450: 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68  dren.  If all ch
c460: 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68 65  ildren are eithe
c470: 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20  r missing or do 
c480: 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20  not refer to.** 
c490: 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74  a different mast
c4a0: 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  er journal, then
c4b0: 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75   this master jou
c4c0: 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65  rnal can be dele
c4d0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
c4e0: 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
c4f0: 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
c500: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
c510: 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  aster){.  sqlite
c520: 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
c530: 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
c540: 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74  t rc;.  int mast
c550: 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 73  er_open = 0;.  s
c560: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
c570: 73 74 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ster;.  sqlite3_
c580: 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 0a  file *pJournal;.
c590: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a    char *zMasterJ
c5a0: 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43  ournal = 0; /* C
c5b0: 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65  ontents of maste
c5c0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
c5d0: 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a  /.  i64 nMasterJ
c5e0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a  ournal;       /*
c5f0: 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20   Size of master 
c600: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
c610: 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d  .  /* Open the m
c620: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
c630: 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69  le exclusively i
c640: 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65  n case some othe
c650: 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69  r process.  ** i
c660: 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72  s running this r
c670: 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74  outine also. Not
c680: 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74   that it makes t
c690: 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e  oo much differen
c6a0: 63 65 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74  ce..  */.  pMast
c6b0: 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  er = (sqlite3_fi
c6c0: 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  le *)sqlite3_mal
c6d0: 6c 6f 63 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  loc(pVfs->szOsFi
c6e0: 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72  le * 2);.  pJour
c6f0: 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  nal = (sqlite3_f
c700: 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d  ile *)(((u8 *)pM
c710: 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73  aster) + pVfs->s
c720: 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  zOsFile);.  if( 
c730: 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !pMaster ){.    
c740: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
c750: 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
c760: 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
c770: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
c780: 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
c790: 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  STER_JOURNAL);. 
c7a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
c7b0: 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73  sOpen(pVfs, zMas
c7c0: 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c  ter, pMaster, fl
c7d0: 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ags, 0);.  }.  i
c7e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c7f0: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
c800: 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f  r_out;.  master_
c810: 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20 20 72 63 20  open = 1;..  rc 
c820: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
c830: 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d  ize(pMaster, &nM
c840: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
c850: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
c860: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
c870: 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20  ter_out;..  if( 
c880: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30  nMasterJournal>0
c890: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a   ){.    char *zJ
c8a0: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72  ournal;.    char
c8b0: 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30   *zMasterPtr = 0
c8c0: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  ;..    /* Load t
c8d0: 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
c8e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
c8f0: 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
c900: 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71  d from.    ** sq
c910: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61  lite3_malloc() a
c920: 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  nd pointed to by
c930: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e   zMasterJournal.
c940: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61   .    */.    zMa
c950: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63  sterJournal = (c
c960: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
c970: 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72  lloc(nMasterJour
c980: 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  nal);.    if( !z
c990: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
c9a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
c9b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
c9c0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
c9d0: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
c9e0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
c9f0: 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65  (pMaster, zMaste
ca00: 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65  rJournal, nMaste
ca10: 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
ca20: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ca30: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
ca40: 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a  ster_out;..    z
ca50: 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65  Journal = zMaste
ca60: 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68  rJournal;.    wh
ca70: 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
ca80: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
ca90: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
caa0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
cab0: 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
cac0: 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54   zJournal, SQLIT
cad0: 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 29  E_ACCESS_EXISTS)
cae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
caf0: 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
cb00: 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
cb10: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
cb20: 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
cb30: 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
cb40: 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
cb50: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
cb60: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
cb70: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
cb80: 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
cb90: 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
cba0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
cbb0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
cbc0: 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
cbd0: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
cbe0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
cbf0: 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
cc00: 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
cc10: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
cc20: 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
cc30: 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
cc40: 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
cc50: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
cc60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cc70: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
cc80: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
cc90: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
cca0: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
ccb0: 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 26 7a  nal(pJournal, &z
ccc0: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
ccd0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
cce0: 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(pJournal);.  
ccf0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
cd00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
cd10: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
cd20: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
cd30: 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20   }..        c = 
cd40: 7a 4d 61 73 74 65 72 50 74 72 21 3d 30 20 26 26  zMasterPtr!=0 &&
cd50: 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
cd60: 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
cd70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cd80: 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 50 74 72  _free(zMasterPtr
cd90: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
cda0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
cdb0: 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   We have a match
cdc0: 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  . Do not delete 
cdd0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
cde0: 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
cdf0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
ce00: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
ce10: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ce20: 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
ce30: 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b  trlen(zJournal)+
ce40: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
ce50: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
ce60: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
ce70: 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d  aster, 0);..delm
ce80: 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28  aster_out:.  if(
ce90: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
cea0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
ceb0: 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
cec0: 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28  al);.  }  .  if(
ced0: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a   master_open ){.
cee0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
cef0: 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d  se(pMaster);.  }
cf00: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
cf10: 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
cf20: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69  rn rc;.}...stati
cf30: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75  c void pager_tru
cf40: 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61 67 65  ncate_cache(Page
cf50: 72 20 2a 70 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a  r *pPager);../*.
cf60: 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
cf70: 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65  main file of the
cf80: 20 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20   given pager to 
cf90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
cfa0: 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64  ges.** indicated
cfb0: 2e 20 41 6c 73 6f 20 74 72 75 6e 63 61 74 65 20  . Also truncate 
cfc0: 74 68 65 20 63 61 63 68 65 64 20 72 65 70 72 65  the cached repre
cfd0: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
cfe0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
cff0: 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63   int pager_trunc
d000: 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
d010: 72 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20  r, int nPage){. 
d020: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
d030: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
d040: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
d050: 45 58 43 4c 55 53 49 56 45 20 26 26 20 70 50 61  EXCLUSIVE && pPa
d060: 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
d070: 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  s ){.    rc = sq
d080: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
d090: 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
d0a0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
d0b0: 34 29 6e 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  4)nPage);.  }.  
d0c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d0d0: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
d0e0: 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
d0f0: 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  .    pager_trunc
d100: 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72  ate_cache(pPager
d110: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
d120: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
d130: 20 74 68 65 20 73 65 63 74 6f 72 53 69 7a 65 20   the sectorSize 
d140: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
d150: 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ger..**.** The s
d160: 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 74 68  ector size is th
d170: 65 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20  e larger of the 
d180: 73 65 63 74 6f 72 20 73 69 7a 65 20 72 65 70 6f  sector size repo
d190: 72 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74  rted.** by sqlit
d1a0: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
d1b0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 53 69 7a   and the pageSiz
d1c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
d1d0: 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
d1e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
d1f0: 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
d200: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
d210: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
d220: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
d230: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
d240: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
d250: 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66  doesn't matter f
d260: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
d270: 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69  es. Also, the fi
d280: 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  le.    ** may no
d290: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
d2a0: 65 64 20 79 65 74 2c 20 69 6e 20 77 68 63 69 68  ed yet, in whcih
d2b0: 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74   case the OsSect
d2c0: 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
d2d0: 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75  call will segfau
d2e0: 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  lt..    */.    p
d2f0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
d300: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  e = sqlite3OsSec
d310: 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
d320: 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  fd);.  }.  if( p
d330: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
d340: 65 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e<pPager->pageSi
d350: 7a 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ze ){.    pPager
d360: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 70  ->sectorSize = p
d370: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
d380: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c  .  }.}../*.** Pl
d390: 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  ayback the journ
d3a0: 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74  al and thus rest
d3b0: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
d3c0: 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20   file to.** the 
d3d0: 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
d3e0: 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65  before we starte
d3f0: 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  d making changes
d400: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .  .**.** The jo
d410: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
d420: 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
d430: 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20   .**.**  (1)  8 
d440: 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20  byte prefix.  A 
d450: 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c  copy of aJournal
d460: 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29  Magic[]..**  (2)
d470: 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
d480: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
d490: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
d4a0: 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  of valid page re
d4b0: 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69  cords.**       i
d4c0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
d4d0: 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
d4e0: 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
d4f0: 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
d500: 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
d510: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72   page records fr
d520: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  om the journal s
d530: 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20  ize..**  (3)  4 
d540: 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
d550: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
d560: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
d570: 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20  ue for the .**  
d580: 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63       sanity chec
d590: 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34  ksum..**  (4)  4
d5a0: 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
d5b0: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
d5c0: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
d5d0: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
d5e0: 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
d5f0: 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
d600: 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79  k..**  (5)  4 by
d610: 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
d620: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
d630: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  f bytes in the m
d640: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
d650: 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68         name.  Th
d660: 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  e value may be z
d670: 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68  ero (indicate th
d680: 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  at there is no m
d690: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
d6a0: 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29  ournal.).**  (6)
d6b0: 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65    N bytes of the
d6c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d6d0: 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20  name.  The name 
d6e0: 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d  will be nul-term
d6f0: 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  inated.**       
d700: 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f  and might be sho
d710: 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61  rter than the va
d720: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35  lue read from (5
d730: 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74  ).  If the first
d740: 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f   byte.**       o
d750: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30  f the name is \0
d760: 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  00 then there is
d770: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
d780: 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a  al.  The master.
d790: 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
d7a0: 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20   name is stored 
d7b0: 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37  in UTF-8..**  (7
d7c0: 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
d7d0: 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
d7e0: 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
d7f0: 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
d800: 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
d810: 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
d820: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
d830: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
d840: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
d850: 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
d860: 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
d870: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
d880: 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
d890: 74 68 65 20 66 69 72 73 74 20 36 20 69 74 65 6d  the first 6 item
d8a0: 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
d8b0: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
d8c0: 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
d8d0: 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74 68 20  ance of the 7th 
d8e0: 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
d8f0: 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
d900: 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
d910: 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
d920: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
d930: 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
d940: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
d950: 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
d960: 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
d970: 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
d980: 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
d990: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
d9a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
d9b0: 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
d9c0: 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
d9d0: 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
d9e0: 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
d9f0: 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
da00: 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
da10: 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
da20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
da30: 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
da40: 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
da50: 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
da60: 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
da70: 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
da80: 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
da90: 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
daa0: 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
dab0: 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
dac0: 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
dad0: 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
dae0: 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
daf0: 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
db00: 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
db10: 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
db20: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
db30: 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
db40: 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
db50: 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
db60: 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
db70: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
db80: 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
db90: 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
dba0: 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
dbb0: 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
dbc0: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
dbd0: 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
dbe0: 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
dbf0: 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
dc00: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
dc10: 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
dc20: 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
dc30: 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
dc40: 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
dc50: 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
dc60: 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
dc70: 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
dc80: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
dc90: 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
dca0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
dcb0: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
dcc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
dcd0: 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
dce0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
dcf0: 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
dd00: 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
dd10: 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
dd20: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
dd30: 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
dd40: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
dd50: 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
dd60: 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
dd70: 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
dd80: 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
dd90: 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
dda0: 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
ddb0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
ddc0: 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
ddd0: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
dde0: 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
ddf0: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
de00: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
de10: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
de20: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
de30: 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
de40: 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74  Pager, int isHot
de50: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
de60: 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
de70: 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a  >pVfs;.  i64 szJ
de80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
de90: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
dea0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
deb0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
dec0: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
ded0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
dee0: 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65  f Records in the
def0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
df00: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
df10: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
df20: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
df30: 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
df40: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
df50: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
df60: 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
df70: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
df80: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
df90: 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62  lt code of a sub
dfa0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
dfb0: 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
dfc0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
dfd0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
dfe0: 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a  file if any */..
dff0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
e000: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
e010: 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72   are in the jour
e020: 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c  nal.  Abort earl
e030: 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  y if.  ** the jo
e040: 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a  urnal is empty..
e050: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
e060: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
e070: 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  en );.  rc = sql
e080: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
e090: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a  Pager->jfd, &szJ
e0a0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
e0b0: 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30  ITE_OK || szJ==0
e0c0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
e0d0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
e0e0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61    /* Read the ma
e0f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
e100: 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  e from the journ
e110: 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65  al, if it is pre
e120: 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20  sent..  ** If a 
e130: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e140: 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63  ile name is spec
e150: 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66  ified, but the f
e160: 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ile is not.  ** 
e170: 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c  present on disk,
e180: 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
e190: 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64  l is not hot and
e1a0: 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
e1b0: 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64  o be.  ** played
e1c0: 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63   back..  */.  rc
e1d0: 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
e1e0: 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
e1f0: 2c 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61  , &zMaster);.  a
e200: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
e210: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  E_DONE );.  if( 
e220: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc!=SQLITE_OK . 
e230: 20 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26 26    || (zMaster &&
e240: 20 21 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73   !sqlite3OsAcces
e250: 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
e260: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
e270: 58 49 53 54 53 29 29 20 0a 20 20 29 7b 0a 20 20  XISTS)) .  ){.  
e280: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
e290: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61  Master);.    zMa
e2a0: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66  ster = 0;.    if
e2b0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
e2c0: 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  E ) rc = SQLITE_
e2d0: 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  OK;.    goto end
e2e0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
e2f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e300: 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54  Off = 0;..  /* T
e310: 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  his loop termina
e320: 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20  tes either when 
e330: 74 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  the readJournalH
e340: 64 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  dr() call return
e350: 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  s.  ** SQLITE_DO
e360: 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  NE or an IO erro
e370: 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77  r occurs. */.  w
e380: 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20  hile( 1 ){..    
e390: 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74  /* Read the next
e3a0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e3b0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
e3c0: 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
e3d0: 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20   are.    ** not 
e3e0: 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66  enough bytes lef
e3f0: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
e400: 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70   file for a comp
e410: 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a  lete header, or.
e420: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72      ** it is cor
e430: 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70  rupted, then a p
e440: 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66  rocess must of f
e450: 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74  ailed while writ
e460: 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54  ing it..    ** T
e470: 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f  his indicates no
e480: 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73  thing more needs
e490: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
e4a0: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ck..    */.    r
e4b0: 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
e4c0: 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20  dr(pPager, szJ, 
e4d0: 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20  &nRec, &mxPg);. 
e4e0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e4f0: 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69  E_OK ){ .      i
e500: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
e510: 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NE ){.        rc
e520: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
e530: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
e540: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
e550: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
e560: 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66  nRec is 0xffffff
e570: 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f  ff, then this jo
e580: 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65  urnal was create
e590: 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20  d by a process. 
e5a0: 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e     ** working in
e5b0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54   no-sync mode. T
e5c0: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
e5d0: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  he rest of the j
e5e0: 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
e5f0: 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70  le consists of p
e600: 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20  ages, there are 
e610: 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20  no more journal 
e620: 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65  headers. Compute
e630: 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
e640: 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20  e of nRec based 
e650: 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69  on this assumpti
e660: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
e670: 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66  f( nRec==0xfffff
e680: 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fff ){.      ass
e690: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
e6a0: 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
e6b0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
e6c0: 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  );.      nRec = 
e6d0: 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
e6e0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
e6f0: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
e700: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ger);.    }..   
e710: 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
e720: 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61   and this rollba
e730: 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73  ck is of a trans
e740: 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62  action created b
e750: 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72  y this.    ** pr
e760: 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69  ocess and if thi
e770: 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68  s is the final h
e780: 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75  eader in the jou
e790: 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65  rnal, then it me
e7a0: 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ans.    ** that 
e7b0: 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  this part of the
e7c0: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
e7d0: 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61  ng filled but ha
e7e0: 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20  s not yet been. 
e7f0: 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20     ** synced to 
e800: 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74  disk.  Compute t
e810: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
e820: 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  es based on the 
e830: 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  remaining.    **
e840: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
e850: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
e860: 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20   The third term 
e870: 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20  of the test was 
e880: 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63  added to fix tic
e890: 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a  ket #2565..    *
e8a0: 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
e8b0: 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20  0 && !isHot &&. 
e8c0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
e8d0: 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
e8e0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
e8f0: 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
e900: 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52  lOff ){.      nR
e910: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67  ec = (szJ - pPag
e920: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
e930: 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  / JOURNAL_PG_SZ(
e940: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPager);.    }..
e950: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
e960: 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64  s the first head
e970: 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  er read from the
e980: 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61   journal, trunca
e990: 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
e9a0: 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
e9b0: 20 74 6f 20 69 74 27 73 20 6f 72 69 67 69 6e 61   to it's origina
e9c0: 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  l size..    */. 
e9d0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
e9e0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
e9f0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
ea00: 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
ea10: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
ea20: 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20  Pager, mxPg);.  
ea30: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ea40: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
ea50: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
ea60: 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
ea70: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f  }..    /* Copy o
ea80: 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
ea90: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
eaa0: 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
eab0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
eac0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
ead0: 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b  (i=0; i<nRec; i+
eae0: 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
eaf0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
eb00: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
eb10: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
eb20: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
eb30: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
eb40: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
eb50: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
eb60: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
eb70: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
eb80: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
eb90: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
eba0: 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
ebb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ebc0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ebd0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
ebe0: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
ebf0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
ec00: 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43  .  }.  /*NOTREAC
ec10: 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  HED*/.  assert( 
ec20: 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61  0 );..end_playba
ec30: 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ck:.  if( rc==SQ
ec40: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
ec50: 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
ec60: 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
ec70: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61  );.  }.  if( zMa
ec80: 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ster ){.    /* I
ec90: 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
eca0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
ecb0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
ecc0: 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  ll return succes
ecd0: 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66  s,.    ** see if
ece0: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
ecf0: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
ed00: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster journal..  
ed10: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
ed20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ed30: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64      rc = pager_d
ed40: 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c  elmaster(pPager,
ed50: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7d   zMaster);.    }
ed60: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
ed70: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(zMaster);.  }.
ed80: 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
ed90: 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
eda0: 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
edb0: 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
edc0: 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
edd0: 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
ede0: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
edf0: 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
ee00: 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20  t sector size.  
ee10: 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
ee20: 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
ee30: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
ee40: 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
ee50: 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
ee60: 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
ee70: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c   rc;.}../*.** Pl
ee80: 61 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  ayback the state
ee90: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
eea0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69  .** This is simi
eeb0: 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  lar to playing b
eec0: 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
eed0: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20  ion journal but 
eee0: 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78  with.** a few ex
eef0: 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a  tra twists..**.*
ef00: 2a 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75  *    (1)  The nu
ef10: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
ef20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
ef30: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
ef40: 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  of.**         th
ef50: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  e statement is s
ef60: 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d  tored in pPager-
ef70: 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69  >stmtSize, not i
ef80: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
ef90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74   journal file it
efa0: 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  self..**.**    (
efb0: 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  2)  In addition 
efc0: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
efd0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
efe0: 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20  urnal, also.**  
eff0: 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20         playback 
f000: 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65  all pages of the
f010: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
f020: 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a  rnal beginning.*
f030: 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66  *         at off
f040: 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  set pPager->stmt
f050: 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  JSize..*/.static
f060: 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f   int pager_stmt_
f070: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
f080: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73  pPager){.  i64 s
f090: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
f0a0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
f0b0: 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20  he full journal 
f0c0: 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b  */.  i64 hdrOff;
f0d0: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
f0f0: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
f100: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
f110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f120: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
f130: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73  /.  int rc;..  s
f140: 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
f150: 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66  rnalOff;.#ifndef
f160: 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20   NDEBUG .  {.   
f170: 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20   i64 os_szJ;.   
f180: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
f190: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
f1a0: 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20  jfd, &os_szJ);. 
f1b0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
f1c0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
f1d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
f1e0: 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d  J==os_szJ );.  }
f1f0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65  .#endif..  /* Se
f200: 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74  t hdrOff to be t
f210: 68 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61  he offset just a
f220: 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20  fter the end of 
f230: 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c  the last journal
f240: 0a 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74  .  ** page writt
f250: 65 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  en before the fi
f260: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
f270: 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74  er for this stat
f280: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73  ement.  ** trans
f290: 61 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74  action was writt
f2a0: 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f  en, or the end o
f2b0: 66 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f  f the file if no
f2c0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65   journal.  ** he
f2d0: 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e  ader was written
f2e0: 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20  ..  */.  hdrOff 
f2f0: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64  = pPager->stmtHd
f300: 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  rOff;.  assert( 
f310: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
f320: 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20   || !hdrOff );. 
f330: 20 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a   if( !hdrOff ){.
f340: 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a      hdrOff = szJ
f350: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72  ;.  }.  .  /* Tr
f360: 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
f370: 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ase back to its 
f380: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
f390: 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
f3a0: 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
f3b0: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  , pPager->stmtSi
f3c0: 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ze);.  assert( p
f3d0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
f3e0: 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20  GER_SHARED );.. 
f3f0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
f400: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
f410: 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
f420: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ment journal..  
f430: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
f440: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
f450: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
f460: 6c 4f 70 65 6e 20 29 3b 0a 20 20 6e 52 65 63 20  lOpen );.  nRec 
f470: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52  = pPager->stmtNR
f480: 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79  ec;.  .  /* Copy
f490: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
f4a0: 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61 74 65  out of the state
f4b0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ment journal and
f4c0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20   back into the. 
f4d0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
f4e0: 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68  e.  Note that th
f4f0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
f500: 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73  nal omits checks
f510: 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61  ums from.  ** ea
f520: 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20  ch record since 
f530: 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65  power-failure re
f540: 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d  covery is not im
f550: 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65  portant to state
f560: 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  ment.  ** journa
f570: 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ls..  */.  for(i
f580: 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29  =0; i<nRec; i++)
f590: 7b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  {.    i64 offset
f5a0: 20 3d 20 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e   = i*(4+pPager->
f5b0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72  pageSize);.    r
f5c0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
f5d0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
f5e0: 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64  er, pPager->stfd
f5f0: 2c 20 6f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20  , offset, 0);.  
f600: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
f610: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
f620: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f630: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
f640: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
f650: 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20  ..  /* Now roll 
f660: 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20  some pages back 
f670: 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63  from the transac
f680: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61  tion journal. Pa
f690: 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20  ger.stmtJSize.  
f6a0: 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65 20  ** was the size 
f6b0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
f6c0: 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73 74  ile when this st
f6d0: 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72  atement was star
f6e0: 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65  ted, so.  ** eve
f6f0: 72 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68  rything after th
f700: 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  at needs to be r
f710: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68  olled back, eith
f720: 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  er into the.  **
f730: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d   database, the m
f740: 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20  emory cache, or 
f750: 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  both..  **.  ** 
f760: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72  If it is not zer
f770: 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74  o, then Pager.st
f780: 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68 65 20  mtHdrOff is the 
f790: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
f7a0: 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
f7b0: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
f7c0: 61 64 65 72 20 77 72 69 74 74 65 6e 20 64 75 72  ader written dur
f7d0: 69 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65  ing this stateme
f7e0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
f7f0: 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a    */.  pPager->j
f800: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67  ournalOff = pPag
f810: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20  er->stmtJSize;. 
f820: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
f830: 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  it = pPager->stm
f840: 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28  tCksum;.  while(
f850: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f860: 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a  Off < hdrOff ){.
f870: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
f880: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
f890: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
f8a0: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
f8b0: 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20  urnalOff, 1);.  
f8c0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
f8d0: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
f8e0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f8f0: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
f900: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
f910: 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65  ..  while( pPage
f920: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20  r->journalOff < 
f930: 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  szJ ){.    u32 n
f940: 4a 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  JRec;         /*
f950: 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e   Number of Journ
f960: 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al Records */.  
f970: 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
f980: 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
f990: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a  lHdr(pPager, szJ
f9a0: 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
f9b0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
f9c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f9d0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
f9e0: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
f9f0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74     goto end_stmt
fa00: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
fa10: 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
fa20: 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63  0 ){.      nJRec
fa30: 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72   = (szJ - pPager
fa40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
fa50: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
fa60: 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e+8);.    }.    
fa70: 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69  for(i=nJRec-1; i
fa80: 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  >=0 && pPager->j
fa90: 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b  ournalOff < szJ;
faa0: 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20   i--){.      rc 
fab0: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
fac0: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
fad0: 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  , pPager->jfd, p
fae0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
faf0: 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73  f, 1);.      ass
fb00: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
fb10: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66  DONE );.      if
fb20: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
fb30: 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
fb40: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
fb50: 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
fb60: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
fb70: 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  .  .end_stmt_pla
fb80: 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d  yback:.  if( rc=
fb90: 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20  =SQLITE_OK) {.  
fba0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
fbb0: 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
fbc0: 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f  /* pager_reload_
fbd0: 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a  cache(pPager); *
fbe0: 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  /.  }.  return r
fbf0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
fc00: 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
fc10: 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
fc20: 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
fc30: 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f  e allowed..*/.vo
fc40: 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
fc50: 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
fc60: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
fc70: 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
fc80: 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70  Page>10 ){.    p
fc90: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
fca0: 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b  mxPage;.  }else{
fcb0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
fcc0: 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a  age = 10;.  }.}.
fcd0: 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
fce0: 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
fcf0: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
fd00: 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
fd10: 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
fd20: 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
fd30: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
fd40: 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
fd50: 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
fd60: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
fd70: 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
fd80: 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
fd90: 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
fda0: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
fdb0: 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
fdc0: 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
fdd0: 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
fde0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
fdf0: 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
fe00: 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
fe10: 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
fe20: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
fe30: 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
fe40: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
fe50: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
fe60: 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
fe70: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
fe80: 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
fe90: 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
fea0: 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
feb0: 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
fec0: 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
fed0: 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
fef0: 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
ff00: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
ff10: 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
ff20: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
ff30: 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
ff40: 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
ff50: 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
ff60: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
ff70: 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
ff80: 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
ff90: 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
ffa0: 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
ffb0: 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
ffc0: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
ffd0: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
ffe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
fff0: 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
10000 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
10010 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
10020 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
10030 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
10040 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
10050 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
10060 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
10070 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
10080 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
10090 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
100a0 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
100b0 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
100c0 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
100d0 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
100e0 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
100f0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
10100 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
10110 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
10120 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
10130 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
10140 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
10150 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
10160 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
10170 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
10180 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
10190 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
101a0 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
101b0 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
101c0 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
101d0 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
101e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
101f0 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
10200 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
10210 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20  fetyLevel(Pager 
10220 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76  *pPager, int lev
10230 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79  el, int full_fsy
10240 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nc){.  pPager->n
10250 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d  oSync =  level==
10260 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  1 || pPager->tem
10270 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
10280 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65  >fullSync = leve
10290 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d  l==3 && !pPager-
102a0 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
102b0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20  ger->sync_flags 
102c0 3d 20 28 66 75 6c 6c 5f 66 73 79 6e 63 3f 53 51  = (full_fsync?SQ
102d0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53  LITE_SYNC_FULL:S
102e0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
102f0 4c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  L);.  if( pPager
10300 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65  ->noSync ) pPage
10310 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
10320 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
10330 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
10340 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
10350 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
10360 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61  enever the libra
10370 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ry.** attempts t
10380 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
10390 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  ry file.  This i
103a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
103b0 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
103c0 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
103d0 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66  nly.  .*/.#ifdef
103e0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
103f0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
10400 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  p_count = 0;.#en
10410 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  dif../*.** Open 
10420 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
10430 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  . .**.** Write t
10440 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
10450 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65  or into *fd.  Re
10460 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
10470 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d  n success or som
10480 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72  e.** other error
10490 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c   code if we fail
104a0 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75  . The OS will au
104b0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
104c0 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
104d0 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 69 74  .** file when it
104e0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
104f0 2a 20 49 66 20 7a 4e 61 6d 65 4f 75 74 20 69 73  * If zNameOut is
10500 20 30 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f   0, then SQLITE_
10510 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
10520 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  is passed to the
10530 20 4f 53 20 6c 61 79 65 72 2e 0a 2a 2a 20 49 66   OS layer..** If
10540 20 7a 4e 61 6d 65 4f 75 74 20 69 73 20 6e 6f 74   zNameOut is not
10550 20 30 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   0, SQLITE_OPEN_
10560 54 45 4d 50 5f 44 42 20 69 73 20 70 61 73 73 65  TEMP_DB is passe
10570 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
10580 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
10590 6e 74 65 6d 70 28 0a 20 20 73 71 6c 69 74 65 33  ntemp(.  sqlite3
105a0 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 73  _vfs *pVfs, .  s
105b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
105c0 6c 65 2c 20 0a 20 20 63 68 61 72 20 2a 7a 4e 61  le, .  char *zNa
105d0 6d 65 4f 75 74 0a 29 7b 0a 20 20 69 6e 74 20 63  meOut.){.  int c
105e0 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63  nt = 8;.  int rc
105f0 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ;.  int flags = 
10600 28 0a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  (.     SQLITE_OP
10610 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
10620 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
10630 0a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  .     SQLITE_OPE
10640 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
10650 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
10660 43 4c 4f 53 45 0a 20 20 29 3b 0a 0a 20 20 63 68  CLOSE.  );..  ch
10670 61 72 20 2a 7a 46 72 65 65 20 3d 20 30 3b 0a 20  ar *zFree = 0;. 
10680 20 69 66 28 20 7a 4e 61 6d 65 4f 75 74 3d 3d 30   if( zNameOut==0
10690 20 29 7b 0a 20 20 20 20 7a 46 72 65 65 20 3d 20   ){.    zFree = 
106a0 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
106b0 6d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 6d 78 50  malloc(pVfs->mxP
106c0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  athname);.    if
106d0 28 20 21 7a 46 72 65 65 20 29 7b 0a 20 20 20 20  ( !zFree ){.    
106e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
106f0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
10700 20 7a 4e 61 6d 65 4f 75 74 20 3d 20 7a 46 72 65   zNameOut = zFre
10710 65 3b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  e;.    flags |= 
10720 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
10730 4f 55 52 4e 41 4c 3b 0a 20 20 7d 65 6c 73 65 7b  OURNAL;.  }else{
10740 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51  .    flags |= SQ
10750 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
10760 42 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  B;.  }..#ifdef S
10770 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
10780 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
10790 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
107a0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
107b0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
107c0 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f 7b 0a 20  .#endif..  do{. 
107d0 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71     cnt--;.    sq
107e0 6c 69 74 65 33 4f 73 47 65 74 54 65 6d 70 4e 61  lite3OsGetTempNa
107f0 6d 65 28 70 56 66 73 2c 20 7a 4e 61 6d 65 4f 75  me(pVfs, zNameOu
10800 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  t);.    rc = sql
10810 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
10820 20 7a 4e 61 6d 65 4f 75 74 2c 20 70 46 69 6c 65   zNameOut, pFile
10830 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  , flags, 0);.   
10840 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
10850 49 54 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d  ITE_OK || pFile-
10860 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 7d  >pMethods );.  }
10870 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20  while( cnt>0 && 
10880 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
10890 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
108a0 4d 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  M );..  sqlite3_
108b0 66 72 65 65 28 7a 46 72 65 65 29 3b 0a 20 20 72  free(zFree);.  r
108c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
108d0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
108e0 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70  page cache and p
108f0 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
10900 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  the page cache i
10910 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54  n *ppPager..** T
10920 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
10930 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78  ched need not ex
10940 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69  ist.  The file i
10950 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74  s not locked unt
10960 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  il.** the first 
10970 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
10980 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 69 73  agerGet() and is
10990 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20   only held open 
109a0 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73  until the.** las
109b0 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
109c0 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
109d0 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a  PagerUnref()..**
109e0 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
109f0 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
10a00 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
10a10 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
10a20 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
10a30 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
10a40 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20   to be cached.  
10a50 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  The file will be
10a60 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
10a70 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69  matically when i
10a80 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
10a90 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
10aa0 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
10ab0 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  en all informati
10ac0 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
10ad0 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65  che..** It is ne
10ae0 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64  ver written to d
10af0 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62  isk.  This can b
10b00 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
10b10 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d  ent an.** in-mem
10b20 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  ory database..*/
10b30 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
10b40 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
10b50 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
10b60 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
10b70 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
10b80 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
10b90 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
10ba0 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
10bb0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
10bc0 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
10bd0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
10be0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
10bf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
10c00 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
10c10 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
10c20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
10c30 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
10c40 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
10c50 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ge */.  int flag
10c60 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
10c70 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f   /* flags contro
10c80 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20  lling this file 
10c90 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72  */.){.  u8 *pPtr
10ca0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
10cb0 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  r = 0;.  int rc 
10cc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
10cd0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70  nt i;.  int temp
10ce0 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  File = 0;.  int 
10cf0 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74  memDb = 0;.  int
10d00 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20   readOnly = 0;. 
10d10 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
10d20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
10d30 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
10d40 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  0;.  int noReadl
10d50 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
10d60 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
10d70 29 21 3d 30 3b 0a 20 20 69 6e 74 20 6a 6f 75 72  )!=0;.  int jour
10d80 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73 71  nalFileSize = sq
10d90 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65  lite3JournalSize
10da0 28 70 56 66 73 29 3b 0a 0a 20 20 2f 2a 20 54 68  (pVfs);..  /* Th
10db0 65 20 64 65 66 61 75 6c 74 20 72 65 74 75 72 6e  e default return
10dc0 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
10dd0 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  er */.  *ppPager
10de0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f   = 0;..  /* Allo
10df0 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
10e00 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74  the pager struct
10e10 75 72 65 20 2a 2f 0a 20 20 70 50 61 67 65 72 20  ure */.  pPager 
10e20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
10e30 65 72 6f 28 0a 20 20 20 20 73 69 7a 65 6f 66 28  ero(.    sizeof(
10e40 2a 70 50 61 67 65 72 29 20 2b 20 20 20 20 20 20  *pPager) +      
10e50 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
10e60 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 6a  ructure */.    j
10e70 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2b  ournalFileSize +
10e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10e90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
10ea0 74 72 75 63 74 75 72 65 20 2a 2f 20 0a 20 20 20  tructure */ .   
10eb0 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20   pVfs->szOsFile 
10ec0 2a 20 32 20 2b 20 20 20 20 20 20 20 20 2f 2a 20  * 2 +        /* 
10ed0 54 68 65 20 64 62 20 61 6e 64 20 73 74 6d 74 20  The db and stmt 
10ee0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
10ef0 20 0a 20 20 20 20 70 56 66 73 2d 3e 6d 78 50 61   .    pVfs->mxPa
10f00 74 68 6e 61 6d 65 20 2a 20 33 20 2b 20 33 30 20  thname * 3 + 30 
10f10 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c 20    /* zFilename, 
10f20 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 4a 6f 75  zDirectory, zJou
10f30 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69  rnal */.  );.  i
10f40 66 28 20 21 70 50 61 67 65 72 20 29 7b 0a 20 20  f( !pPager ){.  
10f50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10f60 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 74  NOMEM;.  }.  pPt
10f70 72 20 3d 20 28 75 38 20 2a 29 26 70 50 61 67 65  r = (u8 *)&pPage
10f80 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r[1];.  pPager->
10f90 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
10fa0 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e  le*)&pPtr[pVfs->
10fb0 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20 20 70  szOsFile*0];.  p
10fc0 50 61 67 65 72 2d 3e 73 74 66 64 20 3d 20 28 73  Pager->stfd = (s
10fd0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50  qlite3_file*)&pP
10fe0 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  tr[pVfs->szOsFil
10ff0 65 2a 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  e*1];.  pPager->
11000 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  jfd = (sqlite3_f
11010 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d  ile*)&pPtr[pVfs-
11020 3e 73 7a 4f 73 46 69 6c 65 2a 32 5d 3b 0a 20 20  >szOsFile*2];.  
11030 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
11040 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 74 72  e = (char*)&pPtr
11050 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a  [pVfs->szOsFile*
11060 32 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  2+journalFileSiz
11070 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44  e];.  pPager->zD
11080 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67  irectory = &pPag
11090 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 70 56  er->zFilename[pV
110a0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 5d 3b  fs->mxPathname];
110b0 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  .  pPager->zJour
110c0 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  nal = &pPager->z
110d0 44 69 72 65 63 74 6f 72 79 5b 70 56 66 73 2d 3e  Directory[pVfs->
110e0 6d 78 50 61 74 68 6e 61 6d 65 5d 3b 0a 20 20 70  mxPathname];.  p
110f0 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56  Pager->pVfs = pV
11100 66 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  fs;..  /* Open t
11110 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20  he pager file.. 
11120 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
11130 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
11140 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  [0] ){.#ifndef S
11150 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
11160 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63  YDB.    if( strc
11170 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d  mp(zFilename,":m
11180 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20  emory:")==0 ){. 
11190 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a       memDb = 1;.
111a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46        pPager->zF
111b0 69 6c 65 6e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30  ilename[0] = '\0
111c0 27 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  ';.    }else.#en
111d0 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
111e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
111f0 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
11200 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67   zFilename, pPag
11210 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
11220 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
11230 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11240 20 20 20 69 66 28 20 73 74 72 6c 65 6e 28 70 50     if( strlen(pP
11250 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
11260 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  >(pVfs->mxPathna
11270 6d 65 20 2d 20 73 74 72 6c 65 6e 28 22 2d 6a 6f  me - strlen("-jo
11280 75 72 6e 61 6c 22 29 29 20 29 7b 0a 20 20 20 20  urnal")) ){.    
11290 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
112a0 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20  E_CANTOPEN;.    
112b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
112c0 20 20 20 20 20 69 6e 74 20 6f 66 6c 61 67 20 3d       int oflag =
112d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
112e0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
112f0 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
11300 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45  EN_CREATE|SQLITE
11310 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a  _OPEN_MAIN_DB);.
11320 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f            int fo
11330 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
11340 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11350 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
11360 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
11370 61 67 65 72 2d 3e 66 64 2c 20 6f 66 6c 61 67 2c  ager->fd, oflag,
11380 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20   &fout);.       
11390 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66     readOnly = (f
113a0 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  out&SQLITE_OPEN_
113b0 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 20  READONLY);.     
113c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
113d0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
113e0 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
113f0 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
11400 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
11410 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
11420 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
11430 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
11440 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
11450 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
11460 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
11470 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
11480 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
11490 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
114a0 65 28 29 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20  e()..    */ .   
114b0 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20   tempFile = 1;. 
114c0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
114d0 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
114e0 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  VE;.  }..  if( p
114f0 50 61 67 65 72 20 26 26 20 72 63 3d 3d 53 51 4c  Pager && rc==SQL
11500 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
11510 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
11520 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
11530 33 5f 6d 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  3_malloc(SQLITE_
11540 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
11550 45 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  E);.  }..  /* If
11560 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   an error occure
11570 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
11580 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2e  he blocks above.
11590 0a 20 20 2a 2a 20 46 72 65 65 20 74 68 65 20 50  .  ** Free the P
115a0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
115b0 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  nd close the fil
115c0 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20 74 68  e..  ** Since th
115d0 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61  e pager is not a
115e0 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20 69  llocated there i
115f0 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 74  s no need to set
11600 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65 72   .  ** any Pager
11610 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c  .errMask variabl
11620 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
11630 70 50 61 67 65 72 20 7c 7c 20 21 70 50 61 67 65  pPager || !pPage
11640 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  r->pTmpSpace ){.
11650 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11660 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
11670 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
11680 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
11690 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54  turn ((rc==SQLIT
116a0 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d  E_OK)?SQLITE_NOM
116b0 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 50  EM:rc);.  }..  P
116c0 41 47 45 52 54 52 41 43 45 33 28 22 4f 50 45 4e  AGERTRACE3("OPEN
116d0 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48   %d %s\n", FILEH
116e0 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e  ANDLEID(pPager->
116f0 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  fd), pPager->zFi
11700 6c 65 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41  lename);.  IOTRA
11710 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c  CE(("OPEN %p %s\
11720 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
11730 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a  er->zFilename)).
11740 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61  .  /* Fill in Pa
11750 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 5b 5d  ger.zDirectory[]
11760 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50 61   */.  memcpy(pPa
11770 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c  ger->zDirectory,
11780 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
11790 6d 65 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  me, pVfs->mxPath
117a0 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 73  name);.  for(i=s
117b0 74 72 6c 65 6e 28 70 50 61 67 65 72 2d 3e 7a 44  trlen(pPager->zD
117c0 69 72 65 63 74 6f 72 79 29 3b 20 69 3e 30 20 26  irectory); i>0 &
117d0 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  & pPager->zDirec
117e0 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20  tory[i-1]!='/'; 
117f0 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30  i--){}.  if( i>0
11800 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65   ) pPager->zDire
11810 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a  ctory[i-1] = 0;.
11820 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61  .  /* Fill in Pa
11830 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d 20 2a  ger.zJournal[] *
11840 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65  /.  memcpy(pPage
11850 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
11860 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
11870 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
11880 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61  );.  memcpy(&pPa
11890 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 73 74  ger->zJournal[st
118a0 72 6c 65 6e 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  rlen(pPager->zJo
118b0 75 72 6e 61 6c 29 5d 2c 20 22 2d 6a 6f 75 72 6e  urnal)], "-journ
118c0 61 6c 22 2c 20 39 29 3b 0a 0a 20 20 2f 2a 20 70  al", 9);..  /* p
118d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
118e0 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  en = 0; */.  pPa
118f0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
11900 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20  = useJournal && 
11910 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  !memDb;.  pPager
11920 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e  ->noReadlock = n
11930 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61  oReadlock && rea
11940 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67  dOnly;.  /* pPag
11950 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
11960 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
11970 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
11980 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
11990 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20  >nRef = 0; */.  
119a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
119b0 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67   memDb-1;.  pPag
119c0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53  er->pageSize = S
119d0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
119e0 47 45 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70 50  GE_SIZE;.  /* pP
119f0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
11a00 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
11a10 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
11a20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
11a30 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
11a40 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  .  pPager->mxPag
11a50 65 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65  e = 100;.  pPage
11a60 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49  r->mxPgno = SQLI
11a70 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e  TE_MAX_PAGE_COUN
11a80 54 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  T;.  assert( PAG
11a90 45 52 5f 55 4e 4c 4f 43 4b 3d 3d 30 20 29 3b 0a  ER_UNLOCK==0 );.
11aa0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61    /* pPager->sta
11ab0 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
11ac0 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  K; */.  /* pPage
11ad0 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20  r->errMask = 0; 
11ae0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  */.  pPager->tem
11af0 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65  pFile = tempFile
11b00 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70  ;.  assert( temp
11b10 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
11b20 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a  INGMODE_NORMAL .
11b30 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d            || tem
11b40 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
11b50 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
11b60 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
11b70 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
11b80 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29  E_EXCLUSIVE==1 )
11b90 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
11ba0 75 73 69 76 65 4d 6f 64 65 20 3d 20 74 65 6d 70  usiveMode = temp
11bb0 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d  File; .  pPager-
11bc0 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a  >memDb = memDb;.
11bd0 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
11be0 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20  ly = readOnly;. 
11bf0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64   /* pPager->need
11c00 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Sync = 0; */.  p
11c10 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
11c20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
11c30 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b   || !useJournal;
11c40 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
11c50 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e  ync = (pPager->n
11c60 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50  oSync?0:1);.  pP
11c70 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
11c80 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
11c90 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67  ORMAL;.  /* pPag
11ca0 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
11cb0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
11cc0 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
11cd0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
11ce0 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
11cf0 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
11d00 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45   = FORCE_ALIGNME
11d10 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 61 73  NT(nExtra);.  as
11d20 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d  sert(pPager->fd-
11d30 3e 70 4d 65 74 68 6f 64 73 7c 7c 6d 65 6d 44 62  >pMethods||memDb
11d40 7c 7c 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69  ||tempFile);.  i
11d50 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20  f( !memDb ){.   
11d60 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
11d70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a  Pager);.  }.  /*
11d80 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
11d90 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20  ndler = 0; */.  
11da0 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
11db0 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
11dc0 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
11dd0 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  )); */.  *ppPage
11de0 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64  r = pPager;.#ifd
11df0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
11e00 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
11e10 4e 54 0a 20 20 70 50 61 67 65 72 2d 3e 69 49 6e  NT.  pPager->iIn
11e20 55 73 65 4d 4d 20 3d 20 30 3b 0a 20 20 70 50 61  UseMM = 0;.  pPa
11e30 67 65 72 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20  ger->iInUseDB = 
11e40 30 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20  0;.  if( !memDb 
11e50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  ){.    sqlite3_m
11e60 75 74 65 78 20 2a 6d 75 74 65 78 20 3d 20 73 71  utex *mutex = sq
11e70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
11e80 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
11e90 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20  TATIC_MEM2);.   
11ea0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
11eb0 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20  nter(mutex);.   
11ec0 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d   pPager->pNext =
11ed0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
11ee0 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
11ef0 65 33 50 61 67 65 72 4c 69 73 74 20 29 7b 0a 20  e3PagerList ){. 
11f00 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
11f10 69 74 65 33 50 61 67 65 72 4c 69 73 74 2d 3e 70  ite3PagerList->p
11f20 50 72 65 76 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Prev==0 );.     
11f30 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
11f40 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 61 67 65  t->pPrev = pPage
11f50 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  r;.    }.    pPa
11f60 67 65 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  ger->pPrev = 0;.
11f70 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
11f80 4c 69 73 74 20 3d 20 70 50 61 67 65 72 3b 0a 20  List = pPager;. 
11f90 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
11fa0 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 20  _leave(mutex);. 
11fb0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
11fc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11fd0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
11fe0 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
11ff0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
12000 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
12010 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a  yhandler(Pager *
12020 70 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64  pPager, BusyHand
12030 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  ler *pBusyHandle
12040 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  r){.  pPager->pB
12050 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75  usyHandler = pBu
12060 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a  syHandler;.}../*
12070 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74  .** Set the dest
12080 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20  ructor for this 
12090 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
120a0 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63  ULL, the destruc
120b0 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  tor is called.**
120c0 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
120d0 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63  nce count on eac
120e0 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a  h page reaches z
120f0 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75  ero.  The destru
12100 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75  ctor can.** be u
12110 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  sed to clean up 
12120 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
12130 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74  he extra segment
12140 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63   appended to eac
12150 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  h page..**.** Th
12160 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
12170 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20  not called as a 
12180 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 50 61  result sqlite3Pa
12190 67 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a  gerClose().  .**
121a0 20 44 65 73 74 72 75 63 74 6f 72 73 20 61 72 65   Destructors are
121b0 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
121c0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
121d0 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  f()..*/.void sql
121e0 69 74 65 33 50 61 67 65 72 53 65 74 44 65 73 74  ite3PagerSetDest
121f0 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50  ructor(Pager *pP
12200 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65  ager, void (*xDe
12210 73 63 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29  sc)(DbPage*,int)
12220 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65  ){.  pPager->xDe
12230 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63  structor = xDesc
12240 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
12250 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72  he reinitializer
12260 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
12270 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74    If not NULL, t
12280 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72  he reinitializer
12290 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68  .** is called wh
122a0 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  en the content o
122b0 66 20 61 20 70 61 67 65 20 69 6e 20 63 61 63 68  f a page in cach
122c0 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
122d0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   its original.**
122e0 20 76 61 6c 75 65 20 61 73 20 61 20 72 65 73 75   value as a resu
122f0 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b  lt of a rollback
12300 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20  .  The callback 
12310 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76  gives higher-lev
12320 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70  el code.** an op
12330 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73  portunity to res
12340 74 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73  tore the EXTRA s
12350 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20  ection to agree 
12360 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
12370 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a  d.** page data..
12380 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
12390 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28  agerSetReiniter(
123a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76  Pager *pPager, v
123b0 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44  oid (*xReinit)(D
123c0 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20  bPage*,int)){.  
123d0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
123e0 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a  r = xReinit;.}..
123f0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61  /*.** Set the pa
12400 67 65 20 73 69 7a 65 2e 20 20 52 65 74 75 72 6e  ge size.  Return
12410 20 74 68 65 20 6e 65 77 20 73 69 7a 65 2e 20 20   the new size.  
12420 49 66 20 74 68 65 20 73 75 67 67 65 73 74 20 6e  If the suggest n
12430 65 77 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  ew page.** size 
12440 69 73 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65  is inappropriate
12450 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e  , then an altern
12460 61 74 69 76 65 20 70 61 67 65 20 73 69 7a 65 20  ative page size 
12470 69 73 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61  is selected.** a
12480 6e 64 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  nd returned..*/.
12490 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
124a0 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
124b0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 70  r *pPager, int p
124c0 61 67 65 53 69 7a 65 29 7b 0a 20 20 61 73 73 65  ageSize){.  asse
124d0 72 74 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  rt( pageSize>=51
124e0 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
124f0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
12500 49 5a 45 20 29 3b 0a 20 20 69 66 28 20 21 70 50  IZE );.  if( !pP
12510 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70  ager->memDb && p
12520 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  Pager->nRef==0 )
12530 7b 0a 20 20 20 20 70 61 67 65 72 45 6e 74 65 72  {.    pagerEnter
12540 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61  (pPager);.    pa
12550 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
12560 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
12570 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
12580 7a 65 3b 0a 20 20 20 20 70 61 67 65 72 4c 65 61  ze;.    pagerLea
12590 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ve(pPager);.    
125a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
125b0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
125c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d  .    pPager->pTm
125d0 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
125e0 5f 6d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65  _malloc(pageSize
125f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
12600 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
12610 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
12620 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61  pt to set the ma
12630 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70  ximum database p
12640 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50  age count if mxP
12650 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
12660 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61   .** Make no cha
12670 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69  nges if mxPage i
12680 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  s zero or negati
12690 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72  ve.  And never r
126a0 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78  educe the.** max
126b0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
126c0 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e  below the curren
126d0 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
126e0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  tabase..**.** Re
126f0 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61  gardless of mxPa
12700 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63  ge, return the c
12710 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70  urrent maximum p
12720 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
12730 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  t sqlite3PagerMa
12740 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72  xPageCount(Pager
12750 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
12760 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
12770 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61  age>0 ){.    pPa
12780 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78  ger->mxPgno = mx
12790 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Page;.  }.  sqli
127a0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
127b0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  t(pPager);.  ret
127c0 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  urn pPager->mxPg
127d0 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  no;.}../*.** The
127e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f   following set o
127f0 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  f routines are u
12800 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  sed to disable t
12810 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  he simulated.** 
12820 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e  I/O error mechan
12830 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ism.  These rout
12840 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
12850 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64   avoid simulated
12860 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c  .** errors in pl
12870 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f  aces where we do
12880 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
12890 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e  errors..**.** Un
128a0 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45  less -DSQLITE_TE
128b0 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68  ST=1 is used, th
128c0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
128d0 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61   all no-ops.** a
128e0 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63  nd generate no c
128f0 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ode..*/.#ifdef S
12900 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72  QLITE_TEST.exter
12910 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
12920 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
12930 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
12940 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b  e3_io_error_hit;
12950 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
12960 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61  d_cnt;.void disa
12970 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
12980 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
12990 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
129a0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
129b0 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
129c0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
129d0 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
129e0 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
129f0 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
12a00 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
12a10 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
12a20 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
12a30 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c  .# define disabl
12a40 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
12a50 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65  rrors().# define
12a60 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
12a70 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65  d_io_errors().#e
12a80 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
12a90 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
12aa0 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
12ab0 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
12ac0 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
12ad0 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
12ae0 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f  ts to. .**.** No
12af0 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20   error checking 
12b00 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61 74  is done. The rat
12b10 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20 69  ional for this i
12b20 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
12b30 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20  tion .** may be 
12b40 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20 74  called even if t
12b50 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
12b60 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69   exist or contai
12b70 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20 0a  n a header. In .
12b80 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20 73  ** these cases s
12b90 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 77  qlite3OsRead() w
12ba0 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  ill return an er
12bb0 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74 68  ror, to which th
12bc0 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65  e correct .** re
12bd0 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65 72  sponse is to zer
12be0 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74 20  o the memory at 
12bf0 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e  pDest and contin
12c00 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20 65  ue.  A real IO e
12c10 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72  rror .** will pr
12c20 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20 61  esumably recur a
12c30 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70 20  nd be picked up 
12c40 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68 69  later (Todo: Thi
12c50 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e 0a  nk about this)..
12c60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
12c70 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
12c80 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
12c90 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
12ca0 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
12cb0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12cc0 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
12cd0 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73  est, 0, N);.  as
12ce0 73 65 72 74 28 4d 45 4d 44 42 7c 7c 70 50 61 67  sert(MEMDB||pPag
12cf0 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
12d00 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ||pPager->tempFi
12d10 6c 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  le);.  if( pPage
12d20 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
12d30 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
12d40 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e  "DBHDR %p 0 %d\n
12d50 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20  ", pPager, N)). 
12d60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
12d70 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
12d80 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a  , pDest, N, 0);.
12d90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
12da0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
12db0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
12dc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
12dd0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
12de0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
12df0 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
12e00 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
12e10 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61   the disk file a
12e20 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
12e30 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a  * pPager. .**.**
12e40 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f   If the PENDING_
12e50 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65  BYTE lies on the
12e60 20 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61   page directly a
12e70 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20  fter the end of 
12e80 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  the.** file, the
12e90 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20  n consider this 
12ea0 70 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65  page part of the
12eb0 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65   file too. For e
12ec0 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45  xample, if.** PE
12ed0 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79  NDING_BYTE is by
12ee0 74 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72  te 4096 (the fir
12ef0 73 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20  st byte of page 
12f00 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  5) and the size 
12f10 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  of the.** file i
12f20 73 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20  s 4096 bytes, 5 
12f30 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  is returned inst
12f40 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74  ead of 4..*/.int
12f50 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
12f60 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
12f70 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 20 3d  ager){.  i64 n =
12f80 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
12f90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
12fa0 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
12fb0 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
12fc0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
12fd0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
12fe0 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e  Size>=0 ){.    n
12ff0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
13000 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  e;.  } else {.  
13010 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
13020 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
13030 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
13040 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 67 65  ;.    if( (pPage
13050 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29  r->fd->pMethods)
13060 0a 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 73  .     && (rc = s
13070 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
13080 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29  (pPager->fd, &n)
13090 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
130a0 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
130b0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
130c0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
130d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30     }.    if( n>0
130e0 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61   && n<pPager->pa
130f0 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
13100 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  n = 1;.    }else
13110 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61  {.      n /= pPa
13120 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
13130 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
13140 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
13150 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
13160 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
13170 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = n;.    }.  }.
13180 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e    if( n==(PENDIN
13190 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70  G_BYTE/pPager->p
131a0 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  ageSize) ){.    
131b0 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  n++;.  }.  if( n
131c0 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
131d0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
131e0 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20  xPgno = n;.  }. 
131f0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23   return n;.}...#
13200 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13210 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a  IT_MEMORYDB./*.*
13220 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73 74  * Clear a PgHist
13230 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61  ory block.*/.sta
13240 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69  tic void clearHi
13250 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20  story(PgHistory 
13260 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74  *pHist){.  sqlit
13270 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70  e3_free(pHist->p
13280 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  Orig);.  sqlite3
13290 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  _free(pHist->pSt
132a0 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f  mt);.  pHist->pO
132b0 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74  rig = 0;.  pHist
132c0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23  ->pStmt = 0;.}.#
132d0 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65  else.#define cle
132e0 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e  arHistory(x).#en
132f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  dif../*.** Forwa
13300 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
13310 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
13320 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29  cJournal(Pager*)
13330 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  ;../*.** Unlink 
13340 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61  pPg from it's ha
13350 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73  sh chain. Also s
13360 65 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  et the page numb
13370 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63  er to 0 to indic
13380 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ate.** that the 
13390 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74  page is not part
133a0 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68 61   of any hash cha
133b0 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  in. This is requ
133c0 69 72 65 64 20 62 65 63 61 75 73 65 20 74 68 65  ired because the
133d0 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
133e0 4d 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74 69  Movepage() routi
133f0 6e 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70  ne can leave a p
13400 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70  age in the .** p
13410 4e 65 78 74 46 72 65 65 2f 70 50 72 65 76 46 72  NextFree/pPrevFr
13420 65 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20  ee list that is 
13430 6e 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e  not a part of an
13440 79 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f  y hash-chain..*/
13450 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
13460 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67  inkHashChain(Pag
13470 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
13480 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  r *pPg){.  if( p
13490 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  Pg->pgno==0 ){. 
134a0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
134b0 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20  pNextHash==0 && 
134c0 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  pPg->pPrevHash==
134d0 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 );.    return;
134e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
134f0 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
13500 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
13510 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
13520 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d  ->pPrevHash;.  }
13530 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
13540 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73  vHash ){.    ass
13550 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61  ert( pPager->aHa
13560 73 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28  sh[pPg->pgno & (
13570 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
13580 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  ]!=pPg );.    pP
13590 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e  g->pPrevHash->pN
135a0 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
135b0 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73  NextHash;.  }els
135c0 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70  e{.    int h = p
135d0 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67  Pg->pgno & (pPag
135e0 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20  er->nHash-1);.  
135f0 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
13600 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48  h] = pPg->pNextH
13610 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d  ash;.  }.  if( M
13620 45 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61  EMDB ){.    clea
13630 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54  rHistory(PGHDR_T
13640 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
13650 65 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  er));.  }.  pPg-
13660 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67  >pgno = 0;.  pPg
13670 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
13680 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
13690 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
136a0 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  k a page from th
136b0 65 20 66 72 65 65 20 6c 69 73 74 20 28 74 68 65  e free list (the
136c0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   list of all pag
136d0 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30  es where nRef==0
136e0 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74  ).** and from it
136f0 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e  s hash collision
13700 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69   chain..*/.stati
13710 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67  c void unlinkPag
13720 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
13730 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
13740 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20   pPg->pPager;.. 
13750 20 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69   /* Keep the pFi
13760 72 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65  rstSynced pointe
13770 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  r pointing at th
13780 65 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e  e first synchron
13790 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69  ized page */.  i
137a0 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e  f( pPg==pPager->
137b0 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a  pFirstSynced ){.
137c0 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70      PgHdr *p = p
137d0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
137e0 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70     while( p && p
137f0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20  ->needSync ){ p 
13800 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20  = p->pNextFree; 
13810 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  }.    pPager->pF
13820 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
13830 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b    }..  /* Unlink
13840 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
13850 73 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  st */.  if( pPg-
13860 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20  >pPrevFree ){.  
13870 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
13880 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
13890 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
138a0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
138b0 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  t( pPager->pFirs
138c0 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
138d0 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
138e0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
138f0 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
13900 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70  extFree ){.    p
13910 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70  Pg->pNextFree->p
13920 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e  PrevFree = pPg->
13930 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c  pPrevFree;.  }el
13940 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
13950 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70  pPager->pLast==p
13960 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Pg );.    pPager
13970 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70  ->pLast = pPg->p
13980 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20  PrevFree;.  }.  
13990 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  pPg->pNextFree =
139a0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
139b0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  = 0;..  /* Unlin
139c0 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20  k from the pgno 
139d0 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
139e0 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
139f0 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a  pPager, pPg);.}.
13a00 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
13a10 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 74  ine is used to t
13a20 72 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68  runcate the cach
13a30 65 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73  e when a databas
13a40 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61 74 65  e.** is truncate
13a50 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20 74 68  d.  Drop from th
13a60 65 20 63 61 63 68 65 20 61 6c 6c 20 70 61 67 65  e cache all page
13a70 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a  s whose pgno is.
13a80 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  ** larger than p
13a90 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e  Pager->dbSize an
13aa0 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65  d is unreference
13ab0 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e  d..**.** Referen
13ac0 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72  ced pages larger
13ad0 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
13ae0 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  Size are zeroed.
13af0 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  .**.** Actually,
13b00 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68   at the point th
13b10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
13b20 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64 20 62  lled, it would b
13b30 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  e.** an error to
13b40 20 68 61 76 65 20 61 20 72 65 66 65 72 65 6e 63   have a referenc
13b50 65 64 20 70 61 67 65 2e 20 20 42 75 74 20 72 61  ed page.  But ra
13b60 74 68 65 72 20 74 68 61 6e 20 64 65 6c 65 74 65  ther than delete
13b70 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 61 6e  .** that page an
13b80 64 20 67 75 61 72 61 6e 74 65 65 20 61 20 73 75  d guarantee a su
13b90 62 73 65 71 75 65 6e 74 20 73 65 67 66 61 75 6c  bsequent segfaul
13ba0 74 2c 20 69 74 20 73 65 65 6d 73 20 62 65 74 74  t, it seems bett
13bb0 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74  er.** to zero it
13bc0 20 61 6e 64 20 68 6f 70 65 20 74 68 61 74 20 77   and hope that w
13bd0 65 20 65 72 72 6f 72 20 6f 75 74 20 73 61 6e 65  e error out sane
13be0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
13bf0 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  id pager_truncat
13c00 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70  e_cache(Pager *p
13c10 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
13c20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a  *pPg;.  PgHdr **
13c30 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69  ppPg;.  int dbSi
13c40 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
13c50 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26  ize;..  ppPg = &
13c60 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20  pPager->pAll;.  
13c70 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70  while( (pPg = *p
13c80 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  pPg)!=0 ){.    i
13c90 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62  f( pPg->pgno<=db
13ca0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70  Size ){.      pp
13cb0 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74  Pg = &pPg->pNext
13cc0 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  All;.    }else i
13cd0 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  f( pPg->nRef>0 )
13ce0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
13cf0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
13d00 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  ), 0, pPager->pa
13d10 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  geSize);.      p
13d20 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
13d30 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tAll;.    }else{
13d40 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70  .      *ppPg = p
13d50 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
13d60 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
13d70 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20 70  FREE %p %d\n", p
13d80 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
13d90 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  ));.      PAGER_
13da0 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
13db0 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29  er_pgfree_count)
13dc0 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61  ;.      unlinkPa
13dd0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 6d  ge(pPg);.      m
13de0 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
13df0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
13e00 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50  e(pPg);.      pP
13e10 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20  ager->nPage--;. 
13e20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
13e30 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
13e40 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65  a lock on a file
13e50 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  .  Invoke the bu
13e60 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
13e70 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75  he lock.** is cu
13e80 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69  rrently not avai
13e90 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75  lable.  Repeat u
13ea0 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
13eb0 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a  llback returns.*
13ec0 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c  * false or until
13ed0 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
13ee0 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
13ef0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
13f00 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
13f10 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
13f20 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
13f30 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  he lock..*/.stat
13f40 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
13f50 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
13f60 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
13f70 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
13f80 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c  ;..  /* The OS l
13f90 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ock values must 
13fa0 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
13fb0 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61  he Pager lock va
13fc0 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  lues */.  assert
13fd0 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d  ( PAGER_SHARED==
13fe0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
13ff0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52   assert( PAGER_R
14000 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45  ESERVED==RESERVE
14010 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
14020 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rt( PAGER_EXCLUS
14030 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  IVE==EXCLUSIVE_L
14040 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  OCK );..  /* If 
14050 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72  the file is curr
14060 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74  ently unlocked t
14070 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73  hen the size mus
14080 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a  t be unknown */.
14090 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
140a0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
140b0 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  HARED || pPager-
140c0 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d  >dbSize<0 || MEM
140d0 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  DB );..  if( pPa
140e0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b  ger->state>=lock
140f0 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  type ){.    rc =
14100 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
14110 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  lse{.    do {.  
14120 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14130 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
14140 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  d, locktype);.  
14150 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
14160 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c  LITE_BUSY && sql
14170 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
14180 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
14190 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20  usyHandler) );. 
141a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
141b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
141c0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f  ager->state = lo
141d0 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f  cktype;.      IO
141e0 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20  TRACE(("LOCK %p 
141f0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c  %d\n", pPager, l
14200 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a  ocktype)).    }.
14210 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
14220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
14230 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74  te the file to t
14240 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
14250 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f  es specified..*/
14260 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
14270 72 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  rTruncate(Pager 
14280 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
14290 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  age){.  int rc;.
142a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
142b0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
142c0 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29  HARED || MEMDB )
142d0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
142e0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
142f0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
14300 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
14310 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
14320 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Code;.    return
14330 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   rc;.  }.  if( n
14340 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29  Page>=(unsigned)
14350 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
14360 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
14370 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
14380 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
14390 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
143a0 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72  nPage;.    pager
143b0 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
143c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
143d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
143e0 20 7d 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28   }.  pagerEnter(
143f0 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20  pPager);.  rc = 
14400 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
14410 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  er);.  pagerLeav
14420 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
14430 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14440 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
14450 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61  .  }..  /* Get a
14460 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
14470 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
14480 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69   before truncati
14490 6e 67 2e 20 2a 2f 0a 20 20 70 61 67 65 72 45 6e  ng. */.  pagerEn
144a0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ter(pPager);.  r
144b0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
144c0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
144d0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
144e0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
144f0 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
14500 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14510 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
14520 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72  .  rc = pager_tr
14530 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
14540 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Page);.  return 
14550 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
14560 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
14570 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
14580 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
14590 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
145a0 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
145b0 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
145c0 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
145d0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
145e0 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
145f0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
14600 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
14610 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
14620 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
14630 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
14640 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
14650 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
14660 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
14670 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
14680 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
14690 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
146a0 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
146b0 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
146c0 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
146d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
146e0 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
146f0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
14700 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
14710 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
14720 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
14730 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
14740 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
14750 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
14760 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
14770 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
14780 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
14790 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
147a0 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
147b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
147c0 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
147d0 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66  *pPager){.#ifdef
147e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
147f0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
14800 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b  .  if( !MEMDB ){
14810 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
14820 65 78 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c 69  ex *mutex = sqli
14830 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
14840 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
14850 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20 73  TIC_MEM2);.    s
14860 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
14870 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 69  er(mutex);.    i
14880 66 28 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76  f( pPager->pPrev
14890 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
148a0 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
148b0 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a   pPager->pNext;.
148c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
148d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
148e0 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78  t = pPager->pNex
148f0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
14900 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 29   pPager->pNext )
14910 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
14920 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
14930 50 61 67 65 72 2d 3e 70 50 72 65 76 3b 0a 20 20  Pager->pPrev;.  
14940 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
14950 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
14960 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  x);.  }.#endif..
14970 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
14980 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
14990 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  .  pPager->errCo
149a0 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  de = 0;.  pPager
149b0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
149c0 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73  = 0;.  pager_res
149d0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61  et(pPager);.  pa
149e0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
149f0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
14a00 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
14a10 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
14a20 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f  PAGERTRACE2("CLO
14a30 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
14a40 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f  D(pPager));.  IO
14a50 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70  TRACE(("CLOSE %p
14a60 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
14a70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
14a80 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67  errCode || (pPag
14a90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
14aa0 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  =0 && pPager->st
14ab0 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20  mtOpen==0) );.  
14ac0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
14ad0 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  nalOpen ){.    s
14ae0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
14af0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a  ager->jfd);.  }.
14b00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
14b10 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
14b20 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  l);.  if( pPager
14b30 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
14b40 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
14b50 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  (pPager->stfd);.
14b60 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43    }.  sqlite3OsC
14b70 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
14b80 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65  ;.  /* Temp file
14b90 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
14ba0 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74  lly deleted by t
14bb0 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70  he OS.  ** if( p
14bc0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
14bd0 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  ){.  **   sqlite
14be0 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
14bf0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
14c00 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c  ** }.  */..  sql
14c10 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
14c20 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c 69  ->aHash);.  sqli
14c30 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
14c40 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73  >pTmpSpace);.  s
14c50 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
14c60 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
14c70 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
14c80 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
14c90 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
14ca0 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
14cb0 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
14cc0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69  umber for the gi
14cd0 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  ven page data..*
14ce0 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
14cf0 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
14d00 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  Page *p){.  retu
14d10 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65  rn p->pgno;.}.#e
14d20 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
14d30 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74  page_ref() funct
14d40 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74  ion increments t
14d50 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
14d60 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a  nt for a page..*
14d70 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  * If the page is
14d80 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
14d90 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20  e freelist (the 
14da0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
14db0 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a  is zero) then.**
14dc0 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
14dd0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
14de0 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74  .** For non-test
14df0 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
14e00 65 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20  ef() is a macro 
14e10 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65  that calls _page
14e20 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65  _ref().** online
14e30 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
14e40 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e  e count is zero.
14e50 20 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65    For test syste
14e60 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a  ms, page_ref().*
14e70 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63  * is a real func
14e80 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20  tion so that we 
14e90 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69  can set breakpoi
14ea0 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74  nts and trace it
14eb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14ec0 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72   _page_ref(PgHdr
14ed0 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
14ee0 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
14ef0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73    /* The page is
14f00 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
14f10 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d  e freelist.  Rem
14f20 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69  ove it. */.    i
14f30 66 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61  f( pPg==pPg->pPa
14f40 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
14f50 64 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  d ){.      PgHdr
14f60 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74   *p = pPg->pNext
14f70 46 72 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c  Free;.      whil
14f80 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
14f90 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  ync ){ p = p->pN
14fa0 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20  extFree; }.     
14fb0 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46   pPg->pPager->pF
14fc0 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
14fd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
14fe0 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
14ff0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
15000 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
15010 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
15020 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15030 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
15040 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
15050 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  extFree;.    }. 
15060 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
15070 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  tFree ){.      p
15080 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70  Pg->pNextFree->p
15090 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e  PrevFree = pPg->
150a0 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d  pPrevFree;.    }
150b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
150c0 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d  >pPager->pLast =
150d0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
150e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
150f0 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
15100 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b    }.  pPg->nRef+
15110 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67  +;.  REFINFO(pPg
15120 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
15130 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69  TE_DEBUG.  stati
15140 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28  c void page_ref(
15150 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20  PgHdr *pPg){.   
15160 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
15170 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65  0 ){.      _page
15180 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d  _ref(pPg);.    }
15190 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
151a0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52  >nRef++;.      R
151b0 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20  EFINFO(pPg);.   
151c0 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64   }.  }.#else.# d
151d0 65 66 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50  efine page_ref(P
151e0 29 20 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d  )   ((P)->nRef==
151f0 30 3f 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28  0?_page_ref(P):(
15200 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b  void)(P)->nRef++
15210 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
15220 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
15230 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
15240 72 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69  r a page.  The i
15250 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a  nput pointer is.
15260 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ** a reference t
15270 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  o the page data.
15280 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
15290 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
152a0 70 50 67 29 7b 0a 20 20 70 61 67 65 72 45 6e 74  pPg){.  pagerEnt
152b0 65 72 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b  er(pPg->pPager);
152c0 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29  .  page_ref(pPg)
152d0 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
152e0 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 72  Pg->pPager);.  r
152f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
15310 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
15320 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b  other words, mak
15330 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70  e sure all the p
15340 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ages that have.*
15350 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  * been written t
15360 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  o the journal ha
15370 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63  ve actually reac
15380 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20  hed the surface 
15390 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20  of the.** disk. 
153a0 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   It is not safe 
153b0 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72  to modify the or
153c0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
153d0 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72  file until after
153e0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
153f0 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  has been synced.
15400 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61    If the origina
15410 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f  l database is mo
15420 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a  dified before.**
15430 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
15440 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77  synced and a pow
15450 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
15460 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  s, the unsynced 
15470 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20  journal.** data 
15480 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e  would be lost an
15490 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e  d we would be un
154a0 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65  able to complete
154b0 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a  ly rollback the.
154c0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
154d0 67 65 73 2e 20 20 44 61 74 61 62 61 73 65 20 63  ges.  Database c
154e0 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20  orruption would 
154f0 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  occur..** .** Th
15500 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
15510 75 70 64 61 74 65 73 20 74 68 65 20 6e 52 65 63  updates the nRec
15520 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65   field in the he
15530 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  ader of the jour
15540 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d  nal..** (See com
15550 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67  ments on the pag
15560 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
15570 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
15580 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
15590 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e  .).** If the syn
155a0 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20  c mode is FULL, 
155b0 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f  two syncs will o
155c0 63 63 75 72 2e 20 20 46 69 72 73 74 20 74 68 65  ccur.  First the
155d0 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a   whole journal.*
155e0 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65  * is synced, the
155f0 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
15600 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68 65   is updated, the
15610 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20  n a second sync 
15620 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  occurs..**.** Fo
15630 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
15640 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74  bases, we do not
15650 20 63 61 72 65 20 69 66 20 77 65 20 61 72 65 20   care if we are 
15660 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
15670 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65  .** after a powe
15680 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f  r failure, so no
15690 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
156a0 0a 2a 2a 20 49 66 20 74 68 65 20 49 4f 43 41 50  .** If the IOCAP
156b0 5f 53 45 51 55 45 4e 54 49 41 4c 20 66 6c 61 67  _SEQUENTIAL flag
156c0 20 69 73 20 73 65 74 20 66 6f 72 20 74 68 65 20   is set for the 
156d0 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
156e0 20 6f 6e 20 77 68 69 63 68 0a 2a 2a 20 74 68 65   on which.** the
156f0 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74 6f   database is sto
15700 72 65 64 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63  red, then OsSync
15710 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
15720 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
15730 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68  l.** file. In th
15740 69 73 20 63 61 73 65 20 61 6c 6c 20 74 68 61 74  is case all that
15750 20 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20   is required is 
15760 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 6e 52  to update the nR
15770 65 63 20 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74  ec field in.** t
15780 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
15790 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
157a0 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
157b0 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20   needSync field 
157c0 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75  of every page cu
157d0 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a  rrent held in.**
157e0 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
157f0 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
15800 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
15810 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
15820 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15830 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 53 79  TE_OK;...  /* Sy
15840 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  nc the journal b
15850 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20  efore modifying 
15860 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
15870 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67  e.  ** (assuming
15880 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72   there is a jour
15890 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73  nal and it needs
158a0 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a   to be synced.).
158b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
158c0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  r->needSync ){. 
158d0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
158e0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
158f0 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
15900 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
15910 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
15920 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73  r->fd);.      as
15930 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
15940 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20  urnalOpen );..  
15950 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21      /* assert( !
15960 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
15970 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68  ; // noSync migh
15980 74 20 62 65 20 73 65 74 20 69 66 20 73 79 6e 63  t be set if sync
15990 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a  hronous.      **
159a0 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20   was turned off 
159b0 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61  after the transa
159c0 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65  ction was starte
159d0 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35 20  d.  Ticket #615 
159e0 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
159f0 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  G.      {.      
15a00 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
15a10 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  he pPager->nRec 
15a20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b  counter we are k
15a30 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20  eeping agrees.  
15a40 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68        ** with th
15a50 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  e nRec computed 
15a60 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
15a70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
15a80 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
15a90 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20        i64 jSz;. 
15aa0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
15ab0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
15ac0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29  ager->jfd, &jSz)
15ad0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
15ae0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
15af0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15b00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15b10 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20  Off==jSz );.    
15b20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
15b30 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
15b40 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
15b50 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
15b60 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
15b70 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
15b80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
15b90 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
15ba0 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
15bb0 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
15bc0 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
15bd0 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
15be0 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
15bf0 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
15c00 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
15c10 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
15c20 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
15c30 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
15c40 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
15c50 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
15c60 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
15c70 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
15c80 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
15c90 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
15ca0 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
15cb0 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
15cc0 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
15cd0 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
15ce0 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
15cf0 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
15d00 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
15d10 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
15d20 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
15d30 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
15d40 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
15d50 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
15d60 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
15d70 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
15d80 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
15d90 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
15da0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
15db0 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
15dc0 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 72 6e  .        i64 jrn
15dd0 6c 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 66  lOff;.        if
15de0 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
15df0 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  nc && 0==(iDc&SQ
15e00 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
15e10 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
15e20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
15e30 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
15e40 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
15e50 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
15e60 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
15e70 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
15e80 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63  r)).          rc
15e90 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
15ea0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
15eb0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
15ec0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
15ed0 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
15ee0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
15ef0 20 20 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d         jrnlOff =
15f00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15f10 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f  Hdr + sizeof(aJo
15f20 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20  urnalMagic);.   
15f30 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
15f40 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
15f50 22 2c 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f  ", pPager, jrnlO
15f60 66 66 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20  ff, 4));.       
15f70 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
15f80 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
15f90 72 6e 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e  rnlOff, pPager->
15fa0 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69  nRec);.        i
15fb0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
15fc0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
15fd0 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
15fe0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
15ff0 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
16000 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59   PAGERTRACE2("SY
16010 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
16020 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
16030 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 49  ger));.        I
16040 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
16050 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
16060 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16070 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
16080 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
16090 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20  ync_flags| .    
160a0 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73        (pPager->s
160b0 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54  ync_flags==SQLIT
160c0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49  E_SYNC_FULL?SQLI
160d0 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
160e0 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  :0).        );. 
160f0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
16100 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
16110 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
16120 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
16130 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
16140 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
16150 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
16160 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79  Erase the needSy
16170 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65  nc flag from eve
16180 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  ry page..    */.
16190 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
161a0 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
161b0 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
161c0 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  ){.      pPg->ne
161d0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
161e0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  }.    pPager->pF
161f0 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61  irstSynced = pPa
16200 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d  ger->pFirst;.  }
16210 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
16220 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67  .  /* If the Pag
16230 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
16240 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74   is clear then t
16250 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
16260 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74  c.  ** flag must
16270 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66   also be clear f
16280 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56  or all pages.  V
16290 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 0a  erify that this.
162a0 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69    ** invariant i
162b0 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65  s true..  */.  e
162c0 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67  lse{.    for(pPg
162d0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
162e0 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
162f0 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73  xtAll){.      as
16300 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53  sert( pPg->needS
16310 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  ync==0 );.    }.
16320 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
16330 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
16340 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ==pPager->pFirst
16350 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
16360 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16370 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20  /*.** Merge two 
16380 6c 69 73 74 73 20 6f 66 20 70 61 67 65 73 20 63  lists of pages c
16390 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72  onnected by pDir
163a0 74 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f  ty and in pgno o
163b0 72 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20  rder..** Do not 
163c0 62 6f 74 68 20 66 69 78 69 6e 67 20 74 68 65 20  both fixing the 
163d0 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74  pPrevDirty point
163e0 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ers..*/.static P
163f0 67 48 64 72 20 2a 6d 65 72 67 65 5f 70 61 67 65  gHdr *merge_page
16400 6c 69 73 74 28 50 67 48 64 72 20 2a 70 41 2c 20  list(PgHdr *pA, 
16410 50 67 48 64 72 20 2a 70 42 29 7b 0a 20 20 50 67  PgHdr *pB){.  Pg
16420 48 64 72 20 72 65 73 75 6c 74 2c 20 2a 70 54 61  Hdr result, *pTa
16430 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26 72  il;.  pTail = &r
16440 65 73 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20  esult;.  while( 
16450 70 41 20 26 26 20 70 42 20 29 7b 0a 20 20 20 20  pA && pB ){.    
16460 69 66 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d  if( pA->pgno<pB-
16470 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70  >pgno ){.      p
16480 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70  Tail->pDirty = p
16490 41 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d  A;.      pTail =
164a0 20 70 41 3b 0a 20 20 20 20 20 20 70 41 20 3d 20   pA;.      pA = 
164b0 70 41 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  pA->pDirty;.    
164c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
164d0 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b  il->pDirty = pB;
164e0 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70  .      pTail = p
164f0 42 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42  B;.      pB = pB
16500 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
16510 20 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a    }.  if( pA ){.
16520 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
16530 79 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20  y = pA;.  }else 
16540 69 66 28 20 70 42 20 29 7b 0a 20 20 20 20 70 54  if( pB ){.    pT
16550 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42  ail->pDirty = pB
16560 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
16570 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30  Tail->pDirty = 0
16580 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
16590 65 73 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a  esult.pDirty;.}.
165a0 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20  ./*.** Sort the 
165b0 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  list of pages in
165c0 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
165d0 20 62 79 20 70 67 6e 6f 2e 20 20 50 61 67 65 73   by pgno.  Pages
165e0 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65   are.** connecte
165f0 64 20 62 79 20 70 44 69 72 74 79 20 70 6f 69 6e  d by pDirty poin
16600 74 65 72 73 2e 20 20 54 68 65 20 70 50 72 65 76  ters.  The pPrev
16610 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 20 61  Dirty pointers a
16620 72 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 20  re.** corrupted 
16630 62 79 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f  by this sort..*/
16640 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f  .#define N_SORT_
16650 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a  BUCKET_ALLOC 25.
16660 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42  #define N_SORT_B
16670 55 43 4b 45 54 20 20 20 20 20 20 20 32 35 0a 23  UCKET       25.#
16680 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
16690 54 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  T.  int sqlite3_
166a0 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63  pager_n_sort_buc
166b0 6b 65 74 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65  ket = 0;.  #unde
166c0 66 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a  f N_SORT_BUCKET.
166d0 20 20 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54    #define N_SORT
166e0 5f 42 55 43 4b 45 54 20 5c 0a 20 20 20 28 73 71  _BUCKET \.   (sq
166f0 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f  lite3_pager_n_so
16700 72 74 5f 62 75 63 6b 65 74 3f 73 71 6c 69 74 65  rt_bucket?sqlite
16710 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62  3_pager_n_sort_b
16720 75 63 6b 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43  ucket:N_SORT_BUC
16730 4b 45 54 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69  KET_ALLOC).#endi
16740 66 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  f.static PgHdr *
16750 73 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 50 67  sort_pagelist(Pg
16760 48 64 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48  Hdr *pIn){.  PgH
16770 64 72 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43  dr *a[N_SORT_BUC
16780 4b 45 54 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a  KET_ALLOC], *p;.
16790 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65    int i;.  memse
167a0 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  t(a, 0, sizeof(a
167b0 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e  ));.  while( pIn
167c0 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b   ){.    p = pIn;
167d0 0a 20 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44  .    pIn = p->pD
167e0 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69  irty;.    p->pDi
167f0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  rty = 0;.    for
16800 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42  (i=0; i<N_SORT_B
16810 55 43 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20  UCKET-1; i++){. 
16820 20 20 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30       if( a[i]==0
16830 20 29 7b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d   ){.        a[i]
16840 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62 72   = p;.        br
16850 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
16860 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 6d 65  {.        p = me
16870 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69  rge_pagelist(a[i
16880 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 61  ], p);.        a
16890 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
168a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
168b0 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d  ==N_SORT_BUCKET-
168c0 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f  1 ){.      /* Co
168d0 76 65 72 61 67 65 3a 20 54 6f 20 67 65 74 20 68  verage: To get h
168e0 65 72 65 2c 20 74 68 65 72 65 20 6e 65 65 64 20  ere, there need 
168f0 74 6f 20 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f  to be 2^(N_SORT_
16900 42 55 43 4b 45 54 29 20 0a 20 20 20 20 20 20 2a  BUCKET) .      *
16910 2a 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  * elements in th
16920 65 20 69 6e 70 75 74 20 6c 69 73 74 2e 20 54 68  e input list. Th
16930 69 73 20 69 73 20 70 6f 73 73 69 62 6c 65 2c 20  is is possible, 
16940 62 75 74 20 69 6d 70 72 61 63 74 69 63 61 6c 2e  but impractical.
16950 0a 20 20 20 20 20 20 2a 2a 20 54 65 73 74 69 6e  .      ** Testin
16960 67 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 74  g this line is t
16970 68 65 20 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62  he point of glob
16980 61 6c 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  al variable.    
16990 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 61 67    ** sqlite3_pag
169a0 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74  er_n_sort_bucket
169b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
169c0 20 61 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61   a[i] = merge_pa
169d0 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b  gelist(a[i], p);
169e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d  .    }.  }.  p =
169f0 20 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31   a[0];.  for(i=1
16a00 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ; i<N_SORT_BUCKE
16a10 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  T; i++){.    p =
16a20 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28   merge_pagelist(
16a30 70 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  p, a[i]);.  }.  
16a40 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
16a50 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20  ** Given a list 
16a60 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63  of pages (connec
16a70 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72  ted by the PgHdr
16a80 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29  .pDirty pointer)
16a90 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20   write.** every 
16aa0 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
16ab0 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  es out to the da
16ac0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
16ad0 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a  mark them all.**
16ae0 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74   as clean..*/.st
16af0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
16b00 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67  rite_pagelist(Pg
16b10 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50  Hdr *pList){.  P
16b20 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
16b30 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 6e 74 20  PgHdr *p;.  int 
16b40 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  rc;..  if( pList
16b50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
16b60 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
16b70 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72   = pList->pPager
16b80 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
16b90 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
16ba0 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45  be either a RESE
16bb0 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
16bc0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  E lock on the.  
16bd0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
16be0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  . If there is al
16bf0 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49  ready an EXCLUSI
16c00 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c  VE lock, the fol
16c10 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c  lowing.  ** call
16c20 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f  s to sqlite3OsLo
16c30 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  ck() are no-ops.
16c40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
16c50 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
16c60 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
16c70 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
16c80 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
16c90 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
16ca0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
16cb0 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
16cc0 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
16cd0 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
16ce0 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
16cf0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
16d00 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
16d10 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
16d20 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
16d30 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
16d40 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
16d50 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
16d60 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
16d70 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
16d80 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
16d90 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
16da0 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
16db0 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
16dc0 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
16dd0 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
16de0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
16df0 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
16e00 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
16e10 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
16e20 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
16e30 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
16e40 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
16e50 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
16e60 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
16e70 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
16e80 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
16e90 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
16ea0 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
16eb0 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
16ec0 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
16ed0 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
16ee0 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
16ef0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
16f00 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
16f10 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
16f20 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72  E_LOCK);.  if( r
16f30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16f40 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16f50 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f   }..  pList = so
16f60 72 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69 73  rt_pagelist(pLis
16f70 74 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73  t);.  for(p=pLis
16f80 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  t; p; p=p->pDirt
16f90 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y){.    assert( 
16fa0 70 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  p->dirty );.    
16fb0 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  p->dirty = 0;.  
16fc0 7d 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74  }.  while( pList
16fd0 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   ){..    /* If t
16fe0 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  he file has not 
16ff0 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
17000 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f   open it now. */
17010 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
17020 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
17030 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  {.      assert(p
17040 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
17050 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
17060 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d  ite3PagerOpentem
17070 70 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  p(pPager->pVfs, 
17080 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
17090 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
170a0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
170b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
170c0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
170d0 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
170e0 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
170f0 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
17100 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
17110 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
17120 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
17130 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
17140 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c  uncate() was cal
17150 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
17160 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
17170 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
17180 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
17190 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
171a0 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
171b0 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
171c0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
171d0 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
171e0 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
171f0 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
17200 66 73 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70  fset = (pList->p
17210 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
17220 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
17230 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20      char *pData 
17240 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
17250 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
17260 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67  List), pList->pg
17270 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 50 41  no, 6);.      PA
17280 47 45 52 54 52 41 43 45 34 28 22 53 54 4f 52 45  GERTRACE4("STORE
17290 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
172a0 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
172b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
172c0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
172d0 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67 65  List->pgno, page
172e0 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
172f0 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
17300 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c  E(("PGOUT %p %d\
17310 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69 73  n", pPager, pLis
17320 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  t->pgno));.     
17330 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
17340 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
17350 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
17360 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
17370 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
17380 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
17390 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
173a0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
173b0 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74  CR(pPager->nWrit
173c0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  e);.      if( pL
173d0 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a  ist->pgno==1 ){.
173e0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
173f0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
17400 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
17410 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
17420 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
17430 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
17440 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c  ef NDEBUG.    el
17450 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
17460 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25  RACE3("NOSTORE %
17470 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
17480 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
17490 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
174a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
174b0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
174c0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
174d0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
174e0 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
174f0 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
17500 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
17510 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
17520 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20  t->pDirty;.  }. 
17530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17540 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c  K;.}../*.** Coll
17550 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20  ect every dirty 
17560 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74  page into a dirt
17570 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65  y list and.** re
17580 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
17590 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
175a0 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61  at list.  All pa
175b0 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65  ges are.** colle
175c0 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  cted even if the
175d0 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75  y are still in u
175e0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  se..*/.static Pg
175f0 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61  Hdr *pager_get_a
17600 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50  ll_dirty_pages(P
17610 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
17620 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
17630 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pDirty;.}../*.**
17640 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
17650 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
17660 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69  ournal on the gi
17670 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20  ven pager..** A 
17680 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
17690 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ne that needs to
176a0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
176b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
176c0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
176d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
176e0 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
176f0 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
17700 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
17710 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
17720 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
17730 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
17740 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
17750 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20  ame name.  Just 
17760 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
17770 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  al..*/.static in
17780 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
17790 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
177a0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
177b0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
177c0 66 73 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  fs;.  if( !pPage
177d0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20  r->useJournal ) 
177e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
177f0 21 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73  !sqlite3OsAccess
17800 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
17810 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
17820 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 20 29  ACCESS_EXISTS) )
17830 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
17840 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
17850 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
17860 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29  Lock(pPager->fd)
17870 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
17880 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
17890 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
178a0 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a  t(pPager)==0 ){.
178b0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
178c0 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72  ete(pVfs, pPager
178d0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
178e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
178f0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
17900 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
17910 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20  * Try to find a 
17920 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
17930 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65  e that can be re
17940 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  cycled. .**.** T
17950 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
17960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
17970 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c  ERR, SQLITE_FULL
17980 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49   or SQLITE_OK. I
17990 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73  t .** does not s
179a0 65 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65  et the pPager->e
179b0 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e  rrCode variable.
179c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
179d0 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61 67  ager_recycle(Pag
179e0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
179f0 73 79 6e 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a  syncOk, PgHdr **
17a00 70 70 50 67 29 7b 0a 20 20 50 67 48 64 72 20 2a  ppPg){.  PgHdr *
17a10 70 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30  pPg;.  *ppPg = 0
17a20 3b 0a 0a 20 20 61 73 73 65 72 74 28 21 4d 45 4d  ;..  assert(!MEM
17a30 44 42 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  DB);..  /* Find 
17a40 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c  a page to recycl
17a50 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74  e.  Try to locat
17a60 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f  e a page that do
17a70 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75  es not.  ** requ
17a80 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20  ire us to do an 
17a90 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a  fsync() on the j
17aa0 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70  ournal..  */.  p
17ab0 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  Pg = pPager->pFi
17ac0 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a  rstSynced;..  /*
17ad0 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74   If we could not
17ae0 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61   find a page tha
17af0 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  t does not requi
17b00 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20  re an fsync().  
17b10 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ** on the journa
17b20 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e  l file then fsyn
17b30 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
17b40 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20  le.  This is a. 
17b50 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70   ** very slow op
17b60 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77  eration, so we w
17b70 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69  ork hard to avoi
17b80 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74  d it.  But somet
17b90 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e  imes.  ** it can
17ba0 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20  't be helped..  
17bb0 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20  */.  if( pPg==0 
17bc0 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  && pPager->pFirs
17bd0 74 20 26 26 20 73 79 6e 63 4f 6b 20 26 26 20 21  t && syncOk && !
17be0 4d 45 4d 44 42 29 7b 0a 20 20 20 20 69 6e 74 20  MEMDB){.    int 
17bf0 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
17c00 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
17c10 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
17c20 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  ;.    int rc = s
17c30 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
17c40 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
17c50 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
17c60 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
17c70 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
17c80 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26  Sync && 0==(iDc&
17c90 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
17ca0 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
17cb0 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c     /* If in full
17cc0 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74  -sync mode, writ
17cd0 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  e a new journal 
17ce0 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a  header into the.
17cf0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
17d00 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64   file. This is d
17d10 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65  one to avoid eve
17d20 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f  r modifying a jo
17d30 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68  urnal.      ** h
17d40 65 61 64 65 72 20 74 68 61 74 20 69 73 20 69 6e  eader that is in
17d50 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f  volved in the ro
17d60 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20  llback of pages 
17d70 74 68 61 74 20 68 61 76 65 0a 20 20 20 20 20 20  that have.      
17d80 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
17d90 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
17da0 61 74 61 62 61 73 65 20 28 69 6e 20 63 61 73 65  atabase (in case
17db0 20 74 68 65 20 68 65 61 64 65 72 20 69 73 0a 20   the header is. 
17dc0 20 20 20 20 20 2a 2a 20 74 72 61 73 68 65 64 20       ** trashed 
17dd0 77 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  when the nRec fi
17de0 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 29 2e  eld is updated).
17df0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17e00 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
17e10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17e20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
17e30 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20  ff > 0 );.      
17e40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17e50 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a  doNotSync==0 );.
17e60 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
17e70 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
17e80 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
17e90 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
17ea0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17eb0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20  }.    }.    pPg 
17ec0 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
17ed0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d  ;.  }.  if( pPg=
17ee0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
17ef0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
17f00 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
17f10 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nRef==0 );..  /*
17f20 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
17f30 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
17f40 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69  file if it is di
17f50 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rty..  */.  if( 
17f60 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  pPg->dirty ){.  
17f70 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73    int rc;.    as
17f80 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53  sert( pPg->needS
17f90 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61  ync==0 );.    ma
17fa0 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
17fb0 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
17fc0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74  ;.    pPg->pDirt
17fd0 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  y = 0;.    rc = 
17fe0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
17ff0 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20  list( pPg );.   
18000 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
18010 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
18020 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18030 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
18040 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
18050 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a  Pg->dirty==0 );.
18060 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
18070 65 20 77 65 20 61 72 65 20 72 65 63 79 63 6c 69  e we are recycli
18080 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ng is marked as 
18090 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20  alwaysRollback, 
180a0 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68  then.  ** set th
180b0 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52  e global alwaysR
180c0 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68  ollback flag, th
180d0 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  us disabling the
180e0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
180f0 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
18100 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
18110 72 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  r the rest of th
18120 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
18130 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73    ** It is neces
18140 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20  sary to do this 
18150 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
18160 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
18170 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68  llback.  ** migh
18180 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74  t be reloaded at
18190 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75   a later time bu
181a0 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  t at that point 
181b0 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65  we won't remembe
181c0 72 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77  r.  ** that is w
181d0 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73  as marked always
181e0 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20  Rollback.  This 
181f0 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70  means that all p
18200 61 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62  ages must.  ** b
18210 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61  e marked as alwa
18220 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  ysRollback from 
18230 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a  here on out..  *
18240 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77  /.  if( pPg->alw
18250 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20  aysRollback ){. 
18260 20 20 20 49 4f 54 52 41 43 45 28 28 22 41 4c 57     IOTRACE(("ALW
18270 41 59 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c  AYS_ROLLBACK %p\
18280 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
18290 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
182a0 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d  ollback = 1;.  }
182b0 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68  ..  /* Unlink th
182c0 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20  e old page from 
182d0 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e  the free list an
182e0 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  d the hash table
182f0 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61  .  */.  unlinkPa
18300 67 65 28 70 50 67 29 3b 0a 20 20 61 73 73 65 72  ge(pPg);.  asser
18310 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20  t( pPg->pgno==0 
18320 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50  );..  *ppPg = pP
18330 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  g;.  return SQLI
18340 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
18350 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
18360 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
18370 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
18380 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
18390 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c 75 6f  o free superfluo
183a0 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61  us dynamically a
183b0 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a  llocated memory.
183c0 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65 20 70  ** held by the p
183d0 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d 65 6d  ager system. Mem
183e0 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 61 6e  ory in use by an
183f0 79 20 53 51 4c 69 74 65 20 70 61 67 65 72 20 61  y SQLite pager a
18400 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74  llocated.** by t
18410 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
18420 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74 65 33  d may be sqlite3
18430 5f 66 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a  _free()ed..**.**
18440 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d   nReq is the num
18450 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
18460 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e  memory required.
18470 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20   Once this much 
18480 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65  has.** been rele
18490 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69  ased, the functi
184a0 6f 6e 20 72 65 74 75 72 6e 73 2e 20 54 68 65 20  on returns. The 
184b0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
184c0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
184d0 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66   .** of bytes of
184e0 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64   memory released
184f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18500 50 61 67 65 72 52 65 6c 65 61 73 65 4d 65 6d 6f  PagerReleaseMemo
18510 72 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20 20  ry(int nReq){.  
18520 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d 20  int nReleased = 
18530 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  0;          /* B
18540 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72  ytes of memory r
18550 65 6c 65 61 73 65 64 20 73 6f 20 66 61 72 20 2a  eleased so far *
18560 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
18570 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 20  x *mutex;       
18580 2f 2a 20 54 68 65 20 4d 45 4d 32 20 6d 75 74 65  /* The MEM2 mute
18590 78 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50  x */.  Pager *pP
185a0 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
185b0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
185c0 67 20 6f 76 65 72 20 70 61 67 65 72 73 20 2a 2f  g over pagers */
185d0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
185e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
185f0 2a 20 50 61 73 73 65 73 20 6f 76 65 72 20 70 61  * Passes over pa
18600 67 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63  gers */..  /* Ac
18610 71 75 69 72 65 20 74 68 65 20 6d 65 6d 6f 72 79  quire the memory
18620 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 6d 75 74 65  -management mute
18630 78 0a 20 20 2a 2f 0a 20 20 6d 75 74 65 78 20 3d  x.  */.  mutex =
18640 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
18650 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
18660 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a  X_STATIC_MEM2);.
18670 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
18680 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 0a 20  enter(mutex);.. 
18690 20 2f 2a 20 53 69 67 6e 61 6c 20 61 6c 6c 20 64   /* Signal all d
186a0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
186b0 6f 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20  ons that memory 
186c0 6d 61 6e 61 67 65 6d 65 6e 74 20 77 61 6e 74 73  management wants
186d0 0a 20 20 2a 2a 20 74 6f 20 68 61 76 65 20 61 63  .  ** to have ac
186e0 63 65 73 73 20 74 6f 20 74 68 65 20 70 61 67 65  cess to the page
186f0 72 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  rs..  */.  for(p
18700 50 61 67 65 72 3d 73 71 6c 69 74 65 33 50 61 67  Pager=sqlite3Pag
18710 65 72 4c 69 73 74 3b 20 70 50 61 67 65 72 3b 20  erList; pPager; 
18720 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70  pPager=pPager->p
18730 4e 65 78 74 29 7b 0a 20 20 20 20 20 70 50 61 67  Next){.     pPag
18740 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 31  er->iInUseMM = 1
18750 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75 74 65  ;.  }..  /* Oute
18760 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75 6e 73 20  rmost loop runs 
18770 66 6f 72 20 61 74 20 6d 6f 73 74 20 74 77 6f 20  for at most two 
18780 69 74 65 72 61 74 69 6f 6e 73 2e 20 46 69 72 73  iterations. Firs
18790 74 20 69 74 65 72 61 74 69 6f 6e 20 77 65 0a 20  t iteration we. 
187a0 20 2a 2a 20 74 72 79 20 74 6f 20 66 69 6e 64 20   ** try to find 
187b0 6d 65 6d 6f 72 79 20 74 68 61 74 20 63 61 6e 20  memory that can 
187c0 62 65 20 72 65 6c 65 61 73 65 64 20 77 69 74 68  be released with
187d0 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e  out calling fsyn
187e0 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20 20 2a 2a  c(). Second.  **
187f0 20 69 74 65 72 61 74 69 6f 6e 20 28 77 68 69 63   iteration (whic
18800 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69 66 20 74  h only runs if t
18810 68 65 20 66 69 72 73 74 20 66 61 69 6c 65 64 20  he first failed 
18820 74 6f 20 66 72 65 65 20 6e 52 65 71 20 62 79 74  to free nReq byt
18830 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d 6f 72  es of.  ** memor
18840 79 29 20 69 73 20 70 65 72 6d 69 74 74 65 64 20  y) is permitted 
18850 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63 28 29 2e  to call fsync().
18860 20 54 68 69 73 20 69 73 20 6f 66 20 63 6f 75 72   This is of cour
18870 73 65 20 6d 75 63 68 20 6d 6f 72 65 20 0a 20 20  se much more .  
18880 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e 0a 20 20  ** expensive..  
18890 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
188a0 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f  =1; i++){..    /
188b0 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
188c0 6c 6c 20 74 68 65 20 53 51 4c 69 74 65 20 70 61  ll the SQLite pa
188d0 67 65 72 73 20 6f 70 65 6e 65 64 20 62 79 20 74  gers opened by t
188e0 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
188f0 64 2e 20 2a 2f 0a 20 20 20 20 50 61 67 65 72 20  d. */.    Pager 
18900 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65  *pPager = sqlite
18910 33 50 61 67 65 72 4c 69 73 74 3b 0a 20 20 20 20  3PagerList;.    
18920 66 6f 72 28 20 3b 20 70 50 61 67 65 72 20 26 26  for( ; pPager &&
18930 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c   (nReq<0 || nRel
18940 65 61 73 65 64 3c 6e 52 65 71 29 3b 20 70 50 61  eased<nReq); pPa
18950 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78  ger=pPager->pNex
18960 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20  t){.      PgHdr 
18970 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e 74 20  *pPg;.      int 
18980 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18990 0a 20 20 20 20 20 20 2f 2a 20 49 6e 2d 6d 65 6d  .      /* In-mem
189a0 6f 72 79 20 64 61 74 61 62 61 73 65 73 20 73 68  ory databases sh
189b0 6f 75 6c 64 20 6e 6f 74 20 61 70 70 65 61 72 20  ould not appear 
189c0 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6c 69 73  on the pager lis
189d0 74 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  t */.      asser
189e0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20  t( !MEMDB );..  
189f0 20 20 20 20 2f 2a 20 53 6b 69 70 20 70 61 67 65      /* Skip page
18a00 72 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72  rs that are curr
18a10 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 62 79 20  ently in use by 
18a20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
18a30 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
18a40 61 67 65 72 2d 3e 69 49 6e 55 73 65 44 42 20 29  ager->iInUseDB )
18a50 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
18a60 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 70 61    /* For each pa
18a70 67 65 72 2c 20 74 72 79 20 74 6f 20 66 72 65 65  ger, try to free
18a80 20 61 73 20 6d 61 6e 79 20 70 61 67 65 73 20 61   as many pages a
18a90 73 20 70 6f 73 73 69 62 6c 65 20 28 77 69 74 68  s possible (with
18aa0 6f 75 74 20 0a 20 20 20 20 20 20 2a 2a 20 63 61  out .      ** ca
18ab0 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29 20 69 66  lling fsync() if
18ac0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
18ad0 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
18ae0 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 0a 20  the outermost . 
18af0 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 29 2e 0a 20       ** loop).. 
18b00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 68       */.      wh
18b10 69 6c 65 28 20 28 6e 52 65 71 3c 30 20 7c 7c 20  ile( (nReq<0 || 
18b20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29 20  nReleased<nReq) 
18b30 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
18b40 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
18b50 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
18b60 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29 29  Pager, i, &pPg))
18b70 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
18b80 20 70 50 67 0a 20 20 20 20 20 20 29 20 7b 0a 20   pPg.      ) {. 
18b90 20 20 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20         /* We've 
18ba0 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20  found a page to 
18bb0 66 72 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f  free. At this po
18bc0 69 6e 74 20 74 68 65 20 70 61 67 65 20 68 61 73  int the page has
18bd0 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20 2a   been .        *
18be0 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  * removed from t
18bf0 68 65 20 70 61 67 65 20 68 61 73 68 2d 74 61 62  he page hash-tab
18c00 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  le, free-list an
18c10 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20  d synced-list . 
18c20 20 20 20 20 20 20 20 2a 2a 20 28 70 46 69 72 73         ** (pFirs
18c30 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69 73 20  tSynced). It is 
18c40 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c  still in the all
18c50 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20 6c 69   pages (pAll) li
18c60 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  st. .        ** 
18c70 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  Remove it from t
18c80 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72 65 20  his list before 
18c90 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20 20 20  freeing..       
18ca0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
18cb0 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65 20 50  odo: Check the P
18cc0 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73 74 20  ager.pStmt list 
18cd0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69  to make sure thi
18ce0 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20  s is Ok. It .   
18cf0 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79       ** probably
18d00 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20   is though..    
18d10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
18d20 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20  gHdr *pTmp;.    
18d30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 20      assert( pPg 
18d40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
18d50 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  Pg==pPager->pAll
18d60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 70   ){.           p
18d70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50  Pager->pAll = pP
18d80 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
18d90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18da0 20 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70 3d        for( pTmp=
18db0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 54  pPager->pAll; pT
18dc0 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50  mp->pNextAll!=pP
18dd0 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e  g; pTmp=pTmp->pN
18de0 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20 20  extAll ){}.     
18df0 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74       pTmp->pNext
18e00 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  All = pPg->pNext
18e10 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  All;.        }. 
18e20 20 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64         nReleased
18e30 20 2b 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20   += (.          
18e40 20 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b    sizeof(*pPg) +
18e50 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
18e60 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2b 20  e.            + 
18e70 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50  sizeof(u32) + pP
18e80 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20  ager->nExtra.   
18e90 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44 42           + MEMDB
18ea0 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72  *sizeof(PgHistor
18eb0 79 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  y) .        );. 
18ec0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
18ed0 22 50 47 46 52 45 45 20 25 70 20 25 64 20 2a 5c  "PGFREE %p %d *\
18ee0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
18ef0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20  >pgno));.       
18f00 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
18f10 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65  te3_pager_pgfree
18f20 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20  _count);.       
18f30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
18f40 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  g);.      }..   
18f50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18f60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18f70 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  /* An error occu
18f80 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69  red whilst writi
18f90 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
18fa0 73 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20  se file or .    
18fb0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69      ** journal i
18fc0 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  n pager_recycle(
18fd0 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  ). The error is 
18fe0 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20  not returned to 
18ff0 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
19000 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66  caller of this f
19010 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64  unction. Instead
19020 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
19030 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
19040 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  ..        ** The
19050 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72   error will be r
19060 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75  eturned to the u
19070 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69  ser (or users, i
19080 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20 20 20  n the case .    
19090 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72      ** of a shar
190a0 65 64 20 70 61 67 65 72 20 63 61 63 68 65 29 20  ed pager cache) 
190b0 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 6f 72  of the pager for
190c0 20 77 68 69 63 68 20 74 68 65 20 65 72 72 6f 72   which the error
190d0 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20   occured..      
190e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
190f0 65 72 74 28 0a 20 20 20 20 20 20 20 20 20 20 20  ert(.           
19100 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49   (rc&0xff)==SQLI
19110 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20  TE_IOERR ||.    
19120 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
19130 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
19140 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
19150 45 5f 42 55 53 59 0a 20 20 20 20 20 20 20 20 29  E_BUSY.        )
19160 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
19170 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
19180 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
19190 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  );.        pager
191a0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
191b0 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
191c0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  }.  }..  /* Clea
191d0 72 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 6e  r the memory man
191e0 61 67 65 6d 65 6e 74 20 66 6c 61 67 73 20 61 6e  agement flags an
191f0 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 6d 75  d release the mu
19200 74 65 78 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  tex.  */.  for(p
19210 50 61 67 65 72 3d 73 71 6c 69 74 65 33 50 61 67  Pager=sqlite3Pag
19220 65 72 4c 69 73 74 3b 20 70 50 61 67 65 72 3b 20  erList; pPager; 
19230 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70  pPager=pPager->p
19240 4e 65 78 74 29 7b 0a 20 20 20 20 20 70 50 61 67  Next){.     pPag
19250 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30  er->iInUseMM = 0
19260 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
19270 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
19280 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e  x);..  /* Return
19290 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
192a0 79 74 65 73 20 72 65 6c 65 61 73 65 64 0a 20 20  ytes released.  
192b0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 6c  */.  return nRel
192c0 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20  eased;.}.#endif 
192d0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
192e0 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
192f0 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  NT */../*.** Rea
19300 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  d the content of
19310 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66   page pPg out of
19320 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19330 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
19340 74 20 72 65 61 64 44 62 50 61 67 65 28 50 61 67  t readDbPage(Pag
19350 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
19360 72 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e  r *pPg, Pgno pgn
19370 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  o){.  int rc;.  
19380 69 36 34 20 6f 66 66 73 65 74 3b 0a 20 20 61 73  i64 offset;.  as
19390 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29  sert( MEMDB==0 )
193a0 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
193b0 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
193c0 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  |pPager->tempFil
193d0 65 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  e);.  if( !pPage
193e0 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
193f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
19400 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
19410 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20 6f 66 66  _READ;.  }.  off
19420 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
19430 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
19440 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Size;.  rc = sql
19450 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
19460 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f  r->fd, PGHDR_TO_
19470 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
19480 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
19490 73 65 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  set);.  PAGER_IN
194a0 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
194b0 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a  _readdb_count);.
194c0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
194d0 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49  ger->nRead);.  I
194e0 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70  OTRACE(("PGIN %p
194f0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
19500 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28 20 70 67  pgno));.  if( pg
19510 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d  no==1 ){.    mem
19520 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
19530 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29  ileVers, &((u8*)
19540 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
19550 67 29 29 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20  g))[24],.       
19560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19580 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 50         sizeof(pP
19590 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
195a0 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31  ));.  }.  CODEC1
195b0 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54  (pPager, PGHDR_T
195c0 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67  O_DATA(pPg), pPg
195d0 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 50 41  ->pgno, 3);.  PA
195e0 47 45 52 54 52 41 43 45 34 28 22 46 45 54 43 48  GERTRACE4("FETCH
195f0 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
19600 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
19610 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
19620 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
19630 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
19640 68 61 73 68 28 70 50 67 29 29 3b 0a 20 20 72 65  hash(pPg));.  re
19650 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
19660 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
19670 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
19680 74 61 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  tain the shared 
19690 6c 6f 63 6b 20 72 65 71 75 69 72 65 64 20 62 65  lock required be
196a0 66 6f 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79  fore.** data may
196b0 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
196c0 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
196d0 66 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  f the shared loc
196e0 6b 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  k has already.**
196f0 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20   been obtained, 
19700 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
19710 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
19720 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
19730 72 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  r obtaining the 
19740 73 68 61 72 65 64 20 6c 6f 63 6b 20 28 69 66 20  shared lock (if 
19750 72 65 71 75 69 72 65 64 29 2c 20 74 68 69 73 20  required), this 
19760 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63  function.** chec
19770 6b 73 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ks for a hot-jou
19780 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e  rnal file. If on
19790 65 20 69 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65  e is found, an e
197a0 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63  mergency rollbac
197b0 6b 0a 2a 2a 20 69 73 20 70 65 72 66 6f 72 6d 65  k.** is performe
197c0 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a  d immediately..*
197d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
197e0 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
197f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
19800 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19810 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  K;..  if( pPager
19820 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
19830 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73 71 6c  NLOCK ){.    sql
19840 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
19850 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
19860 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b     if( !MEMDB ){
19870 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19880 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  Pager->nRef==0 )
19890 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
198a0 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
198b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
198c0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
198d0 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
198e0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  D_LOCK);.       
198f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19900 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
19910 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
19920 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
19930 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19940 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19950 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f  ->state>=SHARED_
19960 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a  LOCK );.      }.
19970 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61    .      /* If a
19980 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
19990 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
199a0 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
199b0 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 20  ock on the.     
199c0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
199d0 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
199e0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
199f0 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
19a00 65 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  eted..      */. 
19a10 20 20 20 20 20 69 66 28 20 68 61 73 48 6f 74 4a       if( hasHotJ
19a20 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 20 29  ournal(pPager) )
19a30 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  {.        /* Get
19a40 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
19a50 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
19a60 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73  se file. At this
19a70 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20   point it is.   
19a80 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
19a90 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
19aa0 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
19ab0 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
19ac0 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  y to the.       
19ad0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
19ae0 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
19af0 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
19b00 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
19b10 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
19b20 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
19b30 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
19b40 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
19b50 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 20  that the.       
19b60 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
19b70 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
19b80 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
19b90 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
19ba0 20 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   it .        ** 
19bb0 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
19bc0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65 63   .        ** Bec
19bd0 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
19be0 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
19bf0 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
19c00 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20 20  sted, the.      
19c10 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63    ** second proc
19c20 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f 20  ess will get to 
19c30 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68  this point in th
19c40 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20  e code and fail 
19c50 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 62  to.        ** ob
19c60 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45 58  tain it's own EX
19c70 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
19c80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19c90 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
19ca0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19cb0 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
19cc0 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  >fd, EXCLUSIVE_L
19cd0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
19ce0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67  ){.          pag
19d00 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
19d10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
19d20 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
19d30 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
19d40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
19d50 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
19d60 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
19d70 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65   .        /* Ope
19d80 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  n the journal fo
19d90 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20  r reading only. 
19da0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   Return SQLITE_B
19db0 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 20 2a  USY if.        *
19dc0 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  * we are unable 
19dd0 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
19de0 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20 20  nal file. .     
19df0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
19e00 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
19e10 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  e does not need 
19e20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73  to be locked its
19e30 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20  elf.  The.      
19e40 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
19e50 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e 20  e is never open 
19e60 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e 20  unless the main 
19e70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  database file ho
19e80 6c 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  lds.        ** a
19e90 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20   write lock, so 
19ea0 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61  there is never a
19eb0 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f  ny chance of two
19ec0 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 20   or more.       
19ed0 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f 70   ** processes op
19ee0 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ening the journa
19ef0 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  l at the same ti
19f00 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  me..        **. 
19f10 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 74         ** Open t
19f20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
19f30 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
19f40 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
19f50 65 20 69 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  e in .        **
19f60 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
19f70 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20  s mode the file 
19f80 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
19f90 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64  be kept open and
19fa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
19fb0 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20  ibly used for a 
19fc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65  transaction late
19fd0 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79  r on. On some sy
19fe0 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20  stems, the.     
19ff0 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65     ** OsTruncate
1a000 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20  () call used in 
1a010 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
1a020 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69   mode also requi
1a030 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  res.        ** a
1a040 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65   read/write file
1a050 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 20   handle..       
1a060 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
1a070 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1a080 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1a090 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
1a0a0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1a0b0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
1a0c0 45 58 49 53 54 53 29 20 29 7b 0a 20 20 20 20 20  EXISTS) ){.     
1a0d0 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20       int fout = 
1a0e0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  0;.          int
1a0f0 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f   flags = SQLITE_
1a100 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
1a110 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1a120 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
1a130 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
1a140 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1a150 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1a160 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
1a170 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
1a180 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
1a190 2c 20 66 6c 61 67 73 2c 26 66 6f 75 74 29 3b 0a  , flags,&fout);.
1a1a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1a1b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a1c0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e  || pPager->jfd->
1a1d0 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20  pMethods );.    
1a1e0 20 20 20 20 20 20 69 66 28 20 66 6f 75 74 26 53        if( fout&S
1a1f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
1a200 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NLY ){.         
1a210 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
1a220 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20  USY;.           
1a230 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
1a240 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
1a250 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a260 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1a270 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a280 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72  .          pager
1a290 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
1a2a0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1a2b0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
1a2c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a2d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1a2e0 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Open = 1;.      
1a2f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1a300 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
1a310 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1a320 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
1a330 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
1a340 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
1a350 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1a360 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20  rnalHdr = 0;. . 
1a370 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61         /* Playba
1a380 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
1a390 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
1a3a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
1a3b0 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ite.        ** l
1a3c0 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
1a3d0 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
1a3e0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1a3f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
1a400 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
1a410 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1a420 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a430 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1a440 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
1a450 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
1a460 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
1a470 65 72 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74  ert(pPager->stat
1a480 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
1a490 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
1a4a0 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
1a4b0 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
1a4c0 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48  ->state>PAGER_SH
1a4d0 41 52 45 44 29 0a 20 20 20 20 20 20 20 20 29 3b  ARED).        );
1a4e0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1a4f0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  if( pPager->pAll
1a500 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1a510 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68  he shared-lock h
1a520 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71  as just been acq
1a530 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74  uired on the dat
1a540 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20  abase file.     
1a550 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20     ** and there 
1a560 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65  are already page
1a570 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28  s in the cache (
1a580 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a  from a previous.
1a590 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20          ** read 
1a5a0 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
1a5b0 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f  tion).  Check to
1a5c0 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61   see if the data
1a5d0 62 61 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  base.        ** 
1a5e0 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
1a5f0 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
1a600 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
1a610 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
1a620 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20     ** cache..   
1a630 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1a640 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
1a650 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20  ges is detected 
1a660 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
1a670 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
1a680 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  .        ** at o
1a690 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68  ffset 24 into th
1a6a0 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72  e file.  The fir
1a6b0 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36  st 4 of these 16
1a6c0 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20   bytes are.     
1a6d0 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63     ** a 32-bit c
1a6e0 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69  ounter that is i
1a6f0 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20  ncremented with 
1a700 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68  each change.  Th
1a710 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68  e.        ** oth
1a720 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
1a730 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
1a740 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
1a750 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hen.        ** a
1a760 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
1a770 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20  ..        ** .  
1a780 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
1a790 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20  s a vanishingly 
1a7a0 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61  small chance tha
1a7b0 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20  t a change will 
1a7c0 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 20 20  not be .        
1a7d0 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68  ** detected.  Th
1a7e0 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75  e chance of an u
1a7f0 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65  ndetected change
1a800 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61   is so small tha
1a810 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  t.        ** it 
1a820 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
1a830 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1a840 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65       char dbFile
1a850 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67  Vers[sizeof(pPag
1a860 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d  er->dbFileVers)]
1a870 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1a880 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1a890 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20  pPager);..      
1a8a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1a8b0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  rCode ){.       
1a8c0 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
1a8d0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  ->errCode;.     
1a8e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
1a8f0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1a900 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
1a910 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53  IOTRACE(("CKVERS
1a920 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1a930 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  r, sizeof(dbFile
1a940 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20  Vers)));.       
1a950 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1a960 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
1a970 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
1a980 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
1a990 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  ), 24);.        
1a9a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a9b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1a9c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1a9d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a9e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a9f0 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65     memset(dbFile
1aa00 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Vers, 0, sizeof(
1aa10 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
1aa20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1aa30 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67   if( memcmp(pPag
1aa40 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
1aa50 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
1aa60 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21  of(dbFileVers))!
1aa70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1aa80 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
1aa90 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
1aaa0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1aab0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1aac0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
1aad0 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  | pPager->state<
1aae0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
1aaf0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1ab00 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
1ab10 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
1ab20 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1ab30 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
1ab40 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1ab50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
1ab60 6f 63 61 74 65 20 61 20 50 67 48 64 72 20 6f 62  ocate a PgHdr ob
1ab70 6a 65 63 74 2e 20 20 20 45 69 74 68 65 72 20 63  ject.   Either c
1ab80 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
1ab90 6f 72 20 72 65 75 73 65 0a 2a 2a 20 61 6e 20 65  or reuse.** an e
1aba0 78 69 73 74 69 6e 67 20 6f 6e 65 20 74 68 61 74  xisting one that
1abb0 20 69 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73   is not otherwis
1abc0 65 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  e in use..**.** 
1abd0 41 20 6e 65 77 20 50 67 48 64 72 20 73 74 72 75  A new PgHdr stru
1abe0 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
1abf0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
1ac00 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 0a 2a 2a 20  ollowing are.** 
1ac10 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  true:.**.**     
1ac20 28 31 29 20 20 57 65 20 68 61 76 65 20 6e 6f 74  (1)  We have not
1ac30 20 65 78 63 65 65 64 65 64 20 6f 75 72 20 6d 61   exceeded our ma
1ac40 78 69 6d 75 6d 20 61 6c 6c 6f 63 61 74 65 64 20  ximum allocated 
1ac50 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20  cache size.**   
1ac60 20 20 20 20 20 20 20 61 73 20 73 65 74 20 62 79         as set by
1ac70 20 74 68 65 20 22 50 52 41 47 4d 41 20 63 61 63   the "PRAGMA cac
1ac80 68 65 5f 73 69 7a 65 22 20 63 6f 6d 6d 61 6e 64  he_size" command
1ac90 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20  ..**.**     (2) 
1aca0 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 75 6e   There are no un
1acb0 75 73 65 64 20 50 67 48 64 72 20 6f 62 6a 65 63  used PgHdr objec
1acc0 74 73 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20  ts available at 
1acd0 74 68 69 73 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a  this time..**.**
1ace0 20 20 20 20 20 28 33 29 20 20 54 68 69 73 20 69       (3)  This i
1acf0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
1ad00 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  atabase..**.**  
1ad10 20 20 20 28 34 29 20 20 54 68 65 72 65 20 61 72     (4)  There ar
1ad20 65 20 6e 6f 20 50 67 48 64 72 20 6f 62 6a 65 63  e no PgHdr objec
1ad30 74 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72  ts that do not r
1ad40 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
1ad50 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 69 6c  .**          fil
1ad60 65 20 73 79 6e 63 20 61 6e 64 20 61 20 73 79 6e  e sync and a syn
1ad70 63 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  c of the journal
1ad80 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74   file is current
1ad90 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 70  ly.**          p
1ada0 72 6f 68 69 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a  rohibited..**.**
1adb0 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 75 73   Otherwise, reus
1adc0 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 50 67  e an existing Pg
1add0 48 64 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  Hdr.  In other w
1ade0 6f 72 64 73 2c 20 72 65 75 73 65 20 61 6e 0a 2a  ords, reuse an.*
1adf0 2a 20 65 78 69 73 74 69 6e 67 20 50 67 48 64 72  * existing PgHdr
1ae00 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
1ae10 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
1ae20 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  e:.**.**     (1)
1ae30 20 20 57 65 20 68 61 76 65 20 72 65 61 63 68 65    We have reache
1ae40 64 20 6f 72 20 65 78 63 65 65 64 65 64 20 74 68  d or exceeded th
1ae50 65 20 6d 61 78 69 6d 75 6d 20 63 61 63 68 65 20  e maximum cache 
1ae60 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  size.**         
1ae70 20 61 6c 6c 6f 77 65 64 20 62 79 20 22 50 52 41   allowed by "PRA
1ae80 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 22 2e  GMA cache_size".
1ae90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20  .**.**     (2)  
1aea0 54 68 65 72 65 20 69 73 20 61 20 50 67 48 64 72  There is a PgHdr
1aeb0 20 61 76 61 69 6c 61 62 6c 65 20 77 69 74 68 20   available with 
1aec0 50 67 48 64 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a  PgHdr->nRef==0.*
1aed0 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 57 65  *.**     (3)  We
1aee0 20 61 72 65 20 6e 6f 74 20 69 6e 20 61 6e 20 69   are not in an i
1aef0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1af00 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20  e.**.**     (4) 
1af10 20 45 69 74 68 65 72 20 74 68 65 72 65 20 69 73   Either there is
1af20 20 61 6e 20 61 76 61 69 6c 61 62 6c 65 20 50 67   an available Pg
1af30 48 64 72 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  Hdr that does no
1af40 74 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 20  t need.**       
1af50 20 20 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20     to be synced 
1af60 74 6f 20 64 69 73 6b 20 6f 72 20 65 6c 73 65 20  to disk or else 
1af70 64 69 73 6b 20 73 79 6e 63 69 6e 67 20 69 73 20  disk syncing is 
1af80 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20  currently.**    
1af90 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a        allowed..*
1afa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1afb0 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65 28 50  erAllocatePage(P
1afc0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1afd0 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 69  Hdr **ppPg){.  i
1afe0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1aff0 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  K;.  PgHdr *pPg;
1b000 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20  ..  /* Create a 
1b010 6e 65 77 20 50 67 48 64 72 20 69 66 20 61 6e 79  new PgHdr if any
1b020 20 6f 66 20 74 68 65 20 66 6f 75 72 20 63 6f 6e   of the four con
1b030 64 69 74 69 6f 6e 73 20 64 65 66 69 6e 65 64 20  ditions defined 
1b040 0a 20 20 2a 2a 20 61 62 6f 76 65 20 61 72 65 20  .  ** above are 
1b050 6d 65 74 3a 20 2a 2f 0a 20 20 69 66 28 20 70 50  met: */.  if( pP
1b060 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67  ager->nPage<pPag
1b070 65 72 2d 3e 6d 78 50 61 67 65 0a 20 20 20 7c 7c  er->mxPage.   ||
1b080 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
1b090 3d 30 20 0a 20 20 20 7c 7c 20 4d 45 4d 44 42 0a  =0 .   || MEMDB.
1b0a0 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 70     || (pPager->p
1b0b0 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 26  FirstSynced==0 &
1b0c0 26 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  & pPager->doNotS
1b0d0 79 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20 69 66  ync).  ){.    if
1b0e0 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e  ( pPager->nPage>
1b0f0 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 29  =pPager->nHash )
1b100 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  {.      pager_re
1b110 73 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28  size_hash_table(
1b120 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20  pPager,.        
1b130 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3c 32   pPager->nHash<2
1b140 35 36 20 3f 20 32 35 36 20 3a 20 70 50 61 67 65  56 ? 256 : pPage
1b150 72 2d 3e 6e 48 61 73 68 2a 32 29 3b 0a 20 20 20  r->nHash*2);.   
1b160 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
1b170 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Hash==0 ){.     
1b180 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1b190 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f  OMEM;.        go
1b1a0 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74  to pager_allocat
1b1b0 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  e_out;.      }. 
1b1c0 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 4c 65     }.    pagerLe
1b1d0 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
1b1e0 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d   pPg = sqlite3_m
1b1f0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
1b200 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61  Pg) + pPager->pa
1b210 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20  geSize.         
1b220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b230 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29     + sizeof(u32)
1b240 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
1b250 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a.              
1b260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
1b270 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48  MEMDB*sizeof(PgH
1b280 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 70  istory) );.    p
1b290 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
1b2a0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d  );.    if( pPg==
1b2b0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1b2c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1b2d0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
1b2e0 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20  llocate_out;.   
1b2f0 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50   }.    memset(pP
1b300 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50  g, 0, sizeof(*pP
1b310 67 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  g));.    if( MEM
1b320 44 42 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  DB ){.      mems
1b330 65 74 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  et(PGHDR_TO_HIST
1b340 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30  (pPg, pPager), 0
1b350 2c 20 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f  , sizeof(PgHisto
1b360 72 79 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ry));.    }.    
1b370 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
1b380 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70  ager;.    pPg->p
1b390 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72  NextAll = pPager
1b3a0 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 70 50 61 67  ->pAll;.    pPag
1b3b0 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a  er->pAll = pPg;.
1b3c0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
1b3d0 65 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e++;.  }else{.  
1b3e0 20 20 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e 20    /* Recycle an 
1b3f0 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 77 69  existing page wi
1b400 74 68 20 61 20 7a 65 72 6f 20 72 65 66 2d 63 6f  th a zero ref-co
1b410 75 6e 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  unt. */.    rc =
1b420 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
1b430 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 29 3b  Pager, 1, &pPg);
1b440 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1b450 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
1b460 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1b470 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20 20  ERR_BLOCKED;.   
1b480 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
1b490 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b4a0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c    goto pager_all
1b4b0 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  ocate_out;.    }
1b4c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1b4d0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52  ger->state>=SHAR
1b4e0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
1b4f0 73 73 65 72 74 28 70 50 67 29 3b 0a 20 20 7d 0a  ssert(pPg);.  }.
1b500 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 0a    *ppPg = pPg;..
1b510 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f  pager_allocate_o
1b520 75 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ut:.  return rc;
1b530 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
1b540 75 72 65 20 77 65 20 68 61 76 65 20 74 68 65 20  ure we have the 
1b550 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 20 70 61  content for a pa
1b560 67 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ge.  If the page
1b570 20 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73   was.** previous
1b580 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74 68  ly acquired with
1b590 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74   noContent==1, t
1b5a0 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hen the content 
1b5b0 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69 6e 69 74  was.** just init
1b5c0 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73  ialized to zeros
1b5d0 20 69 6e 73 74 65 61 64 20 6f 66 20 62 65 69 6e   instead of bein
1b5e0 67 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  g read from disk
1b5f0 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20 77 65 20  ..** But now we 
1b600 6e 65 65 64 20 74 68 65 20 72 65 61 6c 20 64 61  need the real da
1b610 74 61 20 6f 66 66 20 6f 66 20 64 69 73 6b 2e 20  ta off of disk. 
1b620 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65   So make sure we
1b630 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20 20 52 65  .** have it.  Re
1b640 61 64 20 69 74 20 69 6e 20 69 66 20 77 65 20 64  ad it in if we d
1b650 6f 20 6e 6f 74 20 68 61 76 65 20 69 74 20 61 6c  o not have it al
1b660 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ready..*/.static
1b670 20 69 6e 74 20 70 61 67 65 72 5f 67 65 74 5f 63   int pager_get_c
1b680 6f 6e 74 65 6e 74 28 50 67 48 64 72 20 2a 70 50  ontent(PgHdr *pP
1b690 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e  g){.  if( pPg->n
1b6a0 65 65 64 52 65 61 64 20 29 7b 0a 20 20 20 20 69  eedRead ){.    i
1b6b0 6e 74 20 72 63 20 3d 20 72 65 61 64 44 62 50 61  nt rc = readDbPa
1b6c0 67 65 28 70 50 67 2d 3e 70 50 61 67 65 72 2c 20  ge(pPg->pPager, 
1b6d0 70 50 67 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  pPg, pPg->pgno);
1b6e0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1b6f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b700 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20  pPg->needRead = 
1b710 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1b720 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1b730 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1b740 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1b750 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
1b760 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65  page..**.** A re
1b770 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
1b780 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61  isk file is obta
1b790 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66 69  ined when the fi
1b7a0 72 73 74 20 70 61 67 65 20 69 73 20 61 63 71 75  rst page is acqu
1b7b0 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72  ired. .** This r
1b7c0 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70  ead lock is drop
1b7d0 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ped when the las
1b7e0 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
1b7f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
1b800 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72  outine works for
1b810 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72   any page number
1b820 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e   greater than 0.
1b830 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
1b840 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61  e.** file is sma
1b850 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
1b860 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74 68  quested page, th
1b870 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73  en no actual dis
1b880 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73  k.** read occurs
1b890 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20   and the memory 
1b8a0 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61 67  image of the pag
1b8b0 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
1b8c0 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73   to.** all zeros
1b8d0 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61 74  .  The extra dat
1b8e0 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
1b8f0 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
1b900 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f  nitialized.** to
1b910 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73 74   zeros the first
1b920 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
1b930 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
1b940 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  ry..**.** The ac
1b950 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
1b960 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
1b970 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
1b980 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
1b990 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
1b9a0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1b9b0 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
1b9c0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
1b9d0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
1b9e0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
1b9f0 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
1ba00 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70  utine and Lookup
1ba10 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  () attempt.** to
1ba20 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
1ba30 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
1ba40 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74  che first.  If t
1ba50 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
1ba60 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d  lready.** in mem
1ba70 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ory, this routin
1ba80 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74  e goes to disk t
1ba90 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65  o read it in whe
1baa0 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  reas Lookup().**
1bab0 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
1bac0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
1bad0 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
1bae0 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
1baf0 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
1bb00 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
1bb10 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
1bb20 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
1bb30 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
1bb40 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70  .** Since Lookup
1bb50 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
1bb60 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
1bb70 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
1bb80 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
1bb90 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  rnal files..**.*
1bba0 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
1bbb0 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70 61 67  s false, the pag
1bbc0 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 61  e contents are a
1bbd0 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f  ctually read fro
1bbe0 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f  m disk..** If no
1bbf0 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
1bc00 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
1bc10 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
1bc20 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  out the contents
1bc30 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
1bc40 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 73 6f  at this time, so
1bc50 20 64 6f 20 6e 6f 74 20 64 6f 20 61 20 64 69 73   do not do a dis
1bc60 6b 20 72 65 61 64 2e 20 20 4a 75 73 74 20 66 69  k read.  Just fi
1bc70 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67  ll in the.** pag
1bc80 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a  e content with z
1bc90 65 72 6f 73 2e 20 20 42 75 74 20 6d 61 72 6b 20  eros.  But mark 
1bca0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 77 65  the fact that we
1bcb0 20 68 61 76 65 20 6e 6f 74 20 72 65 61 64 20 74   have not read t
1bcc0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 62 79  he.** content by
1bcd0 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48   setting the PgH
1bce0 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61 67  dr.needRead flag
1bcf0 2e 20 20 4c 61 74 65 72 20 6f 6e 2c 20 69 66 20  .  Later on, if 
1bd00 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
1bd10 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
1bd20 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65 20 6f  d on this page o
1bd30 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  r if this routin
1bd40 65 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 61  e is.** called a
1bd50 67 61 69 6e 20 77 69 74 68 20 6e 6f 43 6f 6e 74  gain with noCont
1bd60 65 6e 74 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61  ent==0, that mea
1bd70 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  ns that the cont
1bd80 65 6e 74 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a  ent is needed.**
1bd90 20 61 6e 64 20 74 68 65 20 64 69 73 6b 20 72 65   and the disk re
1bda0 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20  ad should occur 
1bdb0 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a  at that point..*
1bdc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1bdd0 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67  erAcquire(.  Pag
1bde0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1bdf0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
1be00 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
1be10 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
1be20 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
1be30 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
1be40 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
1be50 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
1be60 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
1be70 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
1be80 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   here */.  int n
1be90 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f  oContent       /
1bea0 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
1beb0 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20  reading content 
1bec0 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75  from disk if tru
1bed0 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20  e */.){.  PgHdr 
1bee0 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pPg;.  int rc;.
1bef0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1bf00 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1bf10 55 4e 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72  UNLOCK || pPager
1bf20 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f  ->nRef>0 || pgno
1bf30 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ==1 );..  /* The
1bf40 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75   maximum page nu
1bf50 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65  mber is 2^31. Re
1bf60 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1bf70 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20  UPT if a page.  
1bf80 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ** number greate
1bf90 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20  r than this, or 
1bfa0 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65 73 74  zero, is request
1bfb0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
1bfc0 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
1bfd0 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c  NO || pgno==0 ||
1bfe0 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
1bff0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
1c000 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c010 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1c020 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
1c030 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20  ure we have not 
1c040 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c  hit any critical
1c050 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20   errors..  */ . 
1c060 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
1c070 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20  =0 );.  *ppPage 
1c080 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
1c090 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
1c0a0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
1c0b0 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
1c0c0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1c0d0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20  >errCode;.  }.. 
1c0e0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
1c0f0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63  he first page ac
1c100 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74  cessed, then get
1c110 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20   a SHARED lock. 
1c120 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
1c130 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72 53  ase file. pagerS
1c140 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20 61  haredLock() is a
1c150 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20   no-op if .  ** 
1c160 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  a database lock 
1c170 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e  is already held.
1c180 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
1c190 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50 61  erSharedLock(pPa
1c1a0 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
1c1b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c1c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1c1d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c1e0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
1c1f0 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70 50 67 20  NLOCK );..  pPg 
1c200 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
1c210 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
1c220 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
1c230 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
1c240 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  ed page is not i
1c250 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
1c260 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61  . */.    int nMa
1c270 78 3b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20  x;.    int h;.  
1c280 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
1c290 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20  ger->nMiss);.   
1c2a0 20 72 63 20 3d 20 70 61 67 65 72 41 6c 6c 6f 63   rc = pagerAlloc
1c2b0 61 74 65 50 61 67 65 28 70 50 61 67 65 72 2c 20  atePage(pPager, 
1c2c0 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  &pPg);.    if( r
1c2d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c2e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c2f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d  .    }..    pPg-
1c300 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
1c310 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
1c320 20 7c 7c 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d   || pgno>pPager-
1c330 3e 73 74 6d 74 53 69 7a 65 20 29 3b 0a 20 20 20  >stmtSize );.   
1c340 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
1c350 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
1c360 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  pgno<=pPager->or
1c370 69 67 44 62 53 69 7a 65 20 29 7b 0a 23 69 66 20  igDbSize ){.#if 
1c380 30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  0.      sqlite3C
1c390 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65  heckMemory(pPage
1c3a0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->aInJournal, p
1c3b0 67 6e 6f 2f 38 29 3b 0a 23 65 6e 64 69 66 0a 20  gno/8);.#endif. 
1c3c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1c3d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1c3e0 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   );.      pPg->i
1c3f0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67  nJournal = (pPag
1c400 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
1c410 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67  gno/8] & (1<<(pg
1c420 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20  no&7)))!=0;.    
1c430 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
1c440 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1c450 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
1c460 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
1c470 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
1c480 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 61  0;.    }..    ma
1c490 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
1c4a0 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b    pPg->nRef = 1;
1c4b0 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67  .    REFINFO(pPg
1c4c0 29 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  );..    pPager->
1c4d0 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20  nRef++;.    if( 
1c4e0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30  pPager->nExtra>0
1c4f0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
1c500 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  (PGHDR_TO_EXTRA(
1c510 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
1c520 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
1c530 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78  ;.    }.    nMax
1c540 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
1c550 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
1c560 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1c570 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
1c580 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1c590 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
1c5a0 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
1c5b0 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 72 65 74  rCode;.      ret
1c5c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
1c5d0 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
1c5e0 68 65 20 70 61 67 65 20 77 69 74 68 20 64 61 74  he page with dat
1c5f0 61 2c 20 65 69 74 68 65 72 20 62 79 20 72 65 61  a, either by rea
1c600 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61  ding from the da
1c610 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
1c620 6c 65 2c 20 6f 72 20 62 79 20 73 65 74 74 69 6e  le, or by settin
1c630 67 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67  g the entire pag
1c640 65 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a  e to zero..    *
1c650 2f 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28  /.    if( nMax<(
1c660 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44  int)pgno || MEMD
1c670 42 20 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74 20  B || (noContent 
1c680 26 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61  && !pPager->alwa
1c690 79 73 52 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a 20  ysRollback) ){. 
1c6a0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
1c6b0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
1c6c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1c6d0 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
1c6e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1c6f0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
1c700 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
1c710 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
1c720 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
1c730 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
1c740 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d   pPg->needRead =
1c750 20 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70   noContent && !p
1c760 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
1c770 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54  lback;.      IOT
1c780 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25  RACE(("ZERO %p %
1c790 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
1c7a0 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
1c7b0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
1c7c0 44 62 50 61 67 65 28 70 50 61 67 65 72 2c 20 70  DbPage(pPager, p
1c7d0 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg, pgno);.     
1c7e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c7f0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
1c800 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1c810 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  D ){.        pPg
1c820 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20  ->pgno = 0;.    
1c830 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1c840 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
1c850 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
1c870 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a  ->needRead = 0;.
1c880 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69      }..    /* Li
1c890 6e 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  nk the page into
1c8a0 20 74 68 65 20 70 61 67 65 20 68 61 73 68 20 74   the page hash t
1c8b0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20  able */.    h = 
1c8c0 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
1c8d0 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 61 73  nHash-1);.    as
1c8e0 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
1c8f0 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
1c900 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48  ash = pPager->aH
1c910 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67  ash[h];.    pPag
1c920 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
1c930 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  Pg;.    if( pPg-
1c940 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20  >pNextHash ){.  
1c950 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
1c960 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
1c970 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20  vHash==0 );.    
1c980 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
1c990 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
1c9a0 67 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  g;.    }..#ifdef
1c9b0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
1c9c0 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
1c9d0 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
1c9e0 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
1c9f0 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
1ca00 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
1ca10 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65  d page is in the
1ca20 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a   page cache. */.
1ca30 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
1ca40 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e  r->nRef>0 || pgn
1ca50 6f 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45 52  o==1);.    PAGER
1ca60 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48  _INCR(pPager->nH
1ca70 69 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f  it);.    if( !no
1ca80 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
1ca90 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f   rc = pager_get_
1caa0 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20  content(pPg);.  
1cab0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1cac0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1cad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1cae0 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29     page_ref(pPg)
1caf0 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20  ;.  }.  *ppPage 
1cb00 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20  = pPg;.  return 
1cb10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74  SQLITE_OK;.}.int
1cb20 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
1cb30 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70  uire(.  Pager *p
1cb40 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
1cb50 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
1cb60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1cb70 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
1cb80 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
1cb90 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
1cba0 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
1cbb0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
1cbc0 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
1cbd0 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
1cbe0 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74   */.  int noCont
1cbf0 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  ent       /* Do 
1cc00 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69  not bother readi
1cc10 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ng content from 
1cc20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a  disk if true */.
1cc30 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  ){.  int rc;.  p
1cc40 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
1cc50 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 41  );.  rc = pagerA
1cc60 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 70  cquire(pPager, p
1cc70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43  gno, ppPage, noC
1cc80 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 61 67 65 72  ontent);.  pager
1cc90 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
1cca0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1ccb0 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
1ccc0 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c  page if it is al
1ccd0 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d  ready in the in-
1cce0 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44  memory cache.  D
1ccf0 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68  o.** not read th
1cd00 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b  e page from disk
1cd10 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
1cd20 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ter to the page,
1cd30 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20  .** or 0 if the 
1cd40 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
1cd50 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ache..**.** See 
1cd60 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
1cd70 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  rGet().  The dif
1cd80 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
1cd90 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1cda0 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
1cdb0 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  Get() is that _g
1cdc0 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
1cdd0 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
1cde0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
1cdf0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
1ce00 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
1ce10 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
1ce20 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
1ce30 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
1ce40 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
1ce50 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
1ce60 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
1ce70 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
1ce80 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33  .DbPage *sqlite3
1ce90 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65  PagerLookup(Page
1cea0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
1ceb0 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
1cec0 70 50 67 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  pPg = 0;..  asse
1ced0 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
1cee0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
1cef0 3d 30 20 29 3b 0a 0a 20 20 70 61 67 65 72 45 6e  =0 );..  pagerEn
1cf00 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
1cf10 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1cf20 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
1cf30 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
1cf40 50 61 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70  Pager->pAll || p
1cf50 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
1cf60 4d 6f 64 65 20 29 3b 0a 20 20 7d 65 6c 73 65 20  Mode );.  }else 
1cf70 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1cf80 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
1cf90 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
1cfa0 55 4c 4c 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f  ULL ){.    /* Do
1cfb0 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 65   nothing */.  }e
1cfc0 6c 73 65 20 69 66 28 20 28 70 50 67 20 3d 20 70  lse if( (pPg = p
1cfd0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
1cfe0 65 72 2c 20 70 67 6e 6f 29 29 21 3d 30 20 29 7b  er, pgno))!=0 ){
1cff0 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50  .    page_ref(pP
1d000 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c  g);.  }.  pagerL
1d010 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
1d020 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f  return pPg;.}../
1d030 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
1d040 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  age..**.** If th
1d050 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
1d060 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
1d070 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
1d080 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
1d090 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
1d0a0 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
1d0b0 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
1d0c0 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
1d0d0 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
1d0e0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
1d0f0 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
1d100 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1d110 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
1d120 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1d130 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50  Unref(DbPage *pP
1d140 67 29 7b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d  g){..  /* Decrem
1d150 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
1d160 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73  e count for this
1d170 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 61 73 73   page.  */.  ass
1d180 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
1d190 20 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72   );.  pagerEnter
1d1a0 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pPg->pPager);. 
1d1b0 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pPg->nRef--;.  
1d1c0 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20  REFINFO(pPg);.. 
1d1d0 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
1d1e0 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  ;..  /* When the
1d1f0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
1d200 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20  ences to a page 
1d210 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68  reach 0, call th
1d220 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f  e.  ** destructo
1d230 72 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61  r and add the pa
1d240 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ge to the freeli
1d250 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
1d260 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
1d270 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
1d280 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70  ;.    pPager = p
1d290 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  Pg->pPager;.    
1d2a0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  pPg->pNextFree =
1d2b0 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   0;.    pPg->pPr
1d2c0 65 76 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d  evFree = pPager-
1d2d0 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67  >pLast;.    pPag
1d2e0 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b  er->pLast = pPg;
1d2f0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
1d300 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20  revFree ){.     
1d310 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
1d320 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
1d330 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d340 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
1d350 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  t = pPg;.    }. 
1d360 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
1d370 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65  Sync==0 && pPage
1d380 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  r->pFirstSynced=
1d390 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  =0 ){.      pPag
1d3a0 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
1d3b0 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
1d3c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44    if( pPager->xD
1d3d0 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
1d3e0 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74     pPager->xDest
1d3f0 72 75 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67  ructor(pPg, pPag
1d400 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1d410 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
1d420 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65  hen all pages re
1d430 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74  ach the freelist
1d440 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20  , drop the read 
1d450 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  lock from.    **
1d460 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d470 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  le..    */.    p
1d480 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Pager->nRef--;. 
1d490 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1d4a0 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20  r->nRef>=0 );.  
1d4b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52    if( pPager->nR
1d4c0 65 66 3d 3d 30 20 26 26 20 28 21 70 50 61 67 65  ef==0 && (!pPage
1d4d0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
1d4e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
1d4f0 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20  nalOff>0) ){.   
1d500 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
1d510 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
1d520 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
1d530 61 67 65 72 4c 65 61 76 65 28 70 50 67 2d 3e 70  agerLeave(pPg->p
1d540 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
1d550 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1d560 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f  *.** Create a jo
1d570 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
1d580 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68  Pager.  There sh
1d590 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
1d5a0 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72  a RESERVED.** or
1d5b0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1d5c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1d5d0 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
1d5e0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1d5f0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
1d600 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
1d610 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20  ything.  Return 
1d620 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
1d630 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a  d release the.**
1d640 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61   write lock if a
1d650 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
1d660 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
1d670 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
1d680 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
1d690 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
1d6a0 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
1d6b0 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 66  r->pVfs;.  int f
1d6c0 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
1d6d0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
1d6e0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
1d6f0 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
1d700 43 52 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74 20  CREATE);..  int 
1d710 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
1d720 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
1d730 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1d740 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
1d750 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1d760 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1d770 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1d780 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
1d790 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
1d7a0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1d7b0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  nal==0 );.  sqli
1d7c0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1d7d0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67  t(pPager);.  pag
1d7e0 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
1d7f0 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
1d800 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d  urnal = sqlite3M
1d810 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 50 61 67 65  allocZero( pPage
1d820 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20  r->dbSize/8 + 1 
1d830 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  );.  pagerEnter(
1d840 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
1d850 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1d860 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
1d870 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1d880 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
1d890 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
1d8a0 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
1d8b0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
1d8c0 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c     flags |= (SQL
1d8d0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
1d8e0 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50  NCLOSE|SQLITE_OP
1d8f0 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29  EN_TEMP_JOURNAL)
1d900 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
1d910 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f  lags |= (SQLITE_
1d920 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
1d930 4c 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  L);.  }.#ifdef S
1d940 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
1d950 4d 49 43 5f 57 52 49 54 45 0a 20 20 72 63 20 3d  MIC_WRITE.  rc =
1d960 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
1d970 70 65 6e 28 0a 20 20 20 20 20 20 70 56 66 73 2c  pen(.      pVfs,
1d980 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1d990 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
1d9a0 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65  flags, jrnlBuffe
1d9b0 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20  rSize(pPager).  
1d9c0 29 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20  );.#else.  rc = 
1d9d0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
1d9e0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
1d9f0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
1da00 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65  d, flags, 0);.#e
1da10 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 72  ndif.  assert( r
1da20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1da30 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
1da40 74 68 6f 64 73 20 29 3b 0a 20 20 70 50 61 67 65  thods );.  pPage
1da50 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1da60 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
1da70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
1da80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1da90 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
1daa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dab0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dac0 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73  NOMEM ){.      s
1dad0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
1dae0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
1daf0 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 7d  urnal, 0);.    }
1db00 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64  .    goto failed
1db10 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
1db20 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1db30 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
1db40 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
1db50 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
1db60 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1db70 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  c = 0;.  pPager-
1db80 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1db90 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
1dba0 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Rec = 0;.  if( p
1dbb0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
1dbc0 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  {.    rc = pPage
1dbd0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
1dbe0 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
1dbf0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d  pen_journal;.  }
1dc00 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
1dc10 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
1dc20 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20  dbSize;..  rc = 
1dc30 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
1dc40 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20  pPager);..  if( 
1dc50 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
1dc60 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  open && rc==SQLI
1dc70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1dc80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  = sqlite3PagerSt
1dc90 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72 29 3b  mtBegin(pPager);
1dca0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
1dcb0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
1dcc0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
1dcd0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
1dce0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
1dcf0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1dd00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1dd10 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1dd20 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
1dd30 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1dd40 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f  .failed_to_open_
1dd50 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74  journal:.  sqlit
1dd60 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
1dd70 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  aInJournal);.  p
1dd80 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1dd90 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  l = 0;.  return 
1dda0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  rc;.}../*.** Acq
1ddb0 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
1ddc0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1ddd0 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20  e.  The lock is 
1dde0 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20  removed when.** 
1ddf0 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66  the any of the f
1de00 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a  ollowing happen:
1de10 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  .**.**   *  sqli
1de20 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1de30 61 73 65 54 77 6f 28 29 20 69 73 20 63 61 6c 6c  aseTwo() is call
1de40 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
1de50 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
1de60 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
1de70 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
1de80 65 72 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  erClose() is cal
1de90 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
1dea0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
1deb0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e   is called to on
1dec0 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69   every outstandi
1ded0 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ng page..**.** T
1dee0 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74  he first paramet
1def0 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  er to this routi
1df00 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ne is a pointer 
1df10 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65  to any open page
1df20 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
1df30 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69  ase file.  Nothi
1df40 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74  ng changes about
1df50 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69   the page - it i
1df60 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f  s used merely to
1df70 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f  .** acquire a po
1df80 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
1df90 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
1dfa0 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74   as proof that t
1dfb0 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61  here is.** alrea
1dfc0 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  dy a read-lock o
1dfd0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
1dfe0 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  **.** The second
1dff0 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
1e000 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70  ates how much sp
1e010 61 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20  ace in bytes to 
1e020 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a  reserve for a.**
1e030 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1e040 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65  file-name at the
1e050 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
1e060 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73  urnal when it is
1e070 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
1e080 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  A journal file i
1e090 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73  s opened if this
1e0a0 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72   is not a tempor
1e0b0 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74  ary file.  For t
1e0c0 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65  emporary.** file
1e0d0 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f  s, the opening o
1e0e0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1e0f0 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75  le is deferred u
1e100 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e  ntil there is an
1e110 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20  .** actual need 
1e120 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
1e130 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
1e140 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1e150 73 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76  s already reserv
1e160 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20  ed for writing, 
1e170 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1e180 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
1e190 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
1e1a0 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67  , go ahead and g
1e1b0 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
1e1c0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
1e1d0 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
1e1e0 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69  instead of waiti
1e1f0 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20  ng until we try 
1e200 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63  to flush the cac
1e210 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c  he.  The.** exFl
1e220 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  ag is ignored if
1e230 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
1e240 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
1e250 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e260 50 61 67 65 72 42 65 67 69 6e 28 44 62 50 61 67  PagerBegin(DbPag
1e270 65 20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46 6c  e *pPg, int exFl
1e280 61 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  ag){.  Pager *pP
1e290 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1e2a0 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
1e2b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 61 67 65  QLITE_OK;.  page
1e2c0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
1e2d0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1e2e0 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Ref>0 );.  asser
1e2f0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1e300 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
1e310 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1e320 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
1e330 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  RED ){.    asser
1e340 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
1e350 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
1e360 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1e370 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
1e380 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
1e390 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  VE;.      pPager
1e3a0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
1e3b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
1e3c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e3d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
1e3e0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  ck(pPager->fd, R
1e3f0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
1e400 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1e410 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e420 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1e430 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  = PAGER_RESERVED
1e440 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78  ;.        if( ex
1e450 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
1e460 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
1e470 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
1e480 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
1e490 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1e4a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1e4b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e4c0 20 20 20 20 20 20 20 20 70 61 67 65 72 4c 65 61          pagerLea
1e4d0 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ve(pPager);.    
1e4e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e4f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
1e500 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1e510 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47 45 52  = 0;.      PAGER
1e520 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43 54  TRACE2("TRANSACT
1e530 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
1e540 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1e550 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75     if( pPager->u
1e560 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50  seJournal && !pP
1e570 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1e580 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
1e590 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1e5a0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
1e5b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
1e5c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1e5d0 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67  rnalOpen && pPag
1e5e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1e5f0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
1e600 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68   happens when th
1e610 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
1e620 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
1e630 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a  mode last.    **
1e640 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72   time a (read or
1e650 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
1e660 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66  ion was successf
1e670 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20  ully concluded. 
1e680 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f     ** by this co
1e690 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61  nnection. Instea
1e6a0 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68  d of deleting th
1e6b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1e6c0 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65  t was .    ** ke
1e6d0 70 74 20 6f 70 65 6e 20 61 6e 64 20 74 72 75 6e  pt open and trun
1e6e0 63 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73  cated to 0 bytes
1e6f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1e700 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
1e710 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
1e720 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  rt( pPager->orig
1e730 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20  DbSize==0 );.   
1e740 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e750 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
1e760 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
1e770 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1e780 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 4c 65  er);.    pagerLe
1e790 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
1e7a0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1e7b0 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nal = sqlite3Mal
1e7c0 6c 6f 63 5a 65 72 6f 28 20 70 50 61 67 65 72 2d  locZero( pPager-
1e7d0 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
1e7e0 0a 20 20 20 20 70 61 67 65 72 45 6e 74 65 72 28  .    pagerEnter(
1e7f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
1e800 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75   !pPager->aInJou
1e810 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
1e820 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1e830 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e840 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
1e850 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
1e860 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63 20  bSize;.      rc 
1e870 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
1e880 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  r(pPager);.    }
1e890 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
1e8a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1e8b0 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  pen || pPager->j
1e8c0 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72  ournalOff>0 || r
1e8d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1e8e0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
1e8f0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
1e900 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
1e910 20 61 20 70 61 67 65 20 64 69 72 74 79 2e 20 20   a page dirty.  
1e920 53 65 74 20 69 74 73 20 64 69 72 74 79 20 66 6c  Set its dirty fl
1e930 61 67 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f  ag and add it to
1e940 20 74 68 65 20 64 69 72 74 79 0a 2a 2a 20 70 61   the dirty.** pa
1e950 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ge list..*/.stat
1e960 69 63 20 76 6f 69 64 20 6d 61 6b 65 44 69 72 74  ic void makeDirt
1e970 79 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  y(PgHdr *pPg){. 
1e980 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 3d   if( pPg->dirty=
1e990 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  =0 ){.    Pager 
1e9a0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1e9b0 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e  Pager;.    pPg->
1e9c0 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70  dirty = 1;.    p
1e9d0 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61  Pg->pDirty = pPa
1e9e0 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ger->pDirty;.   
1e9f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 44 69   if( pPager->pDi
1ea00 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 61  rty ){.      pPa
1ea10 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72  ger->pDirty->pPr
1ea20 65 76 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20  evDirty = pPg;. 
1ea30 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50     }.    pPg->pP
1ea40 72 65 76 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  revDirty = 0;.  
1ea50 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
1ea60 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = pPg;.  }.}../
1ea70 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65  *.** Make a page
1ea80 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20 69   clean.  Clear i
1ea90 74 73 20 64 69 72 74 79 20 62 69 74 20 61 6e 64  ts dirty bit and
1eaa0 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
1eab0 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  the.** dirty pag
1eac0 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
1ead0 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e  c void makeClean
1eae0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1eaf0 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  if( pPg->dirty )
1eb00 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  {.    pPg->dirty
1eb10 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
1eb20 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20  g->pDirty ){.   
1eb30 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1eb40 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72  pDirty->pPrevDir
1eb50 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20  ty==pPg );.     
1eb60 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50   pPg->pDirty->pP
1eb70 72 65 76 44 69 72 74 79 20 3d 20 70 50 67 2d 3e  revDirty = pPg->
1eb80 70 50 72 65 76 44 69 72 74 79 3b 0a 20 20 20 20  pPrevDirty;.    
1eb90 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  }.    if( pPg->p
1eba0 50 72 65 76 44 69 72 74 79 20 29 7b 0a 20 20 20  PrevDirty ){.   
1ebb0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1ebc0 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72  pPrevDirty->pDir
1ebd0 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20  ty==pPg );.     
1ebe0 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
1ebf0 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e  ->pDirty = pPg->
1ec00 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73  pDirty;.    }els
1ec10 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1ec20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44   pPg->pPager->pD
1ec30 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20  irty==pPg );.   
1ec40 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
1ec50 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44  pDirty = pPg->pD
1ec60 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  irty;.    }.  }.
1ec70 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  }.../*.** Mark a
1ec80 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
1ec90 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61  iteable.  The pa
1eca0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
1ecb0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  to the journal .
1ecc0 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  ** if it is not 
1ecd0 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20  there already.  
1ece0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
1ecf0 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
1ed00 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61  re making.** cha
1ed10 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a  nges to a page..
1ed20 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
1ed30 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
1ed40 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
1ed50 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61   pager creates a
1ed60 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   new.** journal 
1ed70 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52  and acquires a R
1ed80 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
1ed90 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
1eda0 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a  f the RESERVED.*
1edb0 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  * lock could not
1edc0 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68   be acquired, th
1edd0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1ede0 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  ns SQLITE_BUSY. 
1edf0 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
1ee00 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65  routine must che
1ee10 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75  ck for that retu
1ee20 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20  rn value and be 
1ee30 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a  careful not to.*
1ee40 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  * change any pag
1ee50 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69  e data until thi
1ee60 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1ee70 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
1ee80 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
1ee90 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74  l file could not
1eea0 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61   be written beca
1eeb0 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20  use the disk is 
1eec0 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  full,.** then th
1eed0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1eee0 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61  ns SQLITE_FULL a
1eef0 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64  nd does an immed
1ef00 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  iate rollback..*
1ef10 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  * All subsequent
1ef20 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20   write attempts 
1ef30 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  also return SQLI
1ef40 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68  TE_FULL until th
1ef50 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c  ere.** is a call
1ef60 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1ef70 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69  Commit() or sqli
1ef80 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
1ef90 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a  () to.** reset..
1efa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1efb0 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20  ger_write(PgHdr 
1efc0 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70  *pPg){.  void *p
1efd0 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Data = PGHDR_TO_
1efe0 44 41 54 41 28 70 50 67 29 3b 0a 20 20 50 61 67  DATA(pPg);.  Pag
1eff0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1f000 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
1f010 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1f020 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
1f030 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66  errors.  */.  if
1f040 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1f050 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e  e ){ .    return
1f060 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1f070 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1f080 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  er->readOnly ){.
1f090 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f0a0 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61  E_PERM;.  }..  a
1f0b0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
1f0c0 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20  setMaster );..  
1f0d0 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
1f0e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
1f0f0 61 67 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  age was previous
1f100 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74 68  ly acquired with
1f110 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74   noContent==1, t
1f120 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 77  hat means.  ** w
1f130 65 20 64 69 64 6e 27 74 20 72 65 61 6c 6c 79 20  e didn't really 
1f140 72 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6e 74  read in the cont
1f150 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
1f160 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65    This can happe
1f170 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78 61 6d  n.  ** (for exam
1f180 70 6c 65 29 20 77 68 65 6e 20 74 68 65 20 70 61  ple) when the pa
1f190 67 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 76 65  ge is being move
1f1a0 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
1f1b0 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f 77  t.  But.  ** now
1f1c0 20 77 65 20 61 72 65 20 28 70 65 72 68 61 70 73   we are (perhaps
1f1d0 29 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61 67  ) moving the pag
1f1e0 65 20 6f 66 66 20 6f 66 20 74 68 65 20 66 72 65  e off of the fre
1f1f0 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20 72  elist for.  ** r
1f200 65 75 73 65 20 61 6e 64 20 77 65 20 6e 65 65 64  euse and we need
1f210 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72 69   to know its ori
1f220 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73 6f  ginal content so
1f230 20 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20 20   that content.  
1f240 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  ** can be stored
1f250 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
1f260 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64 6f   journal.  So do
1f270 20 74 68 65 20 72 65 61 64 20 61 74 20 74 68 69   the read at thi
1f280 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a  s.  ** time..  *
1f290 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67  /.  rc = pager_g
1f2a0 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b  et_content(pPg);
1f2b0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1f2c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1f2d0 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
1f2e0 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49  age as dirty.  I
1f2f0 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61  f the page has a
1f300 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
1f310 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
1f320 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20  journal then we 
1f330 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74  can return right
1f340 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61   away..  */.  ma
1f350 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
1f360 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  if( pPg->inJourn
1f370 61 6c 20 26 26 20 28 70 61 67 65 49 6e 53 74 61  al && (pageInSta
1f380 74 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c 20 70  tement(pPg) || p
1f390 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1f3a0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67  ==0) ){.    pPag
1f3b0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
1f3c0 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20   1;.  }else{..  
1f3d0 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
1f3e0 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
1f3f0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
1f400 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
1f410 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ** written to th
1f420 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
1f430 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65  urnal or the cke
1f440 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a  ckpoint journal.
1f450 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a      ** or both..
1f460 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69      **.    ** Fi
1f470 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65  rst check to see
1f480 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
1f490 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78  ction journal ex
1f4a0 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ists and.    ** 
1f4b0 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20  create it if it 
1f4c0 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f  does not..    */
1f4d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1f4e0 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
1f4f0 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  R_UNLOCK );.    
1f500 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f510 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a  rBegin(pPg, 0);.
1f520 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f530 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1f540 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1f550 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1f560 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1f570 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20  _RESERVED );.   
1f580 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
1f590 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
1f5a0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
1f5b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1f5c0 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1f5d0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1f5e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f5f0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1f600 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1f610 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1f620 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d  Open || !pPager-
1f630 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
1f640 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
1f650 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20  Cache = 1;.  .  
1f660 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
1f670 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
1f680 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
1f690 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
1f6a0 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
1f6b0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1f6c0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
1f6d0 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
1f6e0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
1f6f0 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
1f700 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
1f710 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
1f720 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
1f730 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d  */.    if( !pPg-
1f740 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
1f750 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
1f760 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20  l || MEMDB) ){. 
1f770 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50       if( (int)pP
1f780 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
1f790 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
1f7a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50  .        int szP
1f7b0 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d  g;.        if( M
1f7c0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
1f7d0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
1f7e0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
1f7f0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
1f800 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
1f810 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20  TRACE3("JOURNAL 
1f820 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
1f830 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1f840 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1f850 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
1f860 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b  ist->pOrig==0 );
1f870 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74  .          pHist
1f880 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65  ->pOrig = sqlite
1f890 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  3_malloc( pPager
1f8a0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
1f8b0 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
1f8c0 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20  t->pOrig ){.    
1f8d0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
1f8e0 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48  Hist->pOrig, PGH
1f8f0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1f900 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1f910 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
1f920 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f930 20 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73           u32 cks
1f940 75 6d 2c 20 73 61 76 65 64 3b 0a 20 20 20 20 20  um, saved;.     
1f950 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
1f960 32 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 20  2, *pEnd;..     
1f970 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c       /* We shoul
1f980 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f  d never write to
1f990 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1f9a0 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a  e the page that.
1f9b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
1f9c0 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61  tains the databa
1f9d0 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66  se locks.  The f
1f9e0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
1f9f0 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20  verifies.       
1fa00 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
1fa10 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
1fa20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1fa30 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
1fa40 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
1fa50 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32 20           pData2 
1fa60 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
1fa70 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
1fa80 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20  o, 7);.         
1fa90 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63   cksum = pager_c
1faa0 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
1fab0 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  *)pData2);.     
1fac0 20 20 20 20 20 70 45 6e 64 20 3d 20 70 44 61 74       pEnd = pDat
1fad0 61 32 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67  a2 + pPager->pag
1fae0 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20  eSize;.         
1faf0 20 70 44 61 74 61 32 20 2d 3d 20 34 3b 0a 20 20   pData2 -= 4;.  
1fb00 20 20 20 20 20 20 20 20 73 61 76 65 64 20 3d 20          saved = 
1fb10 2a 28 75 33 32 2a 29 70 45 6e 64 3b 0a 20 20 20  *(u32*)pEnd;.   
1fb20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
1fb30 28 70 45 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a 20  (pEnd, cksum);. 
1fb40 20 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20           szPg = 
1fb50 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1fb60 2b 38 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  +8;.          pu
1fb70 74 33 32 62 69 74 73 28 70 44 61 74 61 32 2c 20  t32bits(pData2, 
1fb80 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1fb90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1fba0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1fbb0 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 73  ->jfd, pData2, s
1fbc0 7a 50 67 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zPg, pPager->jou
1fbd0 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20  rnalOff);.      
1fbe0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f      IOTRACE(("JO
1fbf0 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64  UT %p %d %lld %d
1fc00 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
1fc10 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
1fc20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
1fc30 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 73  r->journalOff, s
1fc40 7a 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20  zPg));.         
1fc50 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
1fc60 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
1fc70 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20  _count);.       
1fc80 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1fc90 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20  alOff += szPg;. 
1fca0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52           PAGERTR
1fcb0 41 43 45 35 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE5("JOURNAL %d
1fcc0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
1fcd0 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  c=%d hash(%08x)\
1fce0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1fcf0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1fd00 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
1fd10 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 61  Pg->needSync, pa
1fd20 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
1fd30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28  ));.          *(
1fd40 75 33 32 2a 29 70 45 6e 64 20 3d 20 73 61 76 65  u32*)pEnd = save
1fd50 64 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  d;..          /*
1fd60 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   An error has oc
1fd70 63 75 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f  cured writing to
1fd80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1fd90 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20  e. The .        
1fda0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1fdb0 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20   will be rolled 
1fdc0 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65  back by the laye
1fdd0 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  r above..       
1fde0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1fdf0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fe00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1fe10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1fe20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1fe30 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b     pPager->nRec+
1fe40 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  +;.          ass
1fe50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
1fe60 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
1fe70 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1fe80 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e  aInJournal[pPg->
1fe90 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1fea0 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1feb0 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64         pPg->need
1fec0 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
1fed0 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20  noSync;.        
1fee0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1fef0 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  mtInUse ){.     
1ff00 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
1ff10 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
1ff20 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
1ff30 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
1ff40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1ff50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ff60 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
1ff70 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  c = !pPager->jou
1ff80 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21  rnalStarted && !
1ff90 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
1ffa0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1ffb0 43 45 34 28 22 41 50 50 45 4e 44 20 25 64 20 70  CE4("APPEND %d p
1ffc0 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
1ffd0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
1ffe0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1fff0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
20000 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
20010 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20020 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
20030 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  nc ){.        pP
20040 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
20050 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
20060 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
20070 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20   = 1;.    }.  . 
20080 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
20090 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
200a0 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
200b0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
200c0 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72  ,.    ** then wr
200d0 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
200e0 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74  page to the stat
200f0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
20100 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  Note that.    **
20110 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
20120 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69  ournal format di
20130 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73  ffers from the s
20140 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20  tandard journal 
20150 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e  format.    ** in
20160 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74   that it omits t
20170 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64  he checksums and
20180 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20   the header..   
20190 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
201a0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20  er->stmtInUse . 
201b0 20 20 20 20 26 26 20 21 70 61 67 65 49 6e 53 74      && !pageInSt
201c0 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a 20 20  atement(pPg) .  
201d0 20 20 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e     && (int)pPg->
201e0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
201f0 6d 74 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20  mtSize .    ){. 
20200 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
20210 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
20220 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50  int)pPg->pgno>pP
20230 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
20240 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45   );.      if( ME
20250 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50  MDB ){.        P
20260 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
20270 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
20280 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
20290 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
202a0 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b  ist->pStmt==0 );
202b0 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e  .        pHist->
202c0 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f  pStmt = sqlite3_
202d0 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e  malloc( pPager->
202e0 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
202f0 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
20300 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
20310 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e    memcpy(pHist->
20320 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f  pStmt, PGHDR_TO_
20330 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
20340 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
20350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20360 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4d  PAGERTRACE3("STM
20370 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
20380 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
20390 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
203a0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 61  gno);.        pa
203b0 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
203c0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ist(pPg);.      
203d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
203e0 36 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67  64 offset = pPag
203f0 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2a 28 34 2b  er->stmtNRec*(4+
20400 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
20410 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  );.        char 
20420 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32  *pData2 = CODEC2
20430 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
20440 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b  pPg->pgno, 7)-4;
20450 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69  .        put32bi
20460 74 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e  ts(pData2, pPg->
20470 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72  pgno);.        r
20480 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
20490 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  te(pPager->stfd,
204a0 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
204b0 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 6f 66 66  >pageSize+4, off
204c0 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41  set);.        PA
204d0 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d  GERTRACE3("STMT-
204e0 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
204f0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
20500 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
20510 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
20520 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
20530 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
20540 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
20550 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
20560 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20  stmtNRec++;.    
20570 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
20580 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29  er->aInStmt!=0 )
20590 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
205a0 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
205b0 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
205c0 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
205d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
205e0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
205f0 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64  atabase size and
20600 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20   return..  */.  
20610 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20620 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
20630 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61  RED );.  if( pPa
20640 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74  ger->dbSize<(int
20650 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  )pPg->pgno ){.  
20660 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
20670 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
20680 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20    if( !MEMDB && 
20690 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
206a0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61  PENDING_BYTE/pPa
206b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
206c0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
206d0 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20  bSize++;.    }. 
206e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
206f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
20700 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
20710 6f 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61  o mark a data-pa
20720 67 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20  ge as writable. 
20730 49 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65  It uses .** page
20740 72 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65  r_write() to ope
20750 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
20760 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
20770 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20  lready open).** 
20780 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 70 61  and write the pa
20790 67 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65  ge *pData to the
207a0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
207b0 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
207c0 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63  etween this func
207d0 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77  tion and pager_w
207e0 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74  rite() is that t
207f0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
20800 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20  also deals with 
20810 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  the special case
20820 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65   where 2 or more
20830 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e   pages.** fit on
20840 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73   a single disk s
20850 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63  ector. In this c
20860 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64  ase all co-resid
20870 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73  ent pages.** mus
20880 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  t have been writ
20890 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
208a0 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72  al file before r
208b0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  eturning..*/.int
208c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
208d0 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61  te(DbPage *pDbPa
208e0 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
208f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67  SQLITE_OK;..  Pg
20900 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61  Hdr *pPg = pDbPa
20910 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge;.  Pager *pPa
20920 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
20930 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50  r;.  Pgno nPageP
20940 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67  erSector = (pPag
20950 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70  er->sectorSize/p
20960 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
20970 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  ;..  pagerEnter(
20980 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21  pPager);.  if( !
20990 4d 45 4d 44 42 20 26 26 20 6e 50 61 67 65 50 65  MEMDB && nPagePe
209a0 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  rSector>1 ){.   
209b0 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74   Pgno nPageCount
209c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
209d0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
209e0 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
209f0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  file */.    Pgno
20a00 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20   pg1;           
20a10 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70        /* First p
20a20 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
20a30 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
20a40 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20   on. */.    int 
20a50 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
20a60 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20a70 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e  of pages startin
20a80 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72  g at pg1 to jour
20a90 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  nal */.    int i
20aa0 69 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53  i;.    int needS
20ab0 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
20ac0 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79   Set the doNotSy
20ad0 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68  nc flag to 1. Th
20ae0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65  is is because we
20af0 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20   cannot allow a 
20b00 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68  journal.    ** h
20b10 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74  eader to be writ
20b20 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20  ten between the 
20b30 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20  pages journaled 
20b40 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
20b50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
20b60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
20b70 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  otSync==0 );.   
20b80 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
20b90 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 1;..    /* 
20ba0 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d  This trick assum
20bb0 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65  es that both the
20bc0 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
20bd0 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20  ector-size are. 
20be0 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72     ** an integer
20bf0 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20   power of 2. It 
20c00 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67  sets variable pg
20c10 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66  1 to the identif
20c20 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ier.    ** of th
20c30 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
20c40 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
20c50 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20  s located on..  
20c60 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28    */.    pg1 = (
20c70 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20  (pPg->pgno-1) & 
20c80 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ~(nPagePerSector
20c90 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e  -1)) + 1;..    n
20ca0 50 61 67 65 43 6f 75 6e 74 20 3d 20 73 71 6c 69  PageCount = sqli
20cb0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
20cc0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  t(pPager);.    i
20cd0 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61  f( pPg->pgno>nPa
20ce0 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
20cf0 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70   nPage = (pPg->p
20d00 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20  gno - pg1)+1;.  
20d10 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31    }else if( (pg1
20d20 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  +nPagePerSector-
20d30 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  1)>nPageCount ){
20d40 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
20d50 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b  PageCount+1-pg1;
20d60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20d70 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50    nPage = nPageP
20d80 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a  erSector;.    }.
20d90 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65      assert(nPage
20da0 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  >0);.    assert(
20db0 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b  pg1<=pPg->pgno);
20dc0 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31  .    assert((pg1
20dd0 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e  +nPage)>pPg->pgn
20de0 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d  o);..    for(ii=
20df0 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72  0; ii<nPage && r
20e00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69  c==SQLITE_OK; ii
20e10 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ++){.      Pgno 
20e20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20  pg = pg1+ii;.   
20e30 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b     PgHdr *pPage;
20e40 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
20e50 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 7c  er->aInJournal |
20e60 7c 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20  | pg==pPg->pgno 
20e70 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70 67  || .          pg
20e80 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
20e90 69 7a 65 20 7c 7c 20 21 28 70 50 61 67 65 72 2d  ize || !(pPager-
20ea0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 2f 38  >aInJournal[pg/8
20eb0 5d 26 28 31 3c 3c 28 70 67 26 37 29 29 29 0a 20  ]&(1<<(pg&7))). 
20ec0 20 20 20 20 20 29 20 7b 0a 20 20 20 20 20 20 20       ) {.       
20ed0 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d   if( pg!=PAGER_M
20ee0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
20ef0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
20f00 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
20f10 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50  (pPager, pg, &pP
20f20 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
20f30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20f40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
20f50 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
20f60 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
20f70 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
20f80 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
20f90 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53             needS
20fa0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
20fb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20fc0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
20fd0 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
20fe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20ff0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
21000 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65  f( (pPage = page
21010 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
21020 20 70 67 29 29 20 29 7b 0a 20 20 20 20 20 20 20   pg)) ){.       
21030 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 65 65 64   if( pPage->need
21040 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
21050 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
21060 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21070 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
21080 49 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  If the PgHdr.nee
21090 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  dSync flag is se
210a0 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65  t for any of the
210b0 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20   nPage pages .  
210c0 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
210d0 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65   pg1, then it ne
210e0 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f  eds to be set fo
210f0 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42  r all of them. B
21100 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72  ecause.    ** wr
21110 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20  iting to any of 
21120 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65  these nPage page
21130 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65  s may damage the
21140 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20   others, the.   
21150 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
21160 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79   must contain sy
21170 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66  nc()ed copies of
21180 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20   all of them.   
21190 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f   ** before any o
211a0 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72  f them can be wr
211b0 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
211c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
211d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
211e0 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
211f0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
21200 61 67 65 20 26 26 20 6e 65 65 64 53 79 6e 63 3b  age && needSync;
21210 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
21220 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70  PgHdr *pPage = p
21230 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
21240 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20  er, pg1+ii);.   
21250 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29       if( pPage )
21260 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63   pPage->needSync
21270 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
21280 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
21290 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  r->needSync);.  
212a0 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
212b0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
212c0 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61  nc==1 );.    pPa
212d0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
212e0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
212f0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
21300 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  e(pDbPage);.  }.
21310 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
21320 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
21330 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
21340 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
21350 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
21360 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
21370 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
21380 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
21390 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  erWrite().  In o
213a0 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
213b0 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
213c0 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
213d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
213e0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  the page..*/.#if
213f0 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
21400 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
21410 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a  iteable(DbPage *
21420 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
21430 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65 6e  Pg->dirty;.}.#en
21440 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
21450 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a  ITE_OMIT_VACUUM.
21460 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68  /*.** Replace th
21470 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73  e content of a s
21480 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68 20  ingle page with 
21490 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
214a0 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20  in the third.** 
214b0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
214c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 76 65   sqlite3PagerOve
214d0 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  rwrite(Pager *pP
214e0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
214f0 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20   void *pData){. 
21500 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
21510 6e 74 20 72 63 3b 0a 0a 20 20 70 61 67 65 72 45  nt rc;..  pagerE
21520 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
21530 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21540 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e  rGet(pPager, pgn
21550 6f 2c 20 26 70 50 67 29 3b 0a 20 20 69 66 28 20  o, &pPg);.  if( 
21560 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21570 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
21580 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29  3PagerWrite(pPg)
21590 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
215a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
215b0 20 6d 65 6d 63 70 79 28 73 71 6c 69 74 65 33 50   memcpy(sqlite3P
215c0 61 67 65 72 47 65 74 44 61 74 61 28 70 50 67 29  agerGetData(pPg)
215d0 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
215e0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
215f0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
21600 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
21610 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  }.  pagerLeave(p
21620 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
21630 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
21640 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
21650 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
21660 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
21670 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
21680 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65  sary to.** write
21690 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
216a0 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63   on page pPg bac
216b0 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
216c0 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
216d0 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
216e0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
216f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72  ..**.** The over
21700 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c  lying software l
21710 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ayer calls this 
21720 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c  routine when all
21730 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20   of the data.** 
21740 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
21750 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68  e is unused.  Th
21760 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
21770 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
21780 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
21790 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
217a0 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
217b0 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
217c0 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
217d0 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69  ion, together wi
217e0 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  th the.** sqlite
217f0 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
21800 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65  ck() below, more
21810 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65   than double the
21820 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72   speed.** of lar
21830 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  ge INSERT operat
21840 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70  ions and quadrup
21850 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20  le the speed of 
21860 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a  large DELETEs..*
21870 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
21880 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
21890 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73  , set the always
218a0 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f  Rollback flag to
218b0 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71   true..** Subseq
218c0 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
218d0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
218e0 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65  llback() for the
218f0 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69   same page.** wi
21900 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20 62 65  ll thereafter be
21910 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20   ignored.  This 
21920 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
21930 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a  avoid a problem.
21940 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67 65 20  ** where a page 
21950 77 69 74 68 20 64 61 74 61 20 69 73 20 61 64 64  with data is add
21960 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
21970 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61  st during one pa
21980 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73  rt of.** a trans
21990 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f  action then remo
219a0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ved from the fre
219b0 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c  elist during a l
219c0 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ater part.** of 
219d0 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63  the same transac
219e0 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20  tion and reused 
219f0 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
21a00 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74  urpose.  When it
21a10 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64 64  .** is first add
21a20 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
21a30 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  st, this routine
21a40 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65   is called.  Whe
21a50 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65  n reused,.** the
21a60 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
21a70 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74  tRollback() rout
21a80 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  ine is called.  
21a90 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 0a  But because the.
21aa0 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ** page contains
21ab0 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20   critical data, 
21ac0 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
21ad0 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73   be sure it gets
21ae0 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
21af0 69 6e 20 73 70 69 74 65 20 6f 66 20 74 68 65 20  in spite of the 
21b00 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
21b10 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e  Rollback() call.
21b20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21b30 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 44  PagerDontWrite(D
21b40 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
21b50 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
21b60 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72  pDbPage;.  Pager
21b70 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
21b80 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 4d  pPager;..  if( M
21b90 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20  EMDB ) return;. 
21ba0 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
21bb0 65 72 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61  er);.  pPg->alwa
21bc0 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ysRollback = 1;.
21bd0 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
21be0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d   && !pPager->stm
21bf0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73  tInUse ){.    as
21c00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
21c10 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
21c20 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  D );.    if( pPa
21c30 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e  ger->dbSize==(in
21c40 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70  t)pPg->pgno && p
21c50 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
21c60 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e<pPager->dbSize
21c70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
21c80 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68  this pages is th
21c90 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74  e last page in t
21ca0 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  he file and the 
21cb0 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20  file has grown. 
21cc0 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74       ** during t
21cd0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
21ce0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20  action, then do 
21cf0 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67  NOT mark the pag
21d00 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20  e as clean..    
21d10 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61    ** When the da
21d20 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77  tabase file grow
21d30 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20  s, we must make 
21d40 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61  sure that the la
21d50 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  st page.      **
21d60 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74   gets written at
21d70 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74   least once so t
21d80 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c  hat the disk fil
21d90 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f  e will be the co
21da0 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73  rrect.      ** s
21db0 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e  ize. If you do n
21dc0 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61  ot write this pa
21dd0 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ge and the size 
21de0 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  of the file.    
21df0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b    ** on the disk
21e00 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74   ends up being t
21e10 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63  oo small, that c
21e20 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
21e30 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  ase.      ** cor
21e40 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74  ruption during t
21e50 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74  he next transact
21e60 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
21e70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
21e80 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54  AGERTRACE3("DONT
21e90 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f  _WRITE page %d o
21ea0 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
21eb0 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
21ec0 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  er));.      IOTR
21ed0 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25  ACE(("CLEAN %p %
21ee0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
21ef0 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20 20  g->pgno)).      
21f00 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
21f10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
21f20 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20  ECK_PAGES.      
21f30 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
21f40 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
21f50 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
21f60 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61  }.  }.  pagerLea
21f70 76 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  ve(pPager);.}../
21f80 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
21f90 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
21fa0 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
21fb0 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   if a rollback o
21fc0 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ccurs,.** it is 
21fd0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
21fe0 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
21ff0 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  a on the given p
22000 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65  age.  This.** me
22010 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
22020 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
22030 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67   to record the g
22040 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65  iven page in the
22050 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  .** rollback jou
22060 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  rnal..**.** If w
22070 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 61  e have not yet a
22080 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74 68 65  ctually read the
22090 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73   content of this
220a0 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74 68 65   page (if.** the
220b0 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20   PgHdr.needRead 
220c0 66 6c 61 67 20 69 73 20 73 65 74 29 20 74 68 65  flag is set) the
220d0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
220e0 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69 73 65  cts as a promise
220f0 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c  .** that we will
22100 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20 72   never need to r
22110 65 61 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ead the page con
22120 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  tent in the futu
22130 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65  re..** so the ne
22140 65 64 52 65 61 64 20 66 6c 61 67 20 63 61 6e 20  edRead flag can 
22150 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 74 68  be cleared at th
22160 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69  is point..*/.voi
22170 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  d sqlite3PagerDo
22180 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67  ntRollback(DbPag
22190 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
221a0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
221b0 70 50 61 67 65 72 3b 0a 0a 20 20 70 61 67 65 72  pPager;..  pager
221c0 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
221d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
221e0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
221f0 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20  SERVED );.  if( 
22200 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22210 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pen==0 ) return;
22220 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
22230 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50  ysRollback || pP
22240 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
22250 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20  back || MEMDB ) 
22260 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70  return;.  if( !p
22270 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
22280 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
22290 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
222a0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73  bSize ){.    ass
222b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
222c0 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
222d0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
222e0 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
222f0 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
22300 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e  no&7);.    pPg->
22310 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
22320 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64     pPg->needRead
22330 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
22340 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
22350 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
22360 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
22370 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
22380 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 7d  ->pgno&7);.    }
22390 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33  .    PAGERTRACE3
223a0 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  ("DONT_ROLLBACK 
223b0 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
223c0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47  , pPg->pgno, PAG
223d0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
223e0 20 20 20 49 4f 54 52 41 43 45 28 28 22 47 41 52     IOTRACE(("GAR
223f0 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c 20 70  BAGE %p %d\n", p
22400 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
22410 29 29 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  )).  }.  if( pPa
22420 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a  ger->stmtInUse .
22430 20 20 20 26 26 20 21 70 61 67 65 49 6e 53 74 61     && !pageInSta
22440 74 65 6d 65 6e 74 28 70 50 67 29 20 0a 20 20 20  tement(pPg) .   
22450 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
22460 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
22470 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 61 73  ize .  ){.    as
22480 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
22490 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
224a0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
224b0 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
224c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
224d0 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20  >aInStmt!=0 );. 
224e0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
224f0 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
22500 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
22510 26 37 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  &7);.  }.  pager
22520 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 7d  Leave(pPager);.}
22530 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
22540 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
22550 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
22560 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
22570 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a  hange-counter,.*
22580 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65  * stored at byte
22590 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72   24 of the pager
225a0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
225b0 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f   int pager_incr_
225c0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61  changecounter(Pa
225d0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
225e0 20 69 73 44 69 72 65 63 74 29 7b 0a 20 20 50 67   isDirect){.  Pg
225f0 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75  Hdr *pPgHdr;.  u
22600 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  32 change_counte
22610 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
22620 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
22630 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43  !pPager->changeC
22640 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20 20 20 20  ountDone ){.    
22650 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f  /* Open page 1 o
22660 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77  f the file for w
22670 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72  riting. */.    r
22680 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
22690 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26  Get(pPager, 1, &
226a0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
226b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
226c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
226d0 20 69 66 28 20 21 69 73 44 69 72 65 63 74 20 29   if( !isDirect )
226e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
226f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
22700 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 69 66  PgHdr);.      if
22710 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22720 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
22730 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
22740 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
22750 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
22760 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
22770 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68  te 24. */.    ch
22780 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73  ange_counter = s
22790 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28  qlite3Get4byte((
227a0 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69  u8*)pPager->dbFi
227b0 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 63 68 61  leVers);.    cha
227c0 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
227d0 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
227e0 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
227f0 54 41 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20  TA(pPgHdr))+24, 
22800 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
22810 0a 0a 20 20 20 20 69 66 28 20 69 73 44 69 72 65  ..    if( isDire
22820 63 74 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64  ct && pPager->fd
22830 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
22840 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
22850 7a 42 75 66 20 3d 20 50 47 48 44 52 5f 54 4f 5f  zBuf = PGHDR_TO_
22860 44 41 54 41 28 70 50 67 48 64 72 29 3b 0a 20 20  DATA(pPgHdr);.  
22870 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22880 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
22890 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72  fd, zBuf, pPager
228a0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a  ->pageSize, 0);.
228b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
228c0 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
228d0 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20  eference. */.   
228e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
228f0 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ef(pPgHdr);.    
22900 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
22910 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d  untDone = 1;.  }
22920 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22930 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
22940 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
22950 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67  r the pager pPag
22960 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  er. zMaster poin
22970 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a  ts to the name.*
22980 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * of a master jo
22990 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
229a0 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
229b0 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76  n into the indiv
229c0 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  idual.** journal
229d0 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d   file. zMaster m
229e0 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63  ay be NULL, whic
229f0 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
22a00 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   as no master.**
22a10 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67   journal (a sing
22a20 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
22a30 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
22a40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
22a50 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f  ures that the jo
22a60 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c  urnal is synced,
22a70 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
22a80 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74   written.** to t
22a90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22aa0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
22ab0 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54  e file synced. T
22ac0 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
22ad0 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f  at.** remains to
22ae0 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
22af0 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65  saction is to de
22b00 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
22b10 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73   file (or.** mas
22b20 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
22b30 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a   if specified)..
22b40 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
22b50 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c  if zMaster==NULL
22b60 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  , this does not 
22b70 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76  overwrite a prev
22b80 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61  ious value.** pa
22b90 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74  ssed to an sqlit
22ba0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
22bb0 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a  seOne() call..**
22bc0 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
22bd0 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a   nTrunc is non-z
22be0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61  ero, then the pa
22bf0 67 65 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e  ger file is trun
22c00 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75  cated to.** nTru
22c10 6e 63 20 70 61 67 65 73 20 28 74 68 69 73 20 69  nc pages (this i
22c20 73 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76  s used by auto-v
22c30 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 29  acuum databases)
22c40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22c50 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
22c60 4f 6e 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  One(Pager *pPage
22c70 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
22c80 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72  Master, Pgno nTr
22c90 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  unc){.  int rc =
22ca0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
22cb0 41 47 45 52 54 52 41 43 45 34 28 22 44 41 54 41  AGERTRACE4("DATA
22cc0 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d  BASE SYNC: File=
22cd0 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54  %s zMaster=%s nT
22ce0 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  runc=%d\n", .   
22cf0 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
22d00 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  name, zMaster, n
22d10 54 72 75 6e 63 29 3b 0a 20 20 70 61 67 65 72 45  Trunc);.  pagerE
22d20 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 0a 20  nter(pPager);.. 
22d30 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
22d40 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20  n in-memory db, 
22d50 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65  or no pages have
22d60 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
22d70 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66  , or this.  ** f
22d80 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  unction has alre
22d90 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ady been called,
22da0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
22db0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
22dc0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
22dd0 53 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42  SYNCED && !MEMDB
22de0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74   && pPager->dirt
22df0 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67  yCache ){.    Pg
22e00 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73  Hdr *pPg;.    as
22e10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
22e20 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 23 69  urnalOpen );..#i
22e30 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
22e40 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
22e50 20 20 20 20 2f 2a 20 54 68 65 20 61 74 6f 6d 69      /* The atomi
22e60 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
22e70 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
22e80 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20   if all of the. 
22e90 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
22ea0 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a  are true:.    **
22eb0 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
22ec0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70   file-system sup
22ed0 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63  ports the atomic
22ee0 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20  -write property 
22ef0 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  for.    **      
22f00 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70  blocks of size p
22f10 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 0a 20 20  age-size, and.  
22f20 20 20 2a 2a 20 20 20 20 2b 20 54 68 69 73 20 63    **    + This c
22f30 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72  ommit is not par
22f40 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c  t of a multi-fil
22f50 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
22f60 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 45  nd.    **    + E
22f70 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20  xactly one page 
22f80 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
22f90 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74  d and store in t
22fa0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
22fb0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
22fc0 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
22fd0 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20  on can be used, 
22fe0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
22ff0 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72   file will never
23000 0a 20 20 20 20 2a 2a 20 62 65 20 63 72 65 61 74  .    ** be creat
23010 65 64 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e  ed for this tran
23020 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  saction..    */.
23030 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72      if( !zMaster
23040 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
23050 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66  nalOff==jrnlBuff
23060 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20 26  erSize(pPager) &
23070 26 20 6e 54 72 75 6e 63 3d 3d 30 0a 20 20 20 20  & nTrunc==0.    
23080 20 20 26 26 20 28 30 3d 3d 70 50 61 67 65 72 2d    && (0==pPager-
23090 3e 70 44 69 72 74 79 20 7c 7c 20 30 3d 3d 70 50  >pDirty || 0==pP
230a0 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 44  ager->pDirty->pD
230b0 69 72 74 79 29 0a 20 20 20 20 29 7b 0a 20 20 20  irty).    ){.   
230c0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
230d0 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74   nRec field in t
230e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
230f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 66   */.      int of
23100 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
23110 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65  ournalHdr + size
23120 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
23130 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
23140 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 31 29  pPager->nRec==1)
23150 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
23160 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
23170 3e 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50  >jfd, offset, pP
23180 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20  ager->nRec);..  
23190 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
231a0 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65  e db file change
231b0 20 63 6f 75 6e 74 65 72 2e 20 54 68 65 20 66 6f   counter. The fo
231c0 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c  llowing call wil
231d0 6c 20 6d 6f 64 69 66 79 0a 20 20 20 20 20 20 2a  l modify.      *
231e0 2a 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  * the in-memory 
231f0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
23200 66 20 70 61 67 65 20 31 20 74 6f 20 69 6e 63 6c  f page 1 to incl
23210 75 64 65 20 74 68 65 20 75 70 64 61 74 65 64 0a  ude the updated.
23220 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 20        ** change 
23230 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e  counter and then
23240 20 77 72 69 74 65 20 70 61 67 65 20 31 20 64 69   write page 1 di
23250 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61  rectly to the da
23260 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
23270 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66  file. Because of
23280 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
23290 65 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  e property of th
232a0 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74  e host file-syst
232b0 65 6d 2c 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  em, .      ** th
232c0 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20  is is safe..    
232d0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
232e0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
232f0 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
23300 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 0a   1);.    }else .
23310 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
23320 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
23330 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73  al file name has
23340 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
23350 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20  itten to the.   
23360 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
23370 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69  , then no sync i
23380 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  s required. This
23390 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74   happens when it
233a0 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   is.    ** writt
233b0 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  en, then the pro
233c0 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70  cess fails to up
233d0 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53  grade from a RES
233e0 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20  ERVED to an.    
233f0 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
23400 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65  k. The next time
23410 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69   the process tri
23420 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  es to commit the
23430 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
23440 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65  ion the m-j name
23450 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
23460 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e  dy been written.
23470 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
23480 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
23490 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  er ){.      rc =
234a0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
234b0 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
234c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
234d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
234e0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
234f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
23500 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
23510 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21       if( nTrunc!
23520 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
23530 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   If this transac
23540 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68  tion has made th
23550 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c  e database small
23560 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  er, then all pag
23570 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65  es.        ** be
23580 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79  ing discarded by
23590 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20   the truncation 
235a0 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20  must be written 
235b0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
235c0 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a         ** file..
235d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
235e0 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20     Pgno i;.     
235f0 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50     int iSkip = P
23600 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
23610 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  ger);.        fo
23620 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69  r( i=nTrunc+1; i
23630 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
23640 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  Size; i++ ){.   
23650 20 20 20 20 20 20 20 69 66 28 20 21 28 70 50 61         if( !(pPa
23660 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
23670 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29  i/8] & (1<<(i&7)
23680 29 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29  )) && i!=iSkip )
23690 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
236a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
236b0 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70  et(pPager, i, &p
236c0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
236d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
236e0 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
236f0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xit;.           
23700 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
23710 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20  erWrite(pPg);.  
23720 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23730 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
23740 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
23750 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23760 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
23770 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
23780 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d        } .      }
23790 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
237a0 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f   = writeMasterJo
237b0 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d  urnal(pPager, zM
237c0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66  aster);.      if
237d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
237e0 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
237f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  ;.      rc = syn
23800 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
23810 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
23820 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
23830 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
23840 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23850 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
23860 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
23870 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
23880 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
23890 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72  cate(pPager, nTr
238a0 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  unc);.      if( 
238b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
238c0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
238d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
238e0 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64    /* Write all d
238f0 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68  irty pages to th
23900 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
23910 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  */.    pPg = pag
23920 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
23930 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a  _pages(pPager);.
23940 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
23950 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
23960 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
23970 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23980 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 26 26     while( pPg &&
23990 20 21 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 20   !pPg->dirty ){ 
239a0 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  pPg = pPg->pDirt
239b0 79 3b 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65  y; }.      pPage
239c0 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b  r->pDirty = pPg;
239d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 79 6e 63  .      goto sync
239e0 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
239f0 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
23a00 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e  = 0;..    /* Syn
23a10 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
23a20 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
23a30 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
23a40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
23a50 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
23a60 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
23a70 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20  sync_flags);.   
23a80 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
23a90 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  "DBSYNC %p\n", p
23aa0 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61  Pager))..    pPa
23ab0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
23ac0 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c  ER_SYNCED;.  }el
23ad0 73 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20  se if( MEMDB && 
23ae0 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
23af0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
23b00 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  erTruncate(pPage
23b10 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a  r, nTrunc);.  }.
23b20 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 69 66  .sync_exit:.  if
23b30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
23b40 52 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  RR_BLOCKED ){.  
23b50 20 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    /* pager_incr_
23b60 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
23b70 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  may attempt to o
23b80 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69  btain an exclusi
23b90 76 65 0a 20 20 20 20 20 2a 20 6c 6f 63 6b 20 74  ve.     * lock t
23ba0 6f 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68  o spill the cach
23bb0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4f 45  e and return IOE
23bc0 52 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20  RR_BLOCKED. But 
23bd0 73 69 6e 63 65 20 0a 20 20 20 20 20 2a 20 74 68  since .     * th
23be0 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
23bf0 20 74 68 65 20 63 61 63 68 65 20 69 73 20 69 6e   the cache is in
23c00 63 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74 27 73  consistent, it's
23c10 0a 20 20 20 20 20 2a 20 62 65 74 74 65 72 20 74  .     * better t
23c20 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
23c30 42 55 53 59 2e 0a 20 20 20 20 20 2a 2f 0a 20 20  BUSY..     */.  
23c40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
23c50 53 59 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c  SY;.  }.  pagerL
23c60 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
23c70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
23c80 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20  *.** Commit all 
23c90 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
23ca0 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65  atabase and rele
23cb0 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
23cc0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
23cd0 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f   commit fails fo
23ce0 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20  r any reason, a 
23cf0 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74  rollback attempt
23d00 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20   is made.** and 
23d10 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
23d20 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74   returned.  If t
23d30 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64  he commit worked
23d40 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  , SQLITE_OK.** i
23d50 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
23d60 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
23d70 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61  ommitPhaseTwo(Pa
23d80 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
23d90 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
23da0 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61  *pPg;..  if( pPa
23db0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
23dc0 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
23dd0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
23de0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
23df0 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
23e00 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
23e10 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
23e20 20 7d 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28   }.  pagerEnter(
23e30 70 50 61 67 65 72 29 3b 0a 20 20 50 41 47 45 52  pPager);.  PAGER
23e40 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25  TRACE2("COMMIT %
23e50 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
23e60 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45  ager));.  if( ME
23e70 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d  MDB ){.    pPg =
23e80 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64   pager_get_all_d
23e90 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65  irty_pages(pPage
23ea0 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  r);.    while( p
23eb0 50 67 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69  Pg ){.      PgHi
23ec0 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
23ed0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
23ee0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
23ef0 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48   clearHistory(pH
23f00 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  ist);.      pPg-
23f10 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
23f20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
23f30 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
23f40 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
23f50 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
23f60 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48  nc = 0;.      pH
23f70 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  ist->pPrevStmt =
23f80 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d   pHist->pNextStm
23f90 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  t = 0;.      pPg
23fa0 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a   = pPg->pDirty;.
23fb0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
23fc0 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 23 69  ->pDirty = 0;.#i
23fd0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
23fe0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
23ff0 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
24000 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
24010 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
24020 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
24030 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
24040 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
24050 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52  t( !pPg->alwaysR
24060 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  ollback );.     
24070 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d   assert( !pHist-
24080 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
24090 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
240a0 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23  pStmt );.    }.#
240b0 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65 72  endif.    pPager
240c0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
240d0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
240e0 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
240f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24100 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
24110 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
24120 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65  alOpen || !pPage
24130 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b  r->dirtyCache );
24140 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24150 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
24160 53 59 4e 43 45 44 20 7c 7c 20 21 70 50 61 67 65  SYNCED || !pPage
24170 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b  r->dirtyCache );
24180 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e  .  rc = pager_en
24190 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
241a0 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61  ager);.  rc = pa
241b0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
241c0 2c 20 72 63 29 3b 0a 20 20 70 61 67 65 72 4c 65  , rc);.  pagerLe
241d0 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
241e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
241f0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  ** Rollback all 
24200 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61  changes.  The da
24210 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63  tabase falls bac
24220 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  k to PAGER_SHARE
24230 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69  D mode..** All i
24240 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70  n-memory cache p
24250 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74  ages revert to t
24260 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61  heir original da
24270 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20  ta contents..** 
24280 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  The journal is d
24290 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
242a0 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f  is routine canno
242b0 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f  t fail unless so
242c0 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
242d0 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
242e0 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  g.** the correct
242f0 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f   locking protoco
24300 6c 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65  l or unless some
24310 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73   other.** proces
24320 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61  s is writing tra
24330 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  sh into the jour
24340 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45  nal file (SQLITE
24350 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20  _CORRUPT) or.** 
24360 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d  unless a prior m
24370 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28  alloc() failed (
24380 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20  SQLITE_NOMEM).  
24390 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  Appropriate erro
243a0 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72  r.** codes are r
243b0 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20  eturned for all 
243c0 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e  these occasions.
243d0 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20    Otherwise,.** 
243e0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
243f0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
24400 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
24410 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
24420 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
24430 41 47 45 52 54 52 41 43 45 32 28 22 52 4f 4c 4c  AGERTRACE2("ROLL
24440 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
24450 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
24460 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
24470 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66   PgHdr *p;.    f
24480 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c  or(p=pPager->pAl
24490 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  l; p; p=p->pNext
244a0 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69  All){.      PgHi
244b0 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20  story *pHist;.  
244c0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e      assert( !p->
244d0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
244e0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e  ;.      if( !p->
244f0 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20  dirty ){.       
24500 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69   assert( !((PgHi
24510 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f  story *)PGHDR_TO
24520 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
24530 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20  )->pOrig );.    
24540 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50      assert( !((P
24550 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52  gHistory *)PGHDR
24560 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67  _TO_HIST(p, pPag
24570 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  er))->pStmt );. 
24580 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
24590 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
245a0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
245b0 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
245c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69 73  ;.      if( pHis
245d0 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20  t->pOrig ){.    
245e0 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52      memcpy(PGHDR
245f0 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69  _TO_DATA(p), pHi
24600 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65  st->pOrig, pPage
24610 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
24620 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
24630 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45  3("ROLLBACK-PAGE
24640 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d   %d of %d\n", p-
24650 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
24660 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d  Pager));.      }
24670 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50 41  else{.        PA
24680 47 45 52 54 52 41 43 45 33 28 22 50 41 47 45 20  GERTRACE3("PAGE 
24690 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25  %d is clean on %
246a0 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50  d\n", p->pgno, P
246b0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
246c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
246d0 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73  learHistory(pHis
246e0 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72  t);.      p->dir
246f0 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  ty = 0;.      p-
24700 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
24710 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53        pHist->inS
24720 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
24730 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Hist->pPrevStmt 
24740 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74  = pHist->pNextSt
24750 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  mt = 0;.      if
24760 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69  ( pPager->xReini
24770 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ter ){.        p
24780 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
24790 28 70 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  (p, pPager->page
247a0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
247b0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
247c0 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
247d0 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
247e0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
247f0 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
24800 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20  >origDbSize;.   
24810 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
24820 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
24830 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
24840 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
24850 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
24860 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
24870 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24880 3b 0a 20 20 7d 0a 0a 20 20 70 61 67 65 72 45 6e  ;.  }..  pagerEn
24890 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
248a0 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74  f( !pPager->dirt
248b0 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65  yCache || !pPage
248c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
248d0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
248e0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
248f0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61  (pPager);.    pa
24900 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
24910 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
24920 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
24930 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
24940 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
24950 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
24960 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
24970 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
24980 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70  USIVE ){.      p
24990 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
249a0 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
249b0 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
249c0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
249d0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
249e0 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
249f0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
24a00 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
24a10 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
24a20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
24a30 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
24a40 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f      rc2 = pager_
24a50 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
24a60 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
24a70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24a80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
24a90 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
24aa0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
24ab0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
24ac0 20 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 61   0);.  }.  /* pa
24ad0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
24ae0 29 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  ); */.  pPager->
24af0 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20  dbSize = -1;..  
24b00 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
24b10 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52  ccurs during a R
24b20 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20  OLLBACK, we can 
24b30 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20  no longer trust 
24b40 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 63  the pager.  ** c
24b50 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61  ache. So call pa
24b60 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74  ger_error() on t
24b70 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61  he way out to ma
24b80 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20  ke any error .  
24b90 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20  ** persistent.. 
24ba0 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
24bb0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
24bc0 63 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65  c);.  pagerLeave
24bd0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
24be0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24bf0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
24c00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24c10 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d   is opened read-
24c20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41  only.  Return FA
24c30 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61  LSE.** if the da
24c40 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68  tabase is (in th
24c50 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a  eory) writable..
24c60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
24c70 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61  gerIsreadonly(Pa
24c80 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
24c90 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72  return pPager->r
24ca0 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  eadOnly;.}../*.*
24cb0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
24cc0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
24cd0 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a  s to the pager..
24ce0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
24cf0 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65  gerRefcount(Page
24d00 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
24d10 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 52 65  turn pPager->nRe
24d20 66 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  f;.}..#ifdef SQL
24d30 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54  ITE_TEST./*.** T
24d40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
24d50 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
24d60 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
24d70 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74  y..*/.int *sqlit
24d80 65 33 50 61 67 65 72 53 74 61 74 73 28 50 61 67  e3PagerStats(Pag
24d90 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
24da0 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b  tatic int a[11];
24db0 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72  .  a[0] = pPager
24dc0 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d  ->nRef;.  a[1] =
24dd0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a   pPager->nPage;.
24de0 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d    a[2] = pPager-
24df0 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20  >mxPage;.  a[3] 
24e00 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
24e10 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65  ;.  a[4] = pPage
24e20 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d  r->state;.  a[5]
24e30 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
24e40 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61  de;.  a[6] = pPa
24e50 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37  ger->nHit;.  a[7
24e60 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73  ] = pPager->nMis
24e70 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20  s;.  a[8] = 0;  
24e80 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20 70 50  /* Used to be pP
24e90 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20  ager->nOvfl */. 
24ea0 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[9] = pPager->
24eb0 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d  nRead;.  a[10] =
24ec0 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b   pPager->nWrite;
24ed0 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23  .  return a;.}.#
24ee0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  endif../*.** Set
24ef0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72   the statement r
24f00 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a  ollback point..*
24f10 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
24f20 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  e should be call
24f30 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61 6e  ed with the tran
24f40 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
24f50 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e  already.** open.
24f60 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e    A new statemen
24f70 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65  t journal is cre
24f80 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62 65  ated that can be
24f90 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   used to rollbac
24fa0 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20  k.** changes of 
24fb0 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d  a single SQL com
24fc0 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61  mand within a la
24fd0 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  rger transaction
24fe0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24ff0 70 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50  pagerStmtBegin(P
25000 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
25010 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
25020 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  t( !pPager->stmt
25030 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72  InUse );.  asser
25040 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
25050 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
25060 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
25070 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b  er->dbSize>=0 );
25080 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
25090 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22  STMT-BEGIN %d\n"
250a0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
250b0 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
250c0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
250d0 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20  tmtInUse = 1;.  
250e0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
250f0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
25100 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ize;.    return 
25110 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
25120 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
25130 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
25140 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
25150 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72  oopen = 1;.    r
25160 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25170 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
25180 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
25190 65 6e 20 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  en );.  pagerLea
251a0 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  ve(pPager);.  pP
251b0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
251c0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
251d0 6f 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o( pPager->dbSiz
251e0 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 70 61 67  e/8 + 1 );.  pag
251f0 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
25200 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
25210 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  InStmt==0 ){.   
25220 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   /* sqlite3OsLoc
25230 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
25240 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20  ARED_LOCK); */. 
25250 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25260 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e  _NOMEM;.  }.#ifn
25270 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20  def NDEBUG.  rc 
25280 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
25290 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
252a0 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53   &pPager->stmtJS
252b0 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
252c0 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e   goto stmt_begin
252d0 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72  _failed;.  asser
252e0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  t( pPager->stmtJ
252f0 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e  Size == pPager->
25300 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65  journalOff );.#e
25310 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73  ndif.  pPager->s
25320 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65  tmtJSize = pPage
25330 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
25340 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
25350 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
25360 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ze;.  pPager->st
25370 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20  mtHdrOff = 0;.  
25380 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75  pPager->stmtCksu
25390 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
253a0 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50  mInit;.  if( !pP
253b0 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
253c0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
253d0 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
253e0 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
253f0 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a  ager->stfd, 0);.
25400 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
25410 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69  o stmt_begin_fai
25420 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  led;.    pPager-
25430 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20  >stmtOpen = 1;. 
25440 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
25450 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  Rec = 0;.  }.  p
25460 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
25470 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
25480 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74  QLITE_OK;. .stmt
25490 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20  _begin_failed:. 
254a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
254b0 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Stmt ){.    sqli
254c0 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
254d0 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70  >aInStmt);.    p
254e0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
254f0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
25500 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   rc;.}.int sqlit
25510 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e  e3PagerStmtBegin
25520 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
25530 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67  .  int rc;.  pag
25540 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
25550 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53 74 6d  .  rc = pagerStm
25560 74 42 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a  tBegin(pPager);.
25570 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
25580 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
25590 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  c;.}../*.** Comm
255a0 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a  it a statement..
255b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
255c0 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 50 61  gerStmtCommit(Pa
255d0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
255e0 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
255f0 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
25600 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
25610 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a     PgHdr *pPg, *
25620 70 4e 65 78 74 3b 0a 20 20 20 20 50 41 47 45 52  pNext;.    PAGER
25630 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d  TRACE2("STMT-COM
25640 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  MIT %d\n", PAGER
25650 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
25660 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
25670 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f       /* sqlite3O
25680 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
25690 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20  ->stfd, 0); */. 
256a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
256b0 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  e( pPager->aInSt
256c0 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  mt );.      pPag
256d0 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b  er->aInStmt = 0;
256e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
256f0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
25700 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50  ->pStmt; pPg; pP
25710 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  g=pNext){.      
25720 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
25730 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
25740 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
25750 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d  .        pNext =
25760 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d   pHist->pNextStm
25770 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
25780 74 28 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74  t( pHist->inStmt
25790 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73   );.        pHis
257a0 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
257b0 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50         pHist->pP
257c0 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d  revStmt = pHist-
257d0 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
257e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
257f0 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  free(pHist->pStm
25800 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73  t);.        pHis
25810 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t->pStmt = 0;.  
25820 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
25830 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
25840 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
25850 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
25860 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
25870 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  mt = 0;.  }.  pP
25880 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
25890 65 6e 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 4c  en = 0;.  pagerL
258a0 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
258b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
258c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
258d0 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  ack a statement.
258e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
258f0 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b  agerStmtRollback
25900 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
25910 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67  .  int rc;.  pag
25920 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
25930 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
25940 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
25950 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d  PAGERTRACE2("STM
25960 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  T-ROLLBACK %d\n"
25970 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
25980 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44  ));.    if( MEMD
25990 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  B ){.      PgHdr
259a0 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 50 67 48   *pPg;.      PgH
259b0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20  istory *pHist;. 
259c0 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61       for(pPg=pPa
259d0 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b  ger->pStmt; pPg;
259e0 20 70 50 67 3d 70 48 69 73 74 2d 3e 70 4e 65 78   pPg=pHist->pNex
259f0 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20  tStmt){.        
25a00 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
25a10 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
25a20 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
25a30 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a  pHist->pStmt ){.
25a40 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
25a50 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
25a60 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d  Pg), pHist->pStm
25a70 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  t, pPager->pageS
25a80 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
25a90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69  sqlite3_free(pHi
25aa0 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  st->pStmt);.    
25ab0 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74        pHist->pSt
25ac0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mt = 0;.        
25ad0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
25ae0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
25af0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
25b00 65 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 74  e;.      pager_t
25b10 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50  runcate_cache(pP
25b20 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ager);.      rc 
25b30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
25b40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
25b50 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c   = pager_stmt_pl
25b60 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  ayback(pPager);.
25b70 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
25b80 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74  3PagerStmtCommit
25b90 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
25ba0 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
25bb0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61  TE_OK;.  }.  pPa
25bc0 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
25bd0 6e 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 4c 65  n = 0;.  pagerLe
25be0 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
25bf0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
25c00 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
25c10 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
25c20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25c30 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
25c40 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c  *sqlite3PagerFil
25c50 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  ename(Pager *pPa
25c60 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
25c70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
25c80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
25c90 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
25ca0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
25cb0 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
25cc0 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65  har *sqlite3Page
25cd0 72 44 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a  rDirname(Pager *
25ce0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
25cf0 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  n pPager->zDirec
25d00 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  tory;.}../*.** R
25d10 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
25d20 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a  athname of the j
25d30 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a  ournal file..*/.
25d40 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
25d50 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e  te3PagerJournaln
25d60 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
25d70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
25d80 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d  ger->zJournal;.}
25d90 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
25da0 72 75 65 20 69 66 20 66 73 79 6e 63 28 29 20 63  rue if fsync() c
25db0 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65  alls are disable
25dc0 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  d for this pager
25dd0 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a  .  Return FALSE.
25de0 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20 61  ** if fsync()s a
25df0 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d  re executed norm
25e00 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ally..*/.int sql
25e10 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28  ite3PagerNosync(
25e20 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
25e30 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
25e40 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64  >noSync;.}..#ifd
25e50 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
25e60 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  DEC./*.** Set th
25e70 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73  e codec for this
25e80 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73   pager.*/.void s
25e90 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 6f  qlite3PagerSetCo
25ea0 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50  dec(.  Pager *pP
25eb0 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a  ager,.  void *(*
25ec0 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
25ed0 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20  id*,Pgno,int),. 
25ee0 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67   void *pCodecArg
25ef0 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43  .){.  pPager->xC
25f00 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20  odec = xCodec;. 
25f10 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41   pPager->pCodecA
25f20 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a  rg = pCodecArg;.
25f30 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
25f40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
25f50 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d  TOVACUUM./*.** M
25f60 6f 76 65 20 74 68 65 20 70 61 67 65 20 70 50 67  ove the page pPg
25f70 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e   to location pgn
25f80 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 0a  o in the file. .
25f90 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
25fa0 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   be no reference
25fb0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 72  s to the page pr
25fc0 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64  eviously located
25fd0 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69   at.** pgno (whi
25fe0 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c  ch we call pPgOl
25ff0 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20 70  d) though that p
26000 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  age is allowed t
26010 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65  o be.** in cache
26020 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 70  .  If the page p
26030 72 65 76 69 6f 75 73 20 6c 6f 63 61 74 65 64 20  revious located 
26040 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61  at pgno is not a
26050 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65  lready.** in the
26060 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
26070 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74  l, it is not put
26080 20 74 68 65 72 65 20 62 79 20 62 79 20 74 68 69   there by by thi
26090 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
260a0 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   References to t
260b0 68 65 20 70 61 67 65 20 70 50 67 20 72 65 6d 61  he page pPg rema
260c0 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69  in valid. Updati
260d0 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64  ng any.** meta-d
260e0 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
260f0 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61  ith pPg (i.e. da
26100 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
26110 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a   nExtra bytes.**
26120 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67   allocated along
26130 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20   with the page) 
26140 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
26150 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
26160 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61  ler..**.** A tra
26170 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
26180 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69   active when thi
26190 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
261a0 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20  led. It used to 
261b0 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74  be.** required t
261c0 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  hat a statement 
261d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
261e0 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20  not active, but 
261f0 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  this restriction
26200 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d  .** has been rem
26210 6f 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44  oved (CREATE IND
26220 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65  EX needs to move
26230 20 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73   a page when a s
26240 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e  tatement.** tran
26250 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
26260 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e)..*/.int sqlit
26270 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
26280 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44  Pager *pPager, D
26290 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f  bPage *pPg, Pgno
262a0 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
262b0 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54 68 65  *pPgOld;  /* The
262c0 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65 72   page being over
262d0 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 69 6e  written. */.  in
262e0 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64  t h;.  Pgno need
262f0 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20  SyncPgno = 0;.. 
26300 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
26310 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  er);.  assert( p
26320 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20  Pg->nRef>0 );.. 
26330 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4d 4f   PAGERTRACE5("MO
26340 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e  VE %d page %d (n
26350 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65  eedSync=%d) move
26360 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20  s to %d\n", .   
26370 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
26380 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
26390 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67  Pg->needSync, pg
263a0 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  no);.  IOTRACE((
263b0 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e  "MOVE %p %d %d\n
263c0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
263d0 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20  pgno, pgno))..  
263e0 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e  pager_get_conten
263f0 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50  t(pPg);.  if( pP
26400 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  g->needSync ){. 
26410 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20     needSyncPgno 
26420 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
26430 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
26440 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
26450 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
26460 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  gDbSize );.    a
26470 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74  ssert( pPg->dirt
26480 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  y );.    assert(
26490 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
264a0 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  c );.  }..  /* U
264b0 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69  nlink pPg from i
264c0 74 27 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a  t's hash-chain *
264d0 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68  /.  unlinkHashCh
264e0 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29  ain(pPager, pPg)
264f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
26500 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ache contains a 
26510 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e  page with page-n
26520 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f  umber pgno, remo
26530 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20  ve it.  ** from 
26540 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e  it's hash chain.
26550 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67   Also, if the Pg
26560 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73  Hdr.needSync was
26570 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70   set for .  ** p
26580 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20  age pgno before 
26590 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61  the 'move' opera
265a0 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74  tion, it needs t
265b0 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20  o be retained . 
265c0 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65   ** for the page
265d0 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20   moved there..  
265e0 2a 2f 0a 20 20 70 50 67 2d 3e 6e 65 65 64 53 79  */.  pPg->needSy
265f0 6e 63 20 3d 20 30 3b 0a 20 20 70 50 67 4f 6c 64  nc = 0;.  pPgOld
26600 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
26610 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
26620 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20   if( pPgOld ){. 
26630 20 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c     assert( pPgOl
26640 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20  d->nRef==0 );.  
26650 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
26660 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64  n(pPager, pPgOld
26670 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  );.    makeClean
26680 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 70 50  (pPgOld);.    pP
26690 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 70 50  g->needSync = pP
266a0 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 3b 0a  gOld->needSync;.
266b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67    }else{.    pPg
266c0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
266d0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
266e0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  ->aInJournal && 
266f0 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
26700 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
26710 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  .    pPg->inJour
26720 6e 61 6c 20 3d 20 20 28 70 50 61 67 65 72 2d 3e  nal =  (pPager->
26730 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f  aInJournal[pgno/
26740 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
26750 29 29 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b  )))!=0;.  }else{
26760 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  .    pPg->inJour
26770 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  nal = 0;.    ass
26780 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
26790 6e 63 3d 3d 30 20 7c 7c 20 28 69 6e 74 29 70 67  nc==0 || (int)pg
267a0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
267b0 62 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 0a 20 20  bSize );.  }..  
267c0 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61  /* Change the pa
267d0 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50  ge number for pP
267e0 67 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20  g and insert it 
267f0 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 68 61 73  into the new has
26800 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 61 73  h-chain. */.  as
26810 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
26820 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70  .  pPg->pgno = p
26830 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 67 6e 6f 20  gno;.  h = pgno 
26840 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
26850 2d 31 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  -1);.  if( pPage
26860 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20  r->aHash[h] ){. 
26870 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
26880 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72  r->aHash[h]->pPr
26890 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
268a0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
268b0 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  ]->pPrevHash = p
268c0 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  Pg;.  }.  pPg->p
268d0 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65  NextHash = pPage
268e0 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70  r->aHash[h];.  p
268f0 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
26900 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50  = pPg;.  pPg->pP
26910 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20  revHash = 0;..  
26920 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  makeDirty(pPg);.
26930 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
26940 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28  ache = 1;..  if(
26950 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b   needSyncPgno ){
26960 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53  .    /* If needS
26970 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a  yncPgno is non-z
26980 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ero, then the jo
26990 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73  urnal file needs
269a0 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73   to be .    ** s
269b0 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61  ync()ed before a
269c0 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74  ny data is writt
269d0 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  en to database f
269e0 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e  ile page needSyn
269f0 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75  cPgno..    ** Cu
26a00 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68  rrently, no such
26a10 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20   page exists in 
26a20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
26a30 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 50  nd the .    ** P
26a40 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ager.aInJournal 
26a50 62 69 74 20 68 61 73 20 62 65 65 6e 20 73 65 74  bit has been set
26a60 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20  . This needs to 
26a70 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 20 6c  be remedied by l
26a80 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  oading.    ** th
26a90 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
26aa0 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
26ab0 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64  setting the PgHd
26ac0 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 2e  r.needSync flag.
26ad0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
26ae0 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
26af0 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61  et() call may ca
26b00 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  use the journal 
26b10 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65  to sync. So make
26b20 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65  .    ** sure the
26b30 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
26b40 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e  flag is set too.
26b50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
26b60 72 63 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70  rc;.    PgHdr *p
26b70 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72  PgHdr;.    asser
26b80 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
26b90 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync );.    rc = 
26ba0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
26bb0 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63  pPager, needSync
26bc0 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a  Pgno, &pPgHdr);.
26bd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
26be0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
26bf0 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  c;.    pPager->n
26c00 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
26c10 20 70 50 67 48 64 72 2d 3e 6e 65 65 64 53 79 6e   pPgHdr->needSyn
26c20 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64  c = 1;.    pPgHd
26c30 72 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  r->inJournal = 1
26c40 3b 0a 20 20 20 20 6d 61 6b 65 44 69 72 74 79 28  ;.    makeDirty(
26c50 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c  pPgHdr);.    sql
26c60 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
26c70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 70  PgHdr);.  }..  p
26c80 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
26c90 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
26ca0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
26cb0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
26cc0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64  pointer to the d
26cd0 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65 63  ata for the spec
26ce0 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76  ified page..*/.v
26cf0 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
26d00 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65 20  rGetData(DbPage 
26d10 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
26d20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
26d30 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  g);.}../*.** Ret
26d40 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
26d50 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72   the Pager.nExtr
26d60 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72  a bytes of "extr
26d70 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c  a" space .** all
26d80 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
26d90 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
26da0 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  page..*/.void *s
26db0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
26dc0 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  tra(DbPage *pPg)
26dd0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
26de0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
26df0 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
26e00 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  r?PGHDR_TO_EXTRA
26e10 28 70 50 67 2c 20 70 50 61 67 65 72 29 3a 30 29  (pPg, pPager):0)
26e20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73  ;.}../*.** Get/s
26e30 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  et the locking-m
26e40 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ode for this pag
26e50 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d  er. Parameter eM
26e60 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a  ode must be one.
26e70 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b  ** of PAGER_LOCK
26e80 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50  INGMODE_QUERY, P
26e90 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
26ea0 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50  _NORMAL or .** P
26eb0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
26ec0 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74  _EXCLUSIVE. If t
26ed0 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
26ee0 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e  not _QUERY, then
26ef0 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d  .** the locking-
26f00 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74  mode is set to t
26f10 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69  he value specifi
26f20 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ed..**.** The re
26f30 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
26f40 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43  either PAGER_LOC
26f50 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
26f60 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b  or.** PAGER_LOCK
26f70 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
26f80 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  E, indicating th
26f90 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69  e current (possi
26fa0 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20  bly updated).** 
26fb0 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f  locking-mode..*/
26fc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
26fd0 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67  rLockingMode(Pag
26fe0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
26ff0 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74  eMode){.  assert
27000 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  ( eMode==PAGER_L
27010 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
27020 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
27030 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
27040 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a  KINGMODE_NORMAL.
27050 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
27060 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
27070 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
27080 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
27090 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
270a0 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73  _QUERY<0 );.  as
270b0 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
270c0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d  INGMODE_NORMAL>=
270d0 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49  0 && PAGER_LOCKI
270e0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
270f0 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f  >=0 );.  if( eMo
27100 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72  de>=0 && !pPager
27110 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
27120 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
27130 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b  iveMode = eMode;
27140 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69  .  }.  return (i
27150 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  nt)pPager->exclu
27160 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66  siveMode;.}..#if
27170 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
27180 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
27190 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
271a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
271b0 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
271c0 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66   the file lock f
271d0 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
271e0 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  er..** The retur
271f0 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f  n value is one o
27200 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  f NO_LOCK, SHARE
27210 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
27220 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e  _LOCK,.** PENDIN
27230 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55  G_LOCK, or EXCLU
27240 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e  SIVE_LOCK..*/.in
27250 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  t sqlite3PagerLo
27260 63 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a 70  ckstate(Pager *p
27270 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
27280 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74   sqlite3OsLockSt
27290 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ate(pPager->fd);
272a0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
272b0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
272c0 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73  *.** Print a lis
272d0 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65  ting of all refe
272e0 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64  renced pages and
272f0 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74   their ref count
27300 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
27310 33 50 61 67 65 72 52 65 66 64 75 6d 70 28 50 61  3PagerRefdump(Pa
27320 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
27330 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f  PgHdr *pPg;.  fo
27340 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
27350 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
27360 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
27370 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d   if( pPg->nRef<=
27380 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
27390 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
273a0 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61  intf("PAGE %3d a
273b0 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e  ddr=%p nRef=%d\n
273c0 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e  ", .       pPg->
273d0 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44  pgno, PGHDR_TO_D
273e0 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e  ATA(pPg), pPg->n
273f0 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Ref);.  }.}.#end
27400 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  if..#endif /* SQ
27410 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
27420 20 2a 2f 0a                                       */.