/ Hex Artifact Content
Login

Artifact 70b4b9b6e1715adba48cd6a263885ae848f3f263:


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 38  : pager.c,v 1.38
0350: 37 20 32 30 30 37 2f 30 39 2f 30 36 20 32 33 3a  7 2007/09/06 23:
0360: 32 38 3a 32 34 20 64 72 68 20 45 78 70 20 24 0a  28:24 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  t.h".#include <a
03b0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03c0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03d0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03e0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03f0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0400: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0410: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62  efine sqlite3Deb
0420: 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a  ugPrintf printf.
0430: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0440: 43 45 31 28 58 29 20 20 20 20 20 20 20 73 71 6c  CE1(X)       sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
0460: 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  X).#define PAGER
0470: 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20  TRACE2(X,Y)     
0480: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0490: 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  tf(X,Y).#define 
04a0: 50 41 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c  PAGERTRACE3(X,Y,
04b0: 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  Z)   sqlite3Debu
04c0: 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23  gPrintf(X,Y,Z).#
04d0: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
04e0: 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69  E4(X,Y,Z,W) sqli
04f0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0500: 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20  ,Y,Z,W).#define 
0510: 50 41 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c  PAGERTRACE5(X,Y,
0520: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0530: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0540: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0550: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0560: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0570: 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69  RACE2(X,Y).#defi
0580: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
0590: 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Y,Z).#define PA
05a0: 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c  GERTRACE4(X,Y,Z,
05b0: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
05c0: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
05d0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
05e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
05f0: 6f 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65  o macros are use
0600: 64 20 77 69 74 68 69 6e 20 74 68 65 20 50 41 47  d within the PAG
0610: 45 52 54 52 41 43 45 58 28 29 20 6d 61 63 72 6f  ERTRACEX() macro
0620: 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 70 72  s above.** to pr
0630: 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64 65 73  int out file-des
0640: 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a  criptors. .**.**
0650: 20 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73   PAGERID() takes
0660: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
0670: 50 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20  Pager struct as 
0680: 69 74 27 73 20 61 72 67 75 6d 65 6e 74 2e 20 54  it's argument. T
0690: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
06a0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
06b0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49   is returned. FI
06c0: 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b  LEHANDLEID() tak
06d0: 65 73 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69  es an sqlite3_fi
06e0: 6c 65 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20  le.** struct as 
06f0: 69 74 27 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  it's argument..*
0700: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 49  /.#define PAGERI
0710: 44 28 70 29 20 28 28 69 6e 74 29 28 70 2d 3e 66  D(p) ((int)(p->f
0720: 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45  d)).#define FILE
0730: 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69  HANDLEID(fd) ((i
0740: 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  nt)fd)../*.** Th
0750: 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73 20  e page cache as 
0760: 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79  a whole is alway
0770: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
0780: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
0790: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  tes:.**.**   PAG
07a0: 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20  ER_UNLOCK       
07b0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
07c0: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
07d0: 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20   reading or .** 
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74 68        writing th
0800: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0810: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a    There is no.**
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c 64         data held
0840: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
0850: 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
0860: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0870: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 2e            state.
0880: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53  .**.**   PAGER_S
0890: 48 41 52 45 44 20 20 20 20 20 20 20 20 54 68 65  HARED        The
08a0: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 72   page cache is r
08b0: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
08c0: 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ase..**         
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72                Wr
08e0: 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72  iting is not per
08f0: 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20 63  mitted.  There c
0900: 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  an be.**        
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
0920: 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
0930: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
0940: 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  me database.**  
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68 65       file at the
0970: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   same time..**.*
0980: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
0990: 45 44 20 20 20 20 20 20 54 68 69 73 20 70 72 6f  ED      This pro
09a0: 63 65 73 73 20 68 61 73 20 72 65 73 65 72 76 65  cess has reserve
09b0: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
09c0: 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20  or writing.**   
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20      but has not 
09f0: 79 65 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61  yet made any cha
0a00: 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20  nges.  Only one 
0a10: 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20  process.**      
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a30: 20 61 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72   at a time can r
0a40: 65 73 65 72 76 65 20 74 68 65 20 64 61 74 61 62  eserve the datab
0a50: 61 73 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e  ase.  The origin
0a60: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0a80: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f  base file has no
0a90: 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  t been modified 
0aa0: 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20  so other.**     
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 20 20 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20    processes may 
0ad0: 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
0ae0: 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20   the on-disk.** 
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
0b10: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ile..**.**   PAG
0b20: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20  ER_EXCLUSIVE    
0b30: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0b40: 69 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  is writing the d
0b50: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20  atabase..**     
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 20 20 41 63 63 65 73 73 20 69 73 20 65 78 63 6c    Access is excl
0b80: 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72  usive.  No other
0b90: 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a   processes or.**
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20 63         threads c
0bc0: 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72  an be reading or
0bd0: 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f   writing while o
0be0: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ne.**           
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63              proc
0c00: 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a  ess is writing..
0c10: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59  **.**   PAGER_SY
0c20: 4e 43 45 44 20 20 20 20 20 20 20 20 54 68 65 20  NCED        The 
0c30: 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74  pager moves to t
0c40: 68 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50  his state from P
0c50: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a  AGER_EXCLUSIVE.*
0c60: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0c70: 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61 6c          after al
0c80: 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68 61  l dirty pages ha
0c90: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
0ca0: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
0cd0: 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 62  d the file has b
0ce0: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a  een synced to.**
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c         disk. All
0d10: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f   that remains to
0d20: 20 64 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65   do is to remove
0d30: 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   or.**          
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 75               tru
0d50: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
0d60: 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 74  l file and the t
0d70: 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20  ransaction .**  
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d       will be com
0da0: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
0db0: 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d  e page cache com
0dc0: 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55  es up in PAGER_U
0dd0: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0de0: 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69  t time a.** sqli
0df0: 74 65 33 50 61 67 65 72 47 65 74 28 29 20 6f 63  te3PagerGet() oc
0e00: 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65 20  curs, the state 
0e10: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50  transitions to P
0e20: 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20  AGER_SHARED..** 
0e30: 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20  After all pages 
0e40: 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73  have been releas
0e50: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f  ed using sqlite_
0e60: 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a  page_unref(),.**
0e70: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0e80: 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50  itions back to P
0e90: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0ea0: 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20  e first time.** 
0eb0: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
0ec0: 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
0ed0: 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  ed, the state tr
0ee0: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20  ansitions to.** 
0ef0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20  PAGER_RESERVED. 
0f00: 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69   (Note that sqli
0f10: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
0f20: 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63  can only be.** c
0f30: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73  alled on an outs
0f40: 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69  tanding page whi
0f50: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ch means that th
0f60: 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20  e pager must.** 
0f70: 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52  be in PAGER_SHAR
0f80: 45 44 20 62 65 66 6f 72 65 20 69 74 20 74 72 61  ED before it tra
0f90: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45  nsitions to PAGE
0fa0: 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20  R_RESERVED.).** 
0fb0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 6d  PAGER_RESERVED m
0fc0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20  eans that there 
0fd0: 69 73 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62  is an open rollb
0fe0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  ack journal..** 
0ff0: 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74  The transition t
1000: 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  o PAGER_EXCLUSIV
1010: 45 20 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20  E occurs before 
1020: 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61  any changes.** a
1030: 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
1040: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
1050: 6f 75 67 68 20 77 72 69 74 65 73 20 74 6f 20 74  ough writes to t
1060: 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a  he rollback.** j
1070: 6f 75 72 6e 61 6c 20 6f 63 63 75 72 73 20 77 69  ournal occurs wi
1080: 74 68 20 6a 75 73 74 20 50 41 47 45 52 5f 52 45  th just PAGER_RE
1090: 53 45 52 56 45 44 2e 20 20 41 66 74 65 72 20 61  SERVED.  After a
10a0: 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  n sqlite3PagerRo
10b0: 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73  llback().** or s
10c0: 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
10d0: 74 50 68 61 73 65 54 77 6f 28 29 2c 20 74 68 65  tPhaseTwo(), the
10e0: 20 73 74 61 74 65 20 63 61 6e 20 67 6f 20 62 61   state can go ba
10f0: 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
1100: 45 44 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e  ED,.** or it can
1110: 20 73 74 61 79 20 61 74 20 50 41 47 45 52 5f 45   stay at PAGER_E
1120: 58 43 4c 55 53 49 56 45 20 69 66 20 77 65 20 61  XCLUSIVE if we a
1130: 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  re in exclusive 
1140: 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a  access mode..*/.
1150: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e  #define PAGER_UN
1160: 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66  LOCK      0.#def
1170: 69 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45 44  ine PAGER_SHARED
1180: 20 20 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d        1   /* sam
1190: 65 20 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b  e as SHARED_LOCK
11a0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
11b0: 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 32 20  R_RESERVED    2 
11c0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53    /* same as RES
11d0: 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64  ERVED_LOCK */.#d
11e0: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c  efine PAGER_EXCL
11f0: 55 53 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73  USIVE   4   /* s
1200: 61 6d 65 20 61 73 20 45 58 43 4c 55 53 49 56 45  ame as EXCLUSIVE
1210: 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65  _LOCK */.#define
1220: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
1230: 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74     5../*.** If t
1240: 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  he SQLITE_BUSY_R
1250: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63  ESERVED_LOCK mac
1260: 72 6f 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ro is set to tru
1270: 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  e at compile-tim
1280: 65 2c 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65  e,.** then faile
1290: 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65  d attempts to ge
12a0: 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  t a reserved loc
12b0: 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68  k will invoke th
12c0: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e  e busy callback.
12d0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20  .** This is off 
12e0: 62 79 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20  by default.  To 
12f0: 73 65 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65  see why, conside
1300: 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
1310: 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a  scenario:.** .**
1320: 20 53 75 70 70 6f 73 65 20 74 68 72 65 61 64 20   Suppose thread 
1330: 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
1340: 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20  shared lock and 
1350: 77 61 6e 74 73 20 61 20 72 65 73 65 72 76 65 64  wants a reserved
1360: 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64   lock..** Thread
1370: 20 42 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   B already has a
1380: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61   reserved lock a
1390: 6e 64 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c  nd wants an excl
13a0: 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a  usive lock.  If.
13b0: 2a 2a 20 62 6f 74 68 20 74 68 72 65 61 64 73 20  ** both threads 
13c0: 61 72 65 20 75 73 69 6e 67 20 74 68 65 69 72 20  are using their 
13d0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20  busy callbacks, 
13e0: 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f  it might be a lo
13f0: 6e 67 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f  ng time.** be fo
1400: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72  r one of the thr
1410: 65 61 64 73 20 67 69 76 65 20 75 70 20 61 6e 64  eads give up and
1420: 20 61 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65   allows the othe
1430: 72 20 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a  r to proceed..**
1440: 20 42 75 74 20 69 66 20 74 68 65 20 74 68 72 65   But if the thre
1450: 61 64 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74  ad trying to get
1460: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f   the reserved lo
1470: 63 6b 20 67 69 76 65 73 20 75 70 20 71 75 69 63  ck gives up quic
1480: 6b 6c 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65  kly.** (if it ne
1490: 76 65 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20  ver invokes its 
14a0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74  busy callback) t
14b0: 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69  hen the contenti
14c0: 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65  on will be.** re
14d0: 73 6f 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a  solved quickly..
14e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
14f0: 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
1500: 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51  LOCK.# define SQ
1510: 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56  LITE_BUSY_RESERV
1520: 45 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66  ED_LOCK 0.#endif
1530: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63  ../*.** This mac
1540: 72 6f 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73  ro rounds values
1550: 20 75 70 20 73 6f 20 74 68 61 74 20 69 66 20 74   up so that if t
1560: 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61  he value is an a
1570: 64 64 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20  ddress it.** is 
1580: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1590: 20 61 6e 20 61 64 64 72 65 73 73 20 74 68 61 74   an address that
15a0: 20 69 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61   is aligned to a
15b0: 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72  n 8-byte boundar
15c0: 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f  y..*/.#define FO
15d0: 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29  RCE_ALIGNMENT(X)
15e0: 20 20 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a     (((X)+7)&~7).
15f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1600: 50 67 48 64 72 20 50 67 48 64 72 3b 0a 0a 2f 2a  PgHdr PgHdr;../*
1610: 0a 2a 2a 20 45 61 63 68 20 70 61 67 65 72 20 73  .** Each pager s
1620: 74 6f 72 65 73 20 61 6c 6c 20 63 75 72 72 65 6e  tores all curren
1630: 74 6c 79 20 75 6e 72 65 66 65 72 65 6e 63 65 64  tly unreferenced
1640: 20 70 61 67 65 73 20 69 6e 20 61 20 6c 69 73 74   pages in a list
1650: 20 73 6f 72 74 65 64 0a 2a 2a 20 69 6e 20 6c 65   sorted.** in le
1660: 61 73 74 2d 72 65 63 65 6e 74 6c 79 2d 75 73 65  ast-recently-use
1670: 64 20 28 4c 52 55 29 20 6f 72 64 65 72 20 28 69  d (LRU) order (i
1680: 2e 65 2e 20 74 68 65 20 66 69 72 73 74 20 69 74  .e. the first it
1690: 65 6d 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 68  em on the list h
16a0: 61 73 20 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20  as .** not been 
16b0: 72 65 66 65 72 65 6e 63 65 64 20 69 6e 20 61 20  referenced in a 
16c0: 6c 6f 6e 67 20 74 69 6d 65 2c 20 74 68 65 20 6c  long time, the l
16d0: 61 73 74 20 69 74 65 6d 20 68 61 73 20 62 65 65  ast item has bee
16e0: 6e 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 75 73  n recently.** us
16f0: 65 64 29 2e 20 41 6e 20 69 6e 73 74 61 6e 63 65  ed). An instance
1700: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
1710: 72 65 20 69 73 20 69 6e 63 6c 75 64 65 64 20 61  re is included a
1720: 73 20 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a  s part of each.*
1730: 2a 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  * pager structur
1740: 65 20 66 6f 72 20 74 68 69 73 20 70 75 72 70 6f  e for this purpo
1750: 73 65 20 28 76 61 72 69 61 62 6c 65 20 50 61 67  se (variable Pag
1760: 65 72 2e 6c 72 75 29 2e 0a 2a 2a 0a 2a 2a 20 41  er.lru)..**.** A
1770: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20  dditionally, if 
1780: 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e  memory-managemen
1790: 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c  t is enabled, al
17a0: 6c 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70  l unreferenced p
17b0: 61 67 65 73 20 0a 2a 2a 20 61 72 65 20 73 74 6f  ages .** are sto
17c0: 72 65 64 20 69 6e 20 61 20 67 6c 6f 62 61 6c 20  red in a global 
17d0: 4c 52 55 20 6c 69 73 74 20 28 67 6c 6f 62 61 6c  LRU list (global
17e0: 20 76 61 72 69 61 62 6c 65 20 73 71 6c 69 74 65   variable sqlite
17f0: 33 4c 72 75 50 61 67 65 4c 69 73 74 29 2e 0a 2a  3LruPageList)..*
1800: 2a 0a 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73  *.** In both cas
1810: 65 73 2c 20 74 68 65 20 50 61 67 65 72 4c 72 75  es, the PagerLru
1820: 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65  List.pFirstSynce
1830: 64 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74  d variable point
1840: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 66 69 72 73  s to.** the firs
1850: 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 6f  t page in the co
1860: 72 72 65 73 70 6f 6e 64 69 6e 67 20 6c 69 73 74  rresponding list
1870: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
1880: 65 71 75 69 72 65 20 61 6e 0a 2a 2a 20 66 73 79  equire an.** fsy
1890: 6e 63 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 62  nc() operation b
18a0: 65 66 6f 72 65 20 69 74 27 73 20 6d 65 6d 6f 72  efore it's memor
18b0: 79 20 63 61 6e 20 62 65 20 72 65 63 6c 61 69 6d  y can be reclaim
18c0: 65 64 2e 20 49 66 20 6e 6f 20 73 75 63 68 0a 2a  ed. If no such.*
18d0: 2a 20 70 61 67 65 20 65 78 69 73 74 73 2c 20 50  * page exists, P
18e0: 61 67 65 72 4c 72 75 4c 69 73 74 2e 70 46 69 72  agerLruList.pFir
18f0: 73 74 53 79 6e 63 65 64 20 69 73 20 73 65 74 20  stSynced is set 
1900: 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 74 79 70 65  to NULL..*/.type
1910: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
1920: 4c 72 75 4c 69 73 74 20 50 61 67 65 72 4c 72 75  LruList PagerLru
1930: 4c 69 73 74 3b 0a 73 74 72 75 63 74 20 50 61 67  List;.struct Pag
1940: 65 72 4c 72 75 4c 69 73 74 20 7b 0a 20 20 50 67  erLruList {.  Pg
1950: 48 64 72 20 2a 70 46 69 72 73 74 3b 20 20 20 20  Hdr *pFirst;    
1960: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
1970: 67 65 20 69 6e 20 4c 52 55 20 6c 69 73 74 20 2a  ge in LRU list *
1980: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 61 73 74  /.  PgHdr *pLast
1990: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  ;          /* La
19a0: 73 74 20 70 61 67 65 20 69 6e 20 4c 52 55 20 6c  st page in LRU l
19b0: 69 73 74 20 28 74 68 65 20 6d 6f 73 74 20 72 65  ist (the most re
19c0: 63 65 6e 74 6c 79 20 75 73 65 64 29 20 2a 2f 0a  cently used) */.
19d0: 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 53    PgHdr *pFirstS
19e0: 79 6e 63 65 64 3b 20 20 20 2f 2a 20 46 69 72 73  ynced;   /* Firs
19f0: 74 20 70 61 67 65 20 69 6e 20 6c 69 73 74 20 77  t page in list w
1a00: 69 74 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79  ith PgHdr.needSy
1a10: 6e 63 3d 3d 30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  nc==0 */.};../*.
1a20: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1a30: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
1a40: 69 6e 73 20 74 68 65 20 6e 65 78 74 20 61 6e 64  ins the next and
1a50: 20 70 72 65 76 69 6f 75 73 20 70 6f 69 6e 74 65   previous pointe
1a60: 72 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 69  rs used.** to li
1a70: 6e 6b 20 61 20 50 67 48 64 72 20 73 74 72 75 63  nk a PgHdr struc
1a80: 74 75 72 65 20 69 6e 74 6f 20 61 20 50 61 67 65  ture into a Page
1a90: 72 4c 72 75 4c 69 73 74 20 6c 69 6e 6b 65 64 20  rLruList linked 
1aa0: 6c 69 73 74 2e 20 0a 2a 2f 0a 74 79 70 65 64 65  list. .*/.typede
1ab0: 66 20 73 74 72 75 63 74 20 50 61 67 65 72 4c 72  f struct PagerLr
1ac0: 75 4c 69 6e 6b 20 50 61 67 65 72 4c 72 75 4c 69  uLink PagerLruLi
1ad0: 6e 6b 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72  nk;.struct Pager
1ae0: 4c 72 75 4c 69 6e 6b 20 7b 0a 20 20 50 67 48 64  LruLink {.  PgHd
1af0: 72 20 2a 70 4e 65 78 74 3b 0a 20 20 50 67 48 64  r *pNext;.  PgHd
1b00: 72 20 2a 70 50 72 65 76 3b 0a 7d 3b 0a 0a 2f 2a  r *pPrev;.};../*
1b10: 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f  .** Each in-memo
1b20: 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61  ry image of a pa
1b30: 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  ge begins with t
1b40: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61  he following hea
1b50: 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61  der..** This hea
1b60: 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69  der is only visi
1b70: 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  ble to this page
1b80: 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63  r module.  The c
1b90: 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68  lient.** code th
1ba0: 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73  at calls pager s
1bb0: 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74  ees only the dat
1bc0: 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74  a that follows t
1bd0: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
1be0: 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f   Client code sho
1bf0: 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  uld call sqlite3
1c00: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
1c10: 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  a page prior to 
1c20: 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f  making.** any mo
1c30: 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74  difications to t
1c40: 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66  hat page.  The f
1c50: 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65  irst time sqlite
1c60: 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
1c70: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1c80: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
1c90: 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69 74 74  ntents are writt
1ca0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c  en into the roll
1cb0: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
1cc0: 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72  and PgHdr.inJour
1cd0: 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65  nal and PgHdr.ne
1ce0: 65 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20  edSync are set. 
1cf0: 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20   Later, once.** 
1d00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  the journal page
1d10: 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74   has made it ont
1d20: 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
1d30: 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79  ce, PgHdr.needSy
1d40: 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64  nc.** is cleared
1d50: 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20  .  The modified 
1d60: 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77  page cannot be w
1d70: 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
1d80: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1d90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
1da0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
1db0: 20 70 61 67 65 73 20 68 61 73 20 62 65 65 6e 20   pages has been 
1dc0: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61  synced to disk a
1dd0: 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e  nd the.** PgHdr.
1de0: 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62 65 65  needSync has bee
1df0: 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  n cleared..**.**
1e00: 20 54 68 65 20 50 67 48 64 72 2e 64 69 72 74 79   The PgHdr.dirty
1e10: 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65   flag is set whe
1e20: 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
1e30: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1e40: 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  and.** is cleare
1e50: 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65  d again when the
1e60: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
1e70: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
1e80: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1ea0: 2a 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66  **.** Details of
1eb0: 20 69 6d 70 6f 72 74 61 6e 74 20 73 74 72 75 63   important struc
1ec0: 74 75 72 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a  ture elements:.*
1ed0: 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a  *.** needSync.**
1ee0: 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 69 73 20  .**     If this 
1ef0: 69 73 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65  is true, this me
1f00: 61 6e 73 20 74 68 61 74 20 69 74 20 69 73 20 6e  ans that it is n
1f10: 6f 74 20 73 61 66 65 20 74 6f 20 77 72 69 74 65  ot safe to write
1f20: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20   the page.**    
1f30: 20 63 6f 6e 74 65 6e 74 20 74 6f 20 74 68 65 20   content to the 
1f40: 64 61 74 61 62 61 73 65 20 62 65 63 61 75 73 65  database because
1f50: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f   the original co
1f60: 6e 74 65 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20  ntent needed.** 
1f70: 20 20 20 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b      for rollback
1f80: 20 68 61 73 20 6e 6f 74 20 62 79 20 73 79 6e 63   has not by sync
1f90: 65 64 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 72  ed to the main r
1fa0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
1fb0: 0a 2a 2a 20 20 20 20 20 54 68 65 20 6f 72 69 67  .**     The orig
1fc0: 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79  inal content may
1fd0: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
1fe0: 65 6e 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61  en to the rollba
1ff0: 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  ck journal.**   
2000: 20 20 62 75 74 20 69 74 20 68 61 73 20 6e 6f 74    but it has not
2010: 20 79 65 74 20 62 65 65 6e 20 73 79 6e 63 65 64   yet been synced
2020: 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20  .  So we cannot 
2030: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74  write to the dat
2040: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c  abase.**     fil
2050: 65 20 62 65 63 61 75 73 65 20 70 6f 77 65 72 20  e because power 
2060: 66 61 69 6c 75 72 65 20 6d 69 67 68 74 20 63 61  failure might ca
2070: 75 73 65 20 74 68 65 20 70 61 67 65 20 69 6e 20  use the page in 
2080: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2090: 0a 2a 2a 20 20 20 20 20 74 6f 20 6e 65 76 65 72  .**     to never
20a0: 20 72 65 61 63 68 20 74 68 65 20 64 69 73 6b 2e   reach the disk.
20b0: 20 20 49 74 20 69 73 20 61 73 20 69 66 20 74 68    It is as if th
20c0: 65 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  e write to the j
20d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
20e0: 20 20 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75     does not occu
20f0: 72 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72  r until the jour
2100: 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
2110: 65 64 2e 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20  ed..**     .**  
2120: 20 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20     This flag is 
2130: 66 61 6c 73 65 20 69 66 20 74 68 65 20 70 61 67  false if the pag
2140: 65 20 63 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c  e content exactl
2150: 79 20 6d 61 74 63 68 65 73 20 77 68 61 74 0a 2a  y matches what.*
2160: 2a 20 20 20 20 20 63 75 72 72 65 6e 74 6c 79 20  *     currently 
2170: 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 64 61  exists in the da
2180: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
2190: 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
21a0: 69 73 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66  is also.**     f
21b0: 61 6c 73 65 20 69 66 20 74 68 65 20 6f 72 69 67  alse if the orig
21c0: 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  inal content has
21d0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
21e0: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
21f0: 63 6b 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  ck.**     journa
2200: 6c 20 61 6e 64 20 73 79 6e 63 65 64 2e 20 20 49  l and synced.  I
2210: 66 20 74 68 65 20 70 61 67 65 20 72 65 70 72 65  f the page repre
2220: 73 65 6e 74 73 20 61 20 6e 65 77 20 70 61 67 65  sents a new page
2230: 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 20 20 20   that has.**    
2240: 20 62 65 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f   been added onto
2250: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2260: 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
2270: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20  the current.**  
2280: 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20     transaction, 
2290: 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61  the needSync fla
22a0: 67 20 69 73 20 74 72 75 65 20 75 6e 74 69 6c 20  g is true until 
22b0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
22c0: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a  abase.**     siz
22d0: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
22e0: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
22f0: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
2300: 0a 2a 2a 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c  .**.** inJournal
2310: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20  .**.**     This 
2320: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
2330: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 68 61 73  riginal page has
2340: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e   been written in
2350: 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20  to the main.**  
2360: 20 20 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72     rollback jour
2370: 6e 61 6c 2e 20 20 54 68 69 73 20 69 73 20 61 6c  nal.  This is al
2380: 77 61 79 73 20 66 61 6c 73 65 20 66 6f 72 20 6e  ways false for n
2390: 65 77 20 70 61 67 65 73 20 61 64 64 65 64 20 74  ew pages added t
23a0: 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 65 6e 64  o.**     the end
23b0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
23c0: 20 66 69 6c 65 20 64 75 72 69 6e 67 20 74 68 65   file during the
23d0: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
23e0: 74 69 6f 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64  tion..**     And
23f0: 20 74 68 69 73 20 66 6c 61 67 20 73 61 79 73 20   this flag says 
2400: 6e 6f 74 68 69 6e 67 20 61 62 6f 75 74 20 77 68  nothing about wh
2410: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
2420: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
2430: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
2440: 74 6f 20 64 69 73 6b 2e 20 20 46 6f 72 20 70 61  to disk.  For pa
2450: 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20  ges that are in 
2460: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
2470: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
2480: 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
2490: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 68 6f 75   expression shou
24a0: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 72 75  ld always be tru
24b0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69  e:.**.**       i
24c0: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67  nJournal = (pPag
24d0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 28  er->aInJournal[(
24e0: 70 67 6e 6f 2d 31 29 2f 38 5d 20 26 20 28 31 3c  pgno-1)/8] & (1<
24f0: 3c 28 28 70 67 6e 6f 2d 31 29 25 38 29 29 21 3d  <((pgno-1)%8))!=
2500: 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65 20  0.**.**     The 
2510: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
2520: 61 6c 5b 5d 20 61 72 72 61 79 20 69 73 20 6f 6e  al[] array is on
2530: 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65  ly valid for the
2540: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   original.**    
2550: 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 64 61   pages of the da
2560: 74 61 62 61 73 65 2c 20 6e 6f 74 20 6e 65 77 20  tabase, not new 
2570: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
2580: 64 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64 0a  dded to the end.
2590: 2a 2a 20 20 20 20 20 6f 66 20 74 68 65 20 64 61  **     of the da
25a0: 74 61 62 61 73 65 2c 20 73 6f 20 6f 62 76 69 6f  tabase, so obvio
25b0: 75 73 6c 79 20 74 68 65 20 61 62 6f 76 65 20 65  usly the above e
25c0: 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 6e 6f 74  xpression cannot
25d0: 20 62 65 0a 2a 2a 20 20 20 20 20 76 61 6c 69 64   be.**     valid
25e0: 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73 2e 20   for new pages. 
25f0: 20 46 6f 72 20 6e 65 77 20 70 61 67 65 73 20 69   For new pages i
2600: 6e 4a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77 61  nJournal is alwa
2610: 79 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72 74  ys 0..**.** dirt
2620: 79 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 6e  y.**.**     When
2630: 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e   true, this mean
2640: 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  s that the conte
2650: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  nt of the page h
2660: 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20 6d  as been.**     m
2670: 6f 64 69 66 69 65 64 20 61 6e 64 20 6e 65 65 64  odified and need
2680: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
2690: 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61  back to the data
26a0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
26b0: 20 20 49 66 20 66 61 6c 73 65 2c 20 69 74 20 6d    If false, it m
26c0: 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72  eans that either
26d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
26e0: 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20 20  the page is.**  
26f0: 20 20 20 75 6e 63 68 61 6e 67 65 64 20 6f 72 20     unchanged or 
2700: 65 6c 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  else the content
2710: 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74 20   is unimportant 
2720: 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a  and we do not.**
2730: 20 20 20 20 20 63 61 72 65 20 77 68 65 74 68 65       care whethe
2740: 72 20 6f 72 20 6e 6f 74 20 69 74 20 69 73 20 70  r or not it is p
2750: 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  reserved..**.** 
2760: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 2a  alwaysRollback.*
2770: 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 6d 65  *.**     This me
2780: 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  ans that the sql
2790: 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
27a0: 6c 62 61 63 6b 28 29 20 41 50 49 20 73 68 6f 75  lback() API shou
27b0: 6c 64 20 62 65 0a 2a 2a 20 20 20 20 20 69 67 6e  ld be.**     ign
27c0: 6f 72 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  ored for this pa
27d0: 67 65 2e 20 20 54 68 65 20 44 6f 6e 74 52 6f 6c  ge.  The DontRol
27e0: 6c 62 61 63 6b 28 29 20 41 50 49 20 61 74 74 65  lback() API atte
27f0: 6d 70 74 73 20 74 6f 20 73 61 79 0a 2a 2a 20 20  mpts to say.**  
2800: 20 20 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74     that the cont
2810: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
2820: 6f 6e 20 64 69 73 6b 20 69 73 20 75 6e 69 6d 70  on disk is unimp
2830: 6f 72 74 61 6e 74 20 28 69 74 20 69 73 20 61 6e  ortant (it is an
2840: 0a 2a 2a 20 20 20 20 20 75 6e 75 73 65 64 20 70  .**     unused p
2850: 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  age on the freel
2860: 69 73 74 29 20 73 6f 20 74 68 61 74 20 69 74 20  ist) so that it 
2870: 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 74  is unnecessary t
2880: 6f 20 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62 61  o .**     rollba
2890: 63 6b 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ck changes to th
28a0: 69 73 20 70 61 67 65 20 62 65 63 61 75 73 65 20  is page because 
28b0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
28c0: 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63  he page.**     c
28d0: 61 6e 20 63 68 61 6e 67 65 20 77 69 74 68 6f 75  an change withou
28e0: 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6d  t changing the m
28f0: 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  eaning of the da
2900: 74 61 62 61 73 65 2e 20 20 54 68 69 73 0a 2a 2a  tabase.  This.**
2910: 20 20 20 20 20 66 6c 61 67 20 6f 76 65 72 72 69       flag overri
2920: 64 65 73 20 61 6e 79 20 44 6f 6e 74 52 6f 6c 6c  des any DontRoll
2930: 62 61 63 6b 28 29 20 61 74 74 65 6d 70 74 2e 20  back() attempt. 
2940: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65   This flag is se
2950: 74 0a 2a 2a 20 20 20 20 20 77 68 65 6e 20 61 20  t.**     when a 
2960: 70 61 67 65 20 74 68 61 74 20 6f 72 69 67 69 6e  page that origin
2970: 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 76  ally contained v
2980: 61 6c 69 64 20 64 61 74 61 20 69 73 20 61 64 64  alid data is add
2990: 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  ed to.**     the
29a0: 20 66 72 65 65 6c 69 73 74 2e 20 20 4c 61 74 65   freelist.  Late
29b0: 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74 72  r in the same tr
29c0: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20  ansaction, this 
29d0: 70 61 67 65 20 6d 69 67 68 74 0a 2a 2a 20 20 20  page might.**   
29e0: 20 20 62 65 20 70 75 6c 6c 65 64 20 66 72 6f 6d    be pulled from
29f0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e   the freelist an
2a00: 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d  d reused for som
2a10: 65 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ething different
2a20: 0a 2a 2a 20 20 20 20 20 61 6e 64 20 61 74 20 74  .**     and at t
2a30: 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20 44 6f  hat point the Do
2a40: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50 49  ntRollback() API
2a50: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
2a60: 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20 70  because.**     p
2a70: 61 67 65 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  ages taken from 
2a80: 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 6f 20  the freelist do 
2a90: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70  not need to be p
2aa0: 72 6f 74 65 63 74 65 64 20 62 79 0a 2a 2a 20 20  rotected by.**  
2ab0: 20 20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20     the rollback 
2ac0: 6a 6f 75 72 6e 61 6c 2e 20 20 42 75 74 20 74 68  journal.  But th
2ad0: 69 73 20 66 6c 61 67 20 73 61 79 73 20 74 68 61  is flag says tha
2ae0: 74 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a  t the page was.*
2af0: 2a 20 20 20 20 20 6e 6f 74 20 6f 72 69 67 69 6e  *     not origin
2b00: 61 6c 6c 79 20 70 61 72 74 20 6f 66 20 74 68 65  ally part of the
2b10: 20 66 72 65 65 6c 69 73 74 20 73 6f 20 74 68 61   freelist so tha
2b20: 74 20 69 74 20 73 74 69 6c 6c 20 6e 65 65 64 73  t it still needs
2b30: 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65 20 72 6f   to.**     be ro
2b40: 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69  lled back in spi
2b50: 74 65 20 6f 66 20 61 6e 79 20 73 75 62 73 65 71  te of any subseq
2b60: 75 65 6e 74 20 44 6f 6e 74 52 6f 6c 6c 62 61 63  uent DontRollbac
2b70: 6b 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  k() calls..**.**
2b80: 20 6e 65 65 64 52 65 61 64 20 0a 2a 2a 0a 2a 2a   needRead .**.**
2b90: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 6d       This flag m
2ba0: 65 61 6e 73 20 28 77 68 65 6e 20 74 72 75 65 29  eans (when true)
2bb0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
2bc0: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 61  t of the page ha
2bd0: 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 79 65 74  s.**     not yet
2be0: 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 66 72 6f   been loaded fro
2bf0: 6d 20 64 69 73 6b 2e 20 20 54 68 65 20 69 6e 2d  m disk.  The in-
2c00: 6d 65 6d 6f 72 79 20 63 6f 6e 74 65 6e 74 20 69  memory content i
2c10: 73 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 67 61  s just.**     ga
2c20: 72 62 61 67 65 2e 20 20 28 41 63 74 75 61 6c 6c  rbage.  (Actuall
2c30: 79 2c 20 77 65 20 7a 65 72 6f 20 74 68 65 20 63  y, we zero the c
2c40: 6f 6e 74 65 6e 74 2c 20 62 75 74 20 79 6f 75 20  ontent, but you 
2c50: 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20  should not.**   
2c60: 20 20 6d 61 6b 65 20 61 6e 79 20 61 73 73 75 6d    make any assum
2c70: 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 74 68 65  ptions about the
2c80: 20 63 6f 6e 74 65 6e 74 20 6e 65 76 65 72 74 68   content neverth
2c90: 65 6c 65 73 73 2e 29 20 20 49 66 20 74 68 65 0a  eless.)  If the.
2ca0: 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 69  **     content i
2cb0: 73 20 6e 65 65 64 65 64 20 69 6e 20 74 68 65 20  s needed in the 
2cc0: 66 75 74 75 72 65 2c 20 69 74 20 73 68 6f 75 6c  future, it shoul
2cd0: 64 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  d be read from t
2ce0: 68 65 0a 2a 2a 20 20 20 20 20 6f 72 69 67 69 6e  he.**     origin
2cf0: 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
2d00: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 67 48 64  ..*/.struct PgHd
2d10: 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  r {.  Pager *pPa
2d20: 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ger;            
2d30: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
2d40: 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20  r to which this 
2d50: 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a  page belongs */.
2d60: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d80: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
2d90: 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  ber for this pag
2da0: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  e */.  PgHdr *pN
2db0: 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76 48  extHash, *pPrevH
2dc0: 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f  ash;  /* Hash co
2dd0: 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f  llision chain fo
2de0: 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a  r PgHdr.pgno */.
2df0: 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 66    PagerLruLink f
2e00: 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ree;            
2e10: 20 2f 2a 20 4e 65 78 74 20 61 6e 64 20 70 72 65   /* Next and pre
2e20: 76 69 6f 75 73 20 66 72 65 65 20 70 61 67 65 73  vious free pages
2e30: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
2e40: 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  xtAll;          
2e50: 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f       /* A list o
2e60: 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20  f all pages */. 
2e70: 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20   u8 inJournal;  
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62  /* TRUE if has b
2ea0: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
2eb0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
2ec0: 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  irty;           
2ed0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
2ee0: 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  UE if we need to
2ef0: 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e   write back chan
2f00: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64  ges */.  u8 need
2f10: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
2f20: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20          /* Sync 
2f30: 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77  journal before w
2f40: 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67 65  riting this page
2f50: 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52   */.  u8 alwaysR
2f60: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  ollback;        
2f70: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
2f80: 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66  DontRollback() f
2f90: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
2fa0: 20 20 75 38 20 6e 65 65 64 52 65 61 64 3b 20 20    u8 needRead;  
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 20 2f 2a 20 52 65 61 64 20 63 6f 6e 74 65 6e 74   /* Read content
2fd0: 20 69 66 20 50 61 67 65 72 57 72 69 74 65 28 29   if PagerWrite()
2fe0: 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20   is called */.  
2ff0: 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b 20  short int nRef; 
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3010: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72  * Number of user
3020: 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a  s of this page *
3030: 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74  /.  PgHdr *pDirt
3040: 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79 3b 20  y, *pPrevDirty; 
3050: 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65     /* Dirty page
3060: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
3070: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
3080: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61  _MANAGEMENT.  Pa
3090: 67 65 72 4c 72 75 4c 69 6e 6b 20 67 66 72 65 65  gerLruLink gfree
30a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
30b0: 47 6c 6f 62 61 6c 20 6c 69 73 74 20 6f 66 20 6e  Global list of n
30c0: 52 65 66 3d 3d 30 20 70 61 67 65 73 20 2a 2f 0a  Ref==0 pages */.
30d0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
30e0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
30f0: 0a 20 20 75 33 32 20 70 61 67 65 48 61 73 68 3b  .  u32 pageHash;
3100: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 2a  .#endif.  void *
3110: 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
3120: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
3130: 20 64 61 74 61 20 2a 2f 0a 20 20 2f 2a 20 50 61   data */.  /* Pa
3140: 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73  ger.nExtra bytes
3150: 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 61   of local data a
3160: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 69 73 20  ppended to this 
3170: 68 65 61 64 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  header */.};../*
3180: 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65  .** For an in-me
3190: 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62 61  mory only databa
31a0: 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20 69  se, some extra i
31b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65  nformation is re
31c0: 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20  corded about.** 
31d0: 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68 61  each page so tha
31e0: 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62 65  t changes can be
31f0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28   rolled back.  (
3200: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72  Journal files ar
3210: 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f  e not.** used fo
3220: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
3230: 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f 6c  bases.)  The fol
3240: 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  lowing informati
3250: 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a  on is added to.*
3260: 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  * the end of eve
3270: 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20 66  ry EXTRA block f
3280: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
3290: 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  abases..**.** Th
32a0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  is information c
32b0: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 61  ould have been a
32c0: 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74 6f  dded directly to
32d0: 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75 63   the PgHdr struc
32e0: 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65  ture..** But the
32f0: 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65 20  n it would take 
3300: 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62 79  up an extra 8 by
3310: 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20 6f  tes of storage o
3320: 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a 2a  n every PgHdr.**
3330: 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62   even for disk-b
3340: 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e 20  ased databases. 
3350: 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f 75   Splitting it ou
3360: 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73 2e  t saves 8 bytes.
3370: 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c    This.** is onl
3380: 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20 30  y a savings of 0
3390: 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70 65  .8% but those pe
33a0: 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75 70  rcentages add up
33b0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
33c0: 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50 67  uct PgHistory Pg
33d0: 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74 20  History;.struct 
33e0: 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75 38  PgHistory {.  u8
33f0: 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20   *pOrig;     /* 
3400: 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74 65  Original page te
3410: 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f 20  xt.  Restore to 
3420: 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72  this on a full r
3430: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20  ollback */.  u8 
3440: 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54  *pStmt;     /* T
3450: 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61 74  ext as it was at
3460: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
3470: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
3480: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 50 67 48  atement */.  PgH
3490: 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20 2a  dr *pNextStmt, *
34a0: 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20 4c  pPrevStmt;  /* L
34b0: 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
34c0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
34d0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e  urnal */.  u8 in
34e0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
34f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
3500: 45 20 69 66 20 69 6e 20 74 68 65 20 73 74 61 74  E if in the stat
3510: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
3520: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
3530: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
3540: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
3550: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
3560: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
3570: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
3580: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
3590: 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f  ,N,X) if( P->xCo
35a0: 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43 6f  dec!=0 ){ P->xCo
35b0: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67  dec(P->pCodecArg
35c0: 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65 66  ,D,N,X); }.# def
35d0: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
35e0: 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d 3e  ,X) ((char*)(P->
35f0: 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43 6f  xCodec!=0?P->xCo
3600: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67  dec(P->pCodecArg
3610: 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c 73  ,D,N,X):D)).#els
3620: 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  e.# define CODEC
3630: 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f  1(P,D,N,X) /* NO
3640: 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  -OP */.# define 
3650: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20  CODEC2(P,D,N,X) 
3660: 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64 69  ((char*)D).#endi
3670: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
3680: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
3690: 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f 69  PgHdr into a poi
36a0: 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74 61  nter to its data
36b0: 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67 61  .** and back aga
36c0: 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  in..*/.#define P
36d0: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29 20  GHDR_TO_DATA(P) 
36e0: 20 20 20 28 28 50 29 2d 3e 70 44 61 74 61 29 0a     ((P)->pData).
36f0: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
3700: 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28 76 6f  _EXTRA(G,P) ((vo
3710: 69 64 2a 29 26 28 28 47 29 5b 31 5d 29 29 0a 23  id*)&((G)[1])).#
3720: 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f  define PGHDR_TO_
3730: 48 49 53 54 28 50 2c 50 47 52 29 20 20 5c 0a 20  HIST(P,PGR)  \. 
3740: 20 20 20 20 20 20 20 20 20 20 20 28 28 50 67 48             ((PgH
3750: 69 73 74 6f 72 79 2a 29 26 28 28 63 68 61 72 2a  istory*)&((char*
3760: 29 28 26 28 50 29 5b 31 5d 29 29 5b 28 50 47 52  )(&(P)[1]))[(PGR
3770: 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a  )->nExtra])../*.
3780: 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63  ** A open page c
3790: 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61  ache is an insta
37a0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
37b0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
37c0: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72 43  **.** Pager.errC
37d0: 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ode may be set t
37e0: 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  o SQLITE_IOERR, 
37f0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
3800: 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  or.** or SQLITE_
3810: 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f  FULL. Once one o
3820: 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  f the first thre
3830: 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c  e errors occurs,
3840: 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20   it persists.** 
3850: 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 20  and is returned 
3860: 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  as the result of
3870: 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67   every major pag
3880: 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68  er API call.  Th
3890: 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  e.** SQLITE_FULL
38a0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20   return code is 
38b0: 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65  slightly differe
38c0: 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73 20  nt. It persists 
38d0: 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a  only until the.*
38e0: 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75  * next successfu
38f0: 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65  l rollback is pe
3900: 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70  rformed on the p
3910: 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f  ager cache. Also
3920: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  ,.** SQLITE_FULL
3930: 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74   does not affect
3940: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
3950: 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  rGet() and sqlit
3960: 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 0a  e3PagerLookup().
3970: 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d 61  ** APIs, they ma
3980: 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64 20  y still be used 
3990: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2f  successfully..*/
39a0: 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a  .struct Pager {.
39b0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
39c0: 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Vfs;          /*
39d0: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f   OS functions to
39e0: 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a 20   use for IO */. 
39f0: 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b   u8 journalOpen;
3a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3a10: 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20  True if journal 
3a20: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
3a30: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75   is valid */.  u
3a40: 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  8 journalStarted
3a50: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
3a60: 75 65 20 69 66 20 68 65 61 64 65 72 20 6f 66 20  ue if header of 
3a70: 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
3a80: 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75  d */.  u8 useJou
3a90: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
3aa0: 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c     /* Use a roll
3ab0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20  back journal on 
3ac0: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75  this file */.  u
3ad0: 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20  8 noReadlock;   
3ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
3af0: 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20 6f   not bother to o
3b00: 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20  btain readlocks 
3b10: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65 6e  */.  u8 stmtOpen
3b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3b30: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
3b40: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
3b50: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a  rnal is open */.
3b60: 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b 20    u8 stmtInUse; 
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b80: 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e 20   True we are in 
3b90: 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  a statement subt
3ba0: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
3bb0: 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e 3b  u8 stmtAutoopen;
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3bd0: 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61 6c  pen stmt journal
3be0: 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e   when main journ
3bf0: 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20  al is opened*/. 
3c00: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3c20: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
3c30: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
3c40: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
3c50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3c60: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
3c70: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
3c80: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
3c90: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c   */.  u8 sync_fl
3ca0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
3cb0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43    /* One of SYNC
3cc0: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f  _NORMAL or SYNC_
3cd0: 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 73 74 61  FULL */.  u8 sta
3ce0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
3cf0: 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55        /* PAGER_U
3d00: 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20  NLOCK, _SHARED, 
3d10: 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20  _RESERVED, etc. 
3d20: 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65  */.  u8 tempFile
3d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3d40: 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   /* zFilename is
3d50: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
3d60: 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e  e */.  u8 readOn
3d70: 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ly;             
3d80: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
3d90: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
3da0: 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64  ase */.  u8 need
3db0: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
3dc0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3dd0: 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65  an fsync() is ne
3de0: 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  eded on the jour
3df0: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
3e00: 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20  yCache;         
3e10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3e20: 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61 76  cached pages hav
3e30: 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75  e changed */.  u
3e40: 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  8 alwaysRollback
3e50: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69  ;          /* Di
3e60: 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61  sable DontRollba
3e70: 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61 67  ck() for all pag
3e80: 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62  es */.  u8 memDb
3e90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3ea0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69      /* True to i
3eb0: 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20  nhibit all file 
3ec0: 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d  I/O */.  u8 setM
3ed0: 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
3ee0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3ef0: 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62  a m-j name has b
3f00: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
3f10: 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f  rnl */.  u8 doNo
3f20: 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  tSync;          
3f30: 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e       /* Boolean.
3f40: 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64 6f 20   While true, do 
3f50: 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61  not spill the ca
3f60: 63 68 65 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c  che */.  u8 excl
3f70: 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20  usiveMode;      
3f80: 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e       /* Boolean.
3f90: 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67   True if locking
3fa0: 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45  _mode==EXCLUSIVE
3fb0: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
3fc0: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
3fd0: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
3fe0: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
3ff0: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
4000: 2f 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67 73  /.  u32 vfsFlags
4010: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4020: 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c  /* Flags for sql
4030: 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
4040: 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64   */.  int errCod
4050: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4060: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65    /* One of seve
4070: 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72  ral kinds of err
4080: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53  ors */.  int dbS
4090: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
40a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
40b0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66  f pages in the f
40c0: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69  ile */.  int ori
40d0: 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20  gDbSize;        
40e0: 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62       /* dbSize b
40f0: 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  efore the curren
4100: 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e  t change */.  in
4110: 74 20 73 74 6d 74 53 69 7a 65 3b 20 20 20 20 20  t stmtSize;     
4120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
4130: 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 28 69  e of database (i
4140: 6e 20 70 61 67 65 73 29 20 61 74 20 73 74 6d 74  n pages) at stmt
4150: 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e  _begin() */.  in
4160: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
4170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4180: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
4190: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
41a0: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
41b0: 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  umInit;         
41c0: 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61       /* Quasi-ra
41d0: 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64  ndom value added
41e0: 20 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73   to every checks
41f0: 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74  um */.  int stmt
4200: 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  NRec;           
4210: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4220: 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74   records in stmt
4230: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   subjournal */. 
4240: 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20   int nExtra;    
4250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4260: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  Add this many by
4270: 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  tes to each in-m
4280: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
4290: 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20  int pageSize;   
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
42b0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
42c0: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  n a page */.  in
42d0: 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
42e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
42f0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  al number of in-
4300: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a  memory pages */.
4310: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4330: 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   Number of in-me
4340: 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74 68 20  mory pages with 
4350: 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a  PgHdr.nRef>0 */.
4360: 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20    int mxPage;   
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4380: 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
4390: 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64  of pages to hold
43a0: 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 50   in cache */.  P
43b0: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
43c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
43d0: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
43e0: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
43f0: 73 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 4a  se */.  u8 *aInJ
4400: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
4410: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
4420: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
4430: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
4440: 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 53 74  e */.  u8 *aInSt
4450: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
4460: 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f     /* One bit fo
4470: 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  r each page in t
4480: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
4490: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
44a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
44b0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
44c0: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
44d0: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
44e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
44f0: 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
4500: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  l file */.  char
4510: 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20 20 20   *zDirectory;   
4520: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63          /* Direc
4530: 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61 62 61  tory hold databa
4540: 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66  se and journal f
4550: 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  iles */.  char *
4560: 7a 53 74 6d 74 4a 72 6e 6c 3b 20 20 20 20 20 20  zStmtJrnl;      
4570: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
4580: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
4590: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
45a0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
45b0: 64 2c 20 2a 6a 66 64 3b 20 20 20 20 20 2f 2a 20  d, *jfd;     /* 
45c0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  File descriptors
45d0: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e   for database an
45e0: 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73  d journal */.  s
45f0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 74 66  qlite3_file *stf
4600: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  d;         /* Fi
4610: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
4620: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  r the statement 
4630: 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42  subjournal*/.  B
4640: 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73  usyHandler *pBus
4650: 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f  yHandler;  /* Po
4660: 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 2e  inter to sqlite.
4670: 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20  busyHandler */. 
4680: 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20 6c 72   PagerLruList lr
4690: 75 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  u;           /* 
46a0: 4c 52 55 20 6c 69 73 74 20 6f 66 20 66 72 65 65  LRU list of free
46b0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
46c0: 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20  r *pAll;        
46d0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
46e0: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
46f0: 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74 3b 20    PgHdr *pStmt; 
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4710: 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69   List of pages i
4720: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
4730: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  subjournal */.  
4740: 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b 20 20  PgHdr *pDirty;  
4750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
4760: 69 73 74 20 6f 66 20 61 6c 6c 20 64 69 72 74 79  ist of all dirty
4770: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 36 34 20   pages */.  i64 
4780: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
4790: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
47a0: 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 69  nt byte offset i
47b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
47c0: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
47d0: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
47e0: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
47f0: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
4800: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
4810: 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72 4f 66  .  i64 stmtHdrOf
4820: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
4830: 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  * First journal 
4840: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74  header written t
4850: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  his statement */
4860: 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73 75 6d  .  i64 stmtCksum
4870: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4880: 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68 65 6e  * cksumInit when
4890: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73   statement was s
48a0: 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 36 34 20  tarted */.  i64 
48b0: 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20 20  stmtJSize;      
48c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
48d0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74  of journal at st
48e0: 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20  mt_begin() */.  
48f0: 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b 20  int sectorSize; 
4900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4910: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
4920: 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ze during rollba
4930: 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ck */.#ifdef SQL
4940: 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e  ITE_TEST.  int n
4950: 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20  Hit, nMiss;     
4960: 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20         /* Cache 
4970: 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69 6e 67  hits and missing
4980: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c   */.  int nRead,
4990: 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
49a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61    /* Database pa
49b0: 67 65 73 20 72 65 61 64 2f 77 72 69 74 74 65 6e  ges read/written
49c0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69   */.#endif.  voi
49d0: 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f 72 29  d (*xDestructor)
49e0: 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20 2f  (DbPage*,int); /
49f0: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
4a00: 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e 67  ine when freeing
4a10: 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64   pages */.  void
4a20: 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62   (*xReiniter)(Db
4a30: 50 61 67 65 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a  Page*,int);   /*
4a40: 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   Call this routi
4a50: 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e  ne when reloadin
4a60: 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65  g pages */.#ifde
4a70: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4a80: 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f  EC.  void *(*xCo
4a90: 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
4aa0: 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52  ,Pgno,int); /* R
4ab0: 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65  outine for en/de
4ac0: 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20  coding data */. 
4ad0: 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67   void *pCodecArg
4ae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4af0: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
4b00: 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 23 65  o xCodec() */.#e
4b10: 6e 64 69 66 0a 20 20 69 6e 74 20 6e 48 61 73 68  ndif.  int nHash
4b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4b30: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
4b40: 65 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62  e pager hash tab
4b50: 6c 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a  le */.  PgHdr **
4b60: 61 48 61 73 68 3b 20 20 20 20 20 20 20 20 20 20  aHash;          
4b70: 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c      /* Hash tabl
4b80: 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75  e to map page nu
4b90: 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20 2a 2f  mber to PgHdr */
4ba0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
4bb0: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
4bc0: 41 47 45 4d 45 4e 54 0a 20 20 50 61 67 65 72 20  AGEMENT.  Pager 
4bd0: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
4be0: 20 20 20 20 20 20 2f 2a 20 44 6f 75 62 6c 79 20        /* Doubly 
4bf0: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70  linked list of p
4c00: 61 67 65 72 73 20 6f 6e 20 77 68 69 63 68 20 2a  agers on which *
4c10: 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 72 65 76  /.  Pager *pPrev
4c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4c30: 2f 2a 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  /* sqlite3_relea
4c40: 73 65 5f 6d 65 6d 6f 72 79 28 29 20 77 69 6c 6c  se_memory() will
4c50: 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 6e 74 20 69   work */.  int i
4c60: 49 6e 55 73 65 4d 4d 3b 20 20 20 20 20 20 20 20  InUseMM;        
4c70: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65         /* Non-ze
4c80: 72 6f 20 69 66 20 75 6e 61 76 61 69 6c 61 62 6c  ro if unavailabl
4c90: 65 20 74 6f 20 4d 4d 20 2a 2f 0a 20 20 69 6e 74  e to MM */.  int
4ca0: 20 69 49 6e 55 73 65 44 42 3b 20 20 20 20 20 20   iInUseDB;      
4cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d           /* Non-
4cc0: 7a 65 72 6f 20 69 66 20 69 6e 20 73 71 6c 69 74  zero if in sqlit
4cd0: 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  e3_release_memor
4ce0: 79 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  y() */.#endif.  
4cf0: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
4d10: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
4d20: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
4d30: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63 68   tmp use */.  ch
4d40: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
4d50: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
4d60: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
4d70: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
4d80: 67 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ges */.};../*.**
4d90: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
4da0: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
4db0: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
4dc0: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
4dd0: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
4de0: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
4df0: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
4e00: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
4e10: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
4e20: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
4e30: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
4e40: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4e50: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
4e60: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
4e70: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
4e80: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
4e90: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
4ea0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
4eb0: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
4ec0: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
4ed0: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
4ee0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
4ef0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
4f00: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
4f10: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
4f20: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
4f30: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
4f40: 6c 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  l */.int sqlite3
4f50: 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f  _pager_pgfree_co
4f60: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
4f70: 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
4f80: 61 67 65 73 20 66 72 65 65 64 20 2a 2f 0a 23 20  ages freed */.# 
4f90: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
4fa0: 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a  R(v)  v++.#else.
4fb0: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
4fc0: 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 2f  NCR(v).#endif../
4fd0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
4fe0: 6e 67 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e  ng variable poin
4ff0: 74 73 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  ts to the head o
5000: 66 20 61 20 64 6f 75 62 6c 65 2d 6c 69 6e 6b 65  f a double-linke
5010: 64 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c  d list.** of all
5020: 20 70 61 67 65 72 73 20 74 68 61 74 20 61 72 65   pagers that are
5030: 20 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61   eligible for pa
5040: 67 65 20 73 74 65 61 6c 69 6e 67 20 62 79 20 74  ge stealing by t
5050: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 72 65  he.** sqlite3_re
5060: 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 69  lease_memory() i
5070: 6e 74 65 72 66 61 63 65 2e 20 20 41 63 63 65 73  nterface.  Acces
5080: 73 20 74 6f 20 74 68 69 73 20 6c 69 73 74 20 69  s to this list i
5090: 73 0a 2a 2a 20 70 72 6f 74 65 63 74 65 64 20 62  s.** protected b
50a0: 79 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 55 54  y the SQLITE_MUT
50b0: 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 20 6d  EX_STATIC_MEM2 m
50c0: 75 74 65 78 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  utex..*/.#ifdef 
50d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
50e0: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
50f0: 73 74 61 74 69 63 20 50 61 67 65 72 20 2a 73 71  static Pager *sq
5100: 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 20 3d  lite3PagerList =
5110: 20 30 3b 0a 73 74 61 74 69 63 20 50 61 67 65 72   0;.static Pager
5120: 4c 72 75 4c 69 73 74 20 73 71 6c 69 74 65 33 4c  LruList sqlite3L
5130: 72 75 50 61 67 65 4c 69 73 74 20 3d 20 7b 30 2c  ruPageList = {0,
5140: 20 30 2c 20 30 7d 3b 0a 23 65 6e 64 69 66 0a 0a   0, 0};.#endif..
5150: 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66  ./*.** Journal f
5160: 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20  iles begin with 
5170: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
5180: 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65  gic string.  The
5190: 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74   data.** was obt
51a0: 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f  ained from /dev/
51b0: 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75  random.  It is u
51c0: 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61  sed only as a sa
51d0: 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a  nity check..**.*
51e0: 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20  * Since version 
51f0: 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e  2.8.0, the journ
5200: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69  al format contai
5210: 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  ns additional sa
5220: 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67  nity.** checking
5230: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
5240: 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c  f the power fail
5250: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
5260: 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20  nal is begin.** 
5270: 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61  written, semi-ra
5280: 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74  ndom garbage dat
5290: 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  a might appear i
52a0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
52b0: 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65   file after powe
52c0: 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20  r is restored.  
52d0: 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  If an attempt is
52e0: 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f   then made.** to
52f0: 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61   roll the journa
5300: 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  l back, the data
5310: 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f  base could be co
5320: 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64  rrupted.  The ad
5330: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69  ditional.** sani
5340: 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61  ty checking data
5350: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
5360: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67  o discover the g
5370: 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  arbage in the.**
5380: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e   journal and ign
5390: 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ore it..**.** Th
53a0: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
53b0: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
53c0: 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61  r the new journa
53d0: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74  l format consist
53e0: 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74  s.** of a 32-bit
53f0: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63   checksum on eac
5400: 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20  h page of data. 
5410: 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f   The checksum co
5420: 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65  vers both.** the
5430: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
5440: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67   the pPager->pag
5450: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
5460: 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
5470: 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20  ..** This cksum 
5480: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
5490: 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f  o a 32-bit rando
54a0: 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70  m value that app
54b0: 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  ears in the.** j
54c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68  ournal file righ
54d0: 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64  t after the head
54e0: 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20  er.  The random 
54f0: 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69  initializer is i
5500: 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63  mportant,.** bec
5510: 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74  ause garbage dat
5520: 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  a that appears a
5530: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
5540: 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79  ournal is likely
5550: 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61  .** data that wa
5560: 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20  s once in other 
5570: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
5580: 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64  now been deleted
5590: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72  .  If the.** gar
55a0: 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66  bage data came f
55b0: 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20  rom an obsolete 
55c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
55d0: 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68  e checksums migh
55e0: 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e  t.** be correct.
55f0: 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c    But by initial
5600: 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  izing the checks
5610: 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c  um to random val
5620: 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ue which.** is d
5630: 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
5640: 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d  ry journal, we m
5650: 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73  inimize that ris
5660: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  k..*/.static con
5670: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
5680: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
5690: 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64   = {.  0xd9, 0xd
56a0: 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30  5, 0x05, 0xf9, 0
56b0: 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c  x20, 0xa1, 0x63,
56c0: 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   0xd7,.};../*.**
56d0: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
56e0: 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65   header and of e
56f0: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
5700: 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72  journal is deter
5710: 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  mined.** by the 
5720: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73  following macros
5730: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
5740: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
5750: 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61  r)  ((pPager->pa
5760: 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a  geSize) + 8)../*
5770: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
5780: 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20  header size for 
5790: 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74  this pager. In t
57a0: 68 65 20 66 75 74 75 72 65 2c 20 74 68 69 73 20  he future, this 
57b0: 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20  could be.** set 
57c0: 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65  to some value re
57d0: 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ad from the disk
57e0: 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65   controller. The
57f0: 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68   important.** ch
5800: 61 72 61 63 74 65 72 69 73 74 69 63 20 69 73 20  aracteristic is 
5810: 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20 73  that it is the s
5820: 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64 69  ame size as a di
5830: 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64  sk sector..*/.#d
5840: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
5850: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50  R_SZ(pPager) (pP
5860: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
5870: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  )../*.** The mac
5880: 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65  ro MEMDB is true
5890: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
58a0: 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65  ng with an in-me
58b0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
58c0: 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20  * We do this as 
58d0: 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20  a macro so that 
58e0: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d  if the SQLITE_OM
58f0: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72  IT_MEMORYDB macr
5900: 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  o is set,.** the
5910: 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20   value of MEMDB 
5920: 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61  will be a consta
5930: 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  nt and the compi
5940: 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a  ler will optimiz
5950: 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68  e.** out code th
5960: 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65  at would never e
5970: 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  xecute..*/.#ifde
5980: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
5990: 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20  MORYDB.# define 
59a0: 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20  MEMDB 0.#else.# 
59b0: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61  define MEMDB pPa
59c0: 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69  ger->memDb.#endi
59d0: 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75  f../*.** Page nu
59e0: 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  mber PAGER_MJ_PG
59f0: 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  NO is never used
5a00: 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61   in an SQLite da
5a10: 74 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a  tabase (it is.**
5a20: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f   reserved for wo
5a30: 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77  rking around a w
5a40: 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63  indows/posix inc
5a50: 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49  ompatibility). I
5a60: 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20  t is.** used in 
5a70: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
5a80: 69 67 6e 69 66 79 20 74 68 61 74 20 74 68 65 20  ignify that the 
5a90: 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65  remainder of the
5aa0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
5ab0: 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20  * is devoted to 
5ac0: 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72  storing a master
5ad0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20   journal name - 
5ae0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
5af0: 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f  e pages to.** ro
5b00: 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d  ll back. See com
5b10: 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69  ments for functi
5b20: 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  on writeMasterJo
5b30: 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61  urnal() for deta
5b40: 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69  ils..*/./* #defi
5b50: 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  ne PAGER_MJ_PGNO
5b60: 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54  (x) (PENDING_BYT
5b70: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
5b80: 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )) */.#define PA
5b90: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28  GER_MJ_PGNO(x) (
5ba0: 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28  (PENDING_BYTE/((
5bb0: 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31  x)->pageSize))+1
5bc0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  )../*.** The max
5bd0: 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20  imum legal page 
5be0: 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20  number is (2^31 
5bf0: 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  - 1)..*/.#define
5c00: 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20   PAGER_MAX_PGNO 
5c10: 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a  2147483647../*.*
5c20: 2a 20 54 68 65 20 70 61 67 65 72 45 6e 74 65 72  * The pagerEnter
5c30: 28 29 20 61 6e 64 20 70 61 67 65 72 4c 65 61 76  () and pagerLeav
5c40: 65 28 29 20 72 6f 75 74 69 6e 65 73 20 61 63 71  e() routines acq
5c50: 75 69 72 65 20 61 6e 64 20 72 65 6c 65 61 73 65  uire and release
5c60: 0a 2a 2a 20 61 20 6d 75 74 65 78 20 6f 6e 20 65  .** a mutex on e
5c70: 61 63 68 20 70 61 67 65 72 2e 20 20 54 68 65 20  ach pager.  The 
5c80: 6d 75 74 65 78 20 69 73 20 72 65 63 75 72 73 69  mutex is recursi
5c90: 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ve..**.** This i
5ca0: 73 20 61 20 73 70 65 63 69 61 6c 2d 70 75 72 70  s a special-purp
5cb0: 6f 73 65 20 6d 75 74 65 78 2e 20 20 49 74 20 6f  ose mutex.  It o
5cc0: 6e 6c 79 20 70 72 6f 76 69 64 65 73 20 6d 75 74  nly provides mut
5cd0: 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e 0a 2a 2a  ual exclusion.**
5ce0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 42 74 72   between the Btr
5cf0: 65 65 20 61 6e 64 20 74 68 65 20 4d 65 6d 6f 72  ee and the Memor
5d00: 79 20 4d 61 6e 61 67 65 6d 65 6e 74 20 73 71 6c  y Management sql
5d10: 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
5d20: 6f 72 79 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f  ory().** functio
5d30: 6e 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  n.  It does not 
5d40: 70 72 65 76 65 6e 74 2c 20 66 6f 72 20 65 78 61  prevent, for exa
5d50: 6d 70 6c 65 2c 20 74 77 6f 20 42 74 72 65 65 73  mple, two Btrees
5d60: 20 66 72 6f 6d 20 61 63 63 65 73 73 69 6e 67 0a   from accessing.
5d70: 2a 2a 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  ** the same page
5d80: 72 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  r at the same ti
5d90: 6d 65 2e 20 20 4f 74 68 65 72 20 67 65 6e 65 72  me.  Other gener
5da0: 61 6c 2d 70 75 72 70 6f 73 65 20 6d 75 74 65 78  al-purpose mutex
5db0: 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 62 74 72  es in.** the btr
5dc0: 65 65 20 6c 61 79 65 72 20 68 61 6e 64 6c 65 20  ee layer handle 
5dd0: 74 68 61 74 20 63 68 6f 72 65 2e 0a 2a 2f 0a 23  that chore..*/.#
5de0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
5df0: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
5e00: 45 4d 45 4e 54 0a 20 20 73 74 61 74 69 63 20 76  EMENT.  static v
5e10: 6f 69 64 20 70 61 67 65 72 45 6e 74 65 72 28 50  oid pagerEnter(P
5e20: 61 67 65 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d  ager *p){.    p-
5e30: 3e 69 49 6e 55 73 65 44 42 2b 2b 3b 0a 20 20 20  >iInUseDB++;.   
5e40: 20 69 66 28 20 70 2d 3e 69 49 6e 55 73 65 4d 4d   if( p->iInUseMM
5e50: 20 26 26 20 70 2d 3e 69 49 6e 55 73 65 44 42 3d   && p->iInUseDB=
5e60: 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
5e70: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
5e80: 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 20 3d 20  ;.      mutex = 
5e90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
5ea0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
5eb0: 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20  _STATIC_MEM2);. 
5ec0: 20 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42       p->iInUseDB
5ed0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
5ee0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
5ef0: 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 70 2d  mutex);.      p-
5f00: 3e 69 49 6e 55 73 65 44 42 20 3d 20 31 3b 0a 20  >iInUseDB = 1;. 
5f10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
5f20: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b  ex_leave(mutex);
5f30: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
5f40: 74 28 20 70 2d 3e 69 49 6e 55 73 65 4d 4d 3d 3d  t( p->iInUseMM==
5f50: 30 20 29 3b 0a 20 20 7d 0a 20 20 73 74 61 74 69  0 );.  }.  stati
5f60: 63 20 76 6f 69 64 20 70 61 67 65 72 4c 65 61 76  c void pagerLeav
5f70: 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 20  e(Pager *p){.   
5f80: 20 70 2d 3e 69 49 6e 55 73 65 44 42 2d 2d 3b 0a   p->iInUseDB--;.
5f90: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
5fa0: 49 6e 55 73 65 44 42 3e 3d 30 20 29 3b 0a 20 20  InUseDB>=0 );.  
5fb0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
5fc0: 20 70 61 67 65 72 45 6e 74 65 72 28 58 29 0a 23   pagerEnter(X).#
5fd0: 20 64 65 66 69 6e 65 20 70 61 67 65 72 4c 65 61   define pagerLea
5fe0: 76 65 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ve(X).#endif../*
5ff0: 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72  .** Enable refer
6000: 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b  ence count track
6010: 69 6e 67 20 28 66 6f 72 20 64 65 62 75 67 67 69  ing (for debuggi
6020: 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66  ng) here:.*/.#if
6030: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
6040: 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f 72 65  .  int pager3_re
6050: 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30  finfo_enable = 0
6060: 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  ;.  static void 
6070: 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 50 67  pager_refinfo(Pg
6080: 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73 74 61  Hdr *p){.    sta
6090: 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  tic int cnt = 0;
60a0: 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 72 33  .    if( !pager3
60b0: 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20  _refinfo_enable 
60c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71  ) return;.    sq
60d0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
60e0: 28 0a 20 20 20 20 20 20 20 22 52 45 46 43 4e 54  (.       "REFCNT
60f0: 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20 6e 52  : %4d addr=%p nR
6100: 65 66 3d 25 2d 33 64 20 74 6f 74 61 6c 3d 25 64  ef=%-3d total=%d
6110: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70  \n",.       p->p
6120: 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  gno, PGHDR_TO_DA
6130: 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 2c 20  TA(p), p->nRef, 
6140: 70 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 0a  p->pPager->nRef.
6150: 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b      );.    cnt++
6160: 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67  ;   /* Something
6170: 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
6180: 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23  oint on */.  }.#
6190: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
61a0: 58 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66  X)  pager_refinf
61b0: 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  o(X).#else.# def
61c0: 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23  ine REFINFO(X).#
61d0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  endif../*.** Add
61e0: 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
61f0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 6e 6b   end of the link
6200: 65 64 20 6c 69 73 74 20 6d 61 6e 61 67 65 64 20  ed list managed 
6210: 62 79 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  by structure.** 
6220: 70 4c 69 73 74 20 28 70 50 67 20 62 65 63 6f 6d  pList (pPg becom
6230: 65 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  es the last entr
6240: 79 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2d 20  y in the list - 
6250: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
6260: 79 20 0a 2a 2a 20 75 73 65 64 29 2e 20 41 72 67  y .** used). Arg
6270: 75 6d 65 6e 74 20 70 4c 69 6e 6b 20 73 68 6f 75  ument pLink shou
6280: 6c 64 20 70 6f 69 6e 74 20 74 6f 20 65 69 74 68  ld point to eith
6290: 65 72 20 70 50 67 2d 3e 66 72 65 65 20 6f 72 20  er pPg->free or 
62a0: 70 50 67 2d 3e 67 66 72 65 65 2c 0a 2a 2a 20 64  pPg->gfree,.** d
62b0: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
62c0: 68 65 72 20 70 50 67 20 69 73 20 62 65 69 6e 67  her pPg is being
62d0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 61   added to the pa
62e0: 67 65 72 2d 73 70 65 63 69 66 69 63 20 6f 72 0a  ger-specific or.
62f0: 2a 2a 20 67 6c 6f 62 61 6c 20 4c 52 55 20 6c 69  ** global LRU li
6300: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
6310: 69 64 20 6c 69 73 74 41 64 64 28 50 61 67 65 72  id listAdd(Pager
6320: 4c 72 75 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  LruList *pList, 
6330: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c  PagerLruLink *pL
6340: 69 6e 6b 2c 20 50 67 48 64 72 20 2a 70 50 67 29  ink, PgHdr *pPg)
6350: 7b 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74  {.  pLink->pNext
6360: 20 3d 20 30 3b 0a 20 20 70 4c 69 6e 6b 2d 3e 70   = 0;.  pLink->p
6370: 50 72 65 76 20 3d 20 70 4c 69 73 74 2d 3e 70 4c  Prev = pList->pL
6380: 61 73 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ast;..#ifdef SQL
6390: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
63a0: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 61  Y_MANAGEMENT.  a
63b0: 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50  ssert(pLink==&pP
63c0: 67 2d 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e 6b  g->free || pLink
63d0: 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 29 3b 0a  ==&pPg->gfree);.
63e0: 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d    assert(pLink==
63f0: 26 70 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20 70  &pPg->gfree || p
6400: 4c 69 73 74 21 3d 26 73 71 6c 69 74 65 33 4c 72  List!=&sqlite3Lr
6410: 75 50 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e 64  uPageList);.#end
6420: 69 66 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  if..  if( pList-
6430: 3e 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 69 6e  >pLast ){.    in
6440: 74 20 69 4f 66 66 20 3d 20 28 63 68 61 72 20 2a  t iOff = (char *
6450: 29 70 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20 2a  )pLink - (char *
6460: 29 70 50 67 3b 0a 20 20 20 20 50 61 67 65 72 4c  )pPg;.    PagerL
6470: 72 75 4c 69 6e 6b 20 2a 70 4c 61 73 74 4c 69 6e  ruLink *pLastLin
6480: 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e  k = (PagerLruLin
6490: 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c 69  k *)(&((u8 *)pLi
64a0: 73 74 2d 3e 70 4c 61 73 74 29 5b 69 4f 66 66 5d  st->pLast)[iOff]
64b0: 29 3b 0a 20 20 20 20 70 4c 61 73 74 4c 69 6e 6b  );.    pLastLink
64c0: 2d 3e 70 4e 65 78 74 20 3d 20 70 50 67 3b 0a 20  ->pNext = pPg;. 
64d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
64e0: 72 74 28 21 70 4c 69 73 74 2d 3e 70 46 69 72 73  rt(!pList->pFirs
64f0: 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  t);.    pList->p
6500: 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 7d  First = pPg;.  }
6510: 0a 0a 20 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74  ..  pList->pLast
6520: 20 3d 20 70 50 67 3b 0a 20 20 69 66 28 20 21 70   = pPg;.  if( !p
6530: 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63  List->pFirstSync
6540: 65 64 20 26 26 20 70 50 67 2d 3e 6e 65 65 64 53  ed && pPg->needS
6550: 79 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ync==0 ){.    pL
6560: 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ist->pFirstSynce
6570: 64 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a  d = pPg;.  }.}..
6580: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 50 67  /*.** Remove pPg
6590: 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6d   from the list m
65a0: 61 6e 61 67 65 64 20 62 79 20 74 68 65 20 73 74  anaged by the st
65b0: 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
65c0: 74 6f 20 62 79 20 70 4c 69 73 74 2e 0a 2a 2a 0a  to by pList..**.
65d0: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 69 6e  ** Argument pLin
65e0: 6b 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74  k should point t
65f0: 6f 20 65 69 74 68 65 72 20 70 50 67 2d 3e 66 72  o either pPg->fr
6600: 65 65 20 6f 72 20 70 50 67 2d 3e 67 66 72 65 65  ee or pPg->gfree
6610: 2c 20 64 65 70 65 6e 64 69 6e 67 20 0a 2a 2a 20  , depending .** 
6620: 6f 6e 20 77 68 65 74 68 65 72 20 70 50 67 20 69  on whether pPg i
6630: 73 20 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f  s being added to
6640: 20 74 68 65 20 70 61 67 65 72 2d 73 70 65 63 69   the pager-speci
6650: 66 69 63 20 6f 72 20 67 6c 6f 62 61 6c 20 4c 52  fic or global LR
6660: 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  U list..*/.stati
6670: 63 20 76 6f 69 64 20 6c 69 73 74 52 65 6d 6f 76  c void listRemov
6680: 65 28 50 61 67 65 72 4c 72 75 4c 69 73 74 20 2a  e(PagerLruList *
6690: 70 4c 69 73 74 2c 20 50 61 67 65 72 4c 72 75 4c  pList, PagerLruL
66a0: 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20 50 67 48 64  ink *pLink, PgHd
66b0: 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 69  r *pPg){.  int i
66c0: 4f 66 66 20 3d 20 28 63 68 61 72 20 2a 29 70 4c  Off = (char *)pL
66d0: 69 6e 6b 20 2d 20 28 63 68 61 72 20 2a 29 70 50  ink - (char *)pP
66e0: 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  g;..#ifdef SQLIT
66f0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
6700: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 61 73 73  MANAGEMENT.  ass
6710: 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d  ert(pLink==&pPg-
6720: 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e 6b 3d 3d  >free || pLink==
6730: 26 70 50 67 2d 3e 67 66 72 65 65 29 3b 0a 20 20  &pPg->gfree);.  
6740: 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70  assert(pLink==&p
6750: 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20 70 4c 69  Pg->gfree || pLi
6760: 73 74 21 3d 26 73 71 6c 69 74 65 33 4c 72 75 50  st!=&sqlite3LruP
6770: 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66  ageList);.#endif
6780: 0a 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 4c 69  ..  if( pPg==pLi
6790: 73 74 2d 3e 70 46 69 72 73 74 20 29 7b 0a 20 20  st->pFirst ){.  
67a0: 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 20    pList->pFirst 
67b0: 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLink->pNext;.
67c0: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 70    }.  if( pPg==p
67d0: 4c 69 73 74 2d 3e 70 4c 61 73 74 20 29 7b 0a 20  List->pLast ){. 
67e0: 20 20 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20     pList->pLast 
67f0: 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 3b 0a  = pLink->pPrev;.
6800: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 6e 6b 2d    }.  if( pLink-
6810: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 50 61  >pPrev ){.    Pa
6820: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 50 72 65  gerLruLink *pPre
6830: 76 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72  vLink = (PagerLr
6840: 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a  uLink *)(&((u8 *
6850: 29 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 29 5b 69  )pLink->pPrev)[i
6860: 4f 66 66 5d 29 3b 0a 20 20 20 20 70 50 72 65 76  Off]);.    pPrev
6870: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 4c  Link->pNext = pL
6880: 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ink->pNext;.  }.
6890: 20 20 69 66 28 20 70 4c 69 6e 6b 2d 3e 70 4e 65    if( pLink->pNe
68a0: 78 74 20 29 7b 0a 20 20 20 20 50 61 67 65 72 4c  xt ){.    PagerL
68b0: 72 75 4c 69 6e 6b 20 2a 70 4e 65 78 74 4c 69 6e  ruLink *pNextLin
68c0: 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e  k = (PagerLruLin
68d0: 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c 69  k *)(&((u8 *)pLi
68e0: 6e 6b 2d 3e 70 4e 65 78 74 29 5b 69 4f 66 66 5d  nk->pNext)[iOff]
68f0: 29 3b 0a 20 20 20 20 70 4e 65 78 74 4c 69 6e 6b  );.    pNextLink
6900: 2d 3e 70 50 72 65 76 20 3d 20 70 4c 69 6e 6b 2d  ->pPrev = pLink-
6910: 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66  >pPrev;.  }.  if
6920: 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70 46  ( pPg==pList->pF
6930: 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20  irstSynced ){.  
6940: 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 4c 69    PgHdr *p = pLi
6950: 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 77  nk->pNext;.    w
6960: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65  hile( p && p->ne
6970: 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
6980: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c  PagerLruLink *pL
6990: 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b   = (PagerLruLink
69a0: 20 2a 29 28 26 28 28 75 38 20 2a 29 70 29 5b 69   *)(&((u8 *)p)[i
69b0: 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 70 20 3d  Off]);.      p =
69c0: 20 70 4c 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20   pL->pNext;.    
69d0: 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69  }.    pList->pFi
69e0: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
69f0: 20 7d 0a 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65   }..  pLink->pNe
6a00: 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65  xt = pLink->pPre
6a10: 76 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  v = 0;.}../* .**
6a20: 20 41 64 64 20 70 61 67 65 20 70 50 67 20 74 6f   Add page pPg to
6a30: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65   the list of fre
6a40: 65 20 70 61 67 65 73 20 66 6f 72 20 74 68 65 20  e pages for the 
6a50: 70 61 67 65 72 2e 20 49 66 20 0a 2a 2a 20 6d 65  pager. If .** me
6a60: 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
6a70: 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c 73 6f  is enabled, also
6a80: 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f   add the page to
6a90: 20 74 68 65 20 67 6c 6f 62 61 6c 20 0a 2a 2a 20   the global .** 
6aa0: 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67  list of free pag
6ab0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
6ac0: 69 64 20 6c 72 75 4c 69 73 74 41 64 64 28 50 67  id lruListAdd(Pg
6ad0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 6c 69 73  Hdr *pPg){.  lis
6ae0: 74 41 64 64 28 26 70 50 67 2d 3e 70 50 61 67 65  tAdd(&pPg->pPage
6af0: 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d 3e 66 72  r->lru, &pPg->fr
6b00: 65 65 2c 20 70 50 67 29 3b 0a 23 69 66 64 65 66  ee, pPg);.#ifdef
6b10: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
6b20: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
6b30: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 70 50 61  .  if( !pPg->pPa
6b40: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
6b50: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6b60: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75  enter(sqlite3_mu
6b70: 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
6b80: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52  _MUTEX_STATIC_LR
6b90: 55 29 29 3b 0a 20 20 20 20 6c 69 73 74 41 64 64  U));.    listAdd
6ba0: 28 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  (&sqlite3LruPage
6bb0: 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67 66 72 65  List, &pPg->gfre
6bc0: 65 2c 20 70 50 67 29 3b 0a 20 20 20 20 73 71 6c  e, pPg);.    sql
6bd0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6be0: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
6bf0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
6c00: 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
6c10: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
6c20: 20 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 61 67 65   .** Remove page
6c30: 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20 6c 69   pPg from the li
6c40: 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73  st of free pages
6c50: 20 66 6f 72 20 74 68 65 20 61 73 73 6f 63 69 61   for the associa
6c60: 74 65 64 20 70 61 67 65 72 2e 0a 2a 2a 20 49 66  ted pager..** If
6c70: 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65   memory-manageme
6c80: 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61  nt is enabled, a
6c90: 6c 73 6f 20 72 65 6d 6f 76 65 20 70 50 67 20 66  lso remove pPg f
6ca0: 72 6f 6d 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c  rom the global l
6cb0: 69 73 74 0a 2a 2a 20 6f 66 20 66 72 65 65 20 70  ist.** of free p
6cc0: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
6cd0: 76 6f 69 64 20 6c 72 75 4c 69 73 74 52 65 6d 6f  void lruListRemo
6ce0: 76 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ve(PgHdr *pPg){.
6cf0: 20 20 6c 69 73 74 52 65 6d 6f 76 65 28 26 70 50    listRemove(&pP
6d00: 67 2d 3e 70 50 61 67 65 72 2d 3e 6c 72 75 2c 20  g->pPager->lru, 
6d10: 26 70 50 67 2d 3e 66 72 65 65 2c 20 70 50 67 29  &pPg->free, pPg)
6d20: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6d30: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
6d40: 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NAGEMENT.  if( !
6d50: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d  pPg->pPager->mem
6d60: 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Db ){.    sqlite
6d70: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71  3_mutex_enter(sq
6d80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
6d90: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
6da0: 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20  TATIC_LRU));.   
6db0: 20 6c 69 73 74 52 65 6d 6f 76 65 28 26 73 71 6c   listRemove(&sql
6dc0: 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2c  ite3LruPageList,
6dd0: 20 26 70 50 67 2d 3e 67 66 72 65 65 2c 20 70 50   &pPg->gfree, pP
6de0: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g);.    sqlite3_
6df0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
6e00: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
6e10: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
6e20: 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23  TIC_LRU));.  }.#
6e30: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  endif.}../* .** 
6e40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
6e50: 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 61 66 74   called just aft
6e60: 65 72 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  er the needSync 
6e70: 66 6c 61 67 20 68 61 73 20 62 65 65 6e 20 63 6c  flag has been cl
6e80: 65 61 72 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 6c  eared.** from al
6e90: 6c 20 70 61 67 65 73 20 6d 61 6e 61 67 65 64 20  l pages managed 
6ea0: 62 79 20 70 50 61 67 65 72 20 28 75 73 75 61 6c  by pPager (usual
6eb0: 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6a  ly because the j
6ec0: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68  ournal file.** h
6ed0: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 79 6e  as just been syn
6ee0: 63 65 64 29 2e 20 49 74 20 75 70 64 61 74 65 73  ced). It updates
6ef0: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6c 72 75   the pPager->lru
6f00: 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 76 61  .pFirstSynced va
6f10: 72 69 61 62 6c 65 0a 2a 2a 20 61 6e 64 2c 20 69  riable.** and, i
6f20: 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d  f memory-managem
6f30: 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ent is enabled, 
6f40: 74 68 65 20 73 71 6c 69 74 65 33 4c 72 75 50 61  the sqlite3LruPa
6f50: 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e  geList.pFirstSyn
6f60: 63 65 64 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ced.** variable 
6f70: 61 6c 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  also..*/.static 
6f80: 76 6f 69 64 20 6c 72 75 4c 69 73 74 53 65 74 46  void lruListSetF
6f90: 69 72 73 74 53 79 6e 63 65 64 28 50 61 67 65 72  irstSynced(Pager
6fa0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70 50 61   *pPager){.  pPa
6fb0: 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53  ger->lru.pFirstS
6fc0: 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
6fd0: 6c 72 75 2e 70 46 69 72 73 74 3b 0a 23 69 66 64  lru.pFirst;.#ifd
6fe0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6ff0: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
7000: 4e 54 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  NT.  if( !pPager
7010: 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 50  ->memDb ){.    P
7020: 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 73 71 6c  gHdr *p;.    sql
7030: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
7040: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
7050: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
7060: 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
7070: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
7080: 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69  3LruPageList.pFi
7090: 72 73 74 3b 20 70 20 26 26 20 70 2d 3e 6e 65 65  rst; p && p->nee
70a0: 64 53 79 6e 63 3b 20 70 3d 70 2d 3e 67 66 72 65  dSync; p=p->gfre
70b0: 65 2e 70 4e 65 78 74 29 3b 0a 20 20 20 20 61 73  e.pNext);.    as
70c0: 73 65 72 74 28 70 3d 3d 70 50 61 67 65 72 2d 3e  sert(p==pPager->
70d0: 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64  lru.pFirstSynced
70e0: 20 7c 7c 20 70 3d 3d 73 71 6c 69 74 65 33 4c 72   || p==sqlite3Lr
70f0: 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74  uPageList.pFirst
7100: 53 79 6e 63 65 64 29 3b 0a 20 20 20 20 73 71 6c  Synced);.    sql
7110: 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e  ite3LruPageList.
7120: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
7130: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
7140: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
7150: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
7160: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
7170: 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23 65 6e  C_LRU));.  }.#en
7180: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
7190: 75 72 6e 20 74 72 75 65 20 69 66 20 70 61 67 65  urn true if page
71a0: 20 2a 70 50 67 20 68 61 73 20 61 6c 72 65 61 64   *pPg has alread
71b0: 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
71c0: 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  o the statement.
71d0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 6f 72 20 73  ** journal (or s
71e0: 74 61 74 65 6d 65 6e 74 20 73 6e 61 70 73 68 6f  tatement snapsho
71f0: 74 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  t has been creat
7200: 65 64 2c 20 69 66 20 2a 70 50 67 20 69 73 20 70  ed, if *pPg is p
7210: 61 72 74 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d  art.** of an in-
7220: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 29  memory database)
7230: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7240: 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28  pageInStatement(
7250: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
7260: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
7270: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
7280: 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72  ( MEMDB ){.    r
7290: 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 48  eturn PGHDR_TO_H
72a0: 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
72b0: 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20 7d 65 6c 73  ->inStmt;.  }els
72c0: 65 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  e{.    Pgno pgno
72d0: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
72e0: 20 20 75 38 20 2a 61 20 3d 20 70 50 61 67 65 72    u8 *a = pPager
72f0: 2d 3e 61 49 6e 53 74 6d 74 3b 0a 20 20 20 20 72  ->aInStmt;.    r
7300: 65 74 75 72 6e 20 28 61 20 26 26 20 28 69 6e 74  eturn (a && (int
7310: 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  )pgno<=pPager->s
7320: 74 6d 74 53 69 7a 65 20 26 26 20 28 61 5b 70 67  tmtSize && (a[pg
7330: 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e  no/8] & (1<<(pgn
7340: 6f 26 37 29 29 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  o&7))));.  }.}..
7350: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
7360: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   size of the pag
7370: 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  er hash table to
7380: 20 4e 2e 20 20 4e 20 6d 75 73 74 20 62 65 20 61   N.  N must be a
7390: 20 70 6f 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f   power.** of two
73a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
73b0: 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61   pager_resize_ha
73c0: 73 68 5f 74 61 62 6c 65 28 50 61 67 65 72 20 2a  sh_table(Pager *
73d0: 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a  pPager, int N){.
73e0: 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68 2c    PgHdr **aHash,
73f0: 20 2a 70 50 67 3b 0a 20 20 61 73 73 65 72 74 28   *pPg;.  assert(
7400: 20 4e 3e 30 20 26 26 20 28 4e 26 28 4e 2d 31 29   N>0 && (N&(N-1)
7410: 29 3d 3d 30 20 29 3b 0a 20 20 70 61 67 65 72 4c  )==0 );.  pagerL
7420: 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
7430: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 42 65 6e  sqlite3MallocBen
7440: 69 67 6e 46 61 69 6c 75 72 65 28 28 69 6e 74 29  ignFailure((int)
7450: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a  pPager->aHash);.
7460: 20 20 61 48 61 73 68 20 3d 20 73 71 6c 69 74 65    aHash = sqlite
7470: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
7480: 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e 20  eof(aHash[0])*N 
7490: 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  );.  pagerEnter(
74a0: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 61  pPager);.  if( a
74b0: 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Hash==0 ){.    /
74c0: 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65 68  * Failure to reh
74d0: 61 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65 72  ash is not an er
74e0: 72 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ror.  It is only
74f0: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68   a performance h
7500: 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  it. */.    retur
7510: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
7520: 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48  _free(pPager->aH
7530: 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ash);.  pPager->
7540: 6e 48 61 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61  nHash = N;.  pPa
7550: 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 61 48 61  ger->aHash = aHa
7560: 73 68 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  sh;.  for(pPg=pP
7570: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
7580: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
7590: 6c 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a  ll){.    int h;.
75a0: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
75b0: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  o==0 ){.      as
75c0: 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
75d0: 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e  Hash==0 && pPg->
75e0: 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
75f0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
7600: 20 20 20 20 7d 0a 20 20 20 20 68 20 3d 20 70 50      }.    h = pP
7610: 67 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b  g->pgno & (N-1);
7620: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
7630: 61 73 68 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a  ash = aHash[h];.
7640: 20 20 20 20 69 66 28 20 61 48 61 73 68 5b 68 5d      if( aHash[h]
7650: 20 29 7b 0a 20 20 20 20 20 20 61 48 61 73 68 5b   ){.      aHash[
7660: 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  h]->pPrevHash = 
7670: 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  pPg;.    }.    a
7680: 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
7690: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73     pPg->pPrevHas
76a0: 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  h = 0;.  }.}../*
76b0: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
76c0: 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  t integer from t
76d0: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
76e0: 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65  scriptor.  Store
76f0: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
7700: 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20  that is read in 
7710: 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53  *pRes.  Return S
7720: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
7730: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f  ything worked, o
7740: 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  r an.** error co
7750: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
7760: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
7770: 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65  * All values are
7780: 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20   stored on disk 
7790: 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a  as big-endian..*
77a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
77b0: 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  d32bits(sqlite3_
77c0: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
77d0: 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29  fset, u32 *pRes)
77e0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
77f0: 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72  r ac[4];.  int r
7800: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
7810: 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66  d(fd, ac, sizeof
7820: 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20  (ac), offset);. 
7830: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7840: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  OK ){.    *pRes 
7850: 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
7860: 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(ac);.  }.  ret
7870: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7880: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
7890: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
78a0: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
78b0: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
78c0: 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  order..*/.#defin
78d0: 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29  e put32bits(A,B)
78e0: 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74    sqlite3Put4byt
78f0: 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a  e((u8*)A,B)../*.
7900: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
7910: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74  t integer into t
7920: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
7930: 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72  scriptor.  Retur
7940: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
7950: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
7960: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
7970: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
7980: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
7990: 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71  t write32bits(sq
79a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
79b0: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
79c0: 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b  val){.  char ac[
79d0: 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  4];.  put32bits(
79e0: 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75  ac, val);.  retu
79f0: 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  rn sqlite3OsWrit
7a00: 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66  e(fd, ac, 4, off
7a10: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  set);.}../*.** I
7a20: 66 20 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70  f file pFd is op
7a30: 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  en, call sqlite3
7a40: 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74  OsUnlock() on it
7a50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7a60: 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  osUnlock(sqlite3
7a70: 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20  _file *pFd, int 
7a80: 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 70  eLock){.  if( !p
7a90: 46 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  Fd->pMethods ){.
7aa0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7ab0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
7ac0: 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  rn sqlite3OsUnlo
7ad0: 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a  ck(pFd, eLock);.
7ae0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
7af0: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
7b00: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
7b10: 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
7b20: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
7b30: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69  * can be used wi
7b40: 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54  th this pager. T
7b50: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
7b60: 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a  can be used if:.
7b70: 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76  **.**  (a) the v
7b80: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
7b90: 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74   OsDeviceCharact
7ba0: 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63  eristics() indic
7bb0: 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  ates that.**    
7bc0: 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67    a database pag
7bd0: 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  e may be written
7be0: 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64   atomically, and
7bf0: 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c  .**  (b) the val
7c00: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
7c10: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73  sSectorSize() is
7c20: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
7c30: 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ual.**      to t
7c40: 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
7c50: 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d  .** If the optim
7c60: 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ization cannot b
7c70: 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74  e used, 0 is ret
7c80: 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e  urned. If it can
7c90: 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65   be used,.** the
7ca0: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
7cb0: 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65  rned is the size
7cc0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
7cd0: 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20  file when it.** 
7ce0: 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63  contains rollbac
7cf0: 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74  k data for exact
7d00: 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a  ly one page..*/.
7d10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
7d20: 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
7d30: 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e  E.static int jrn
7d40: 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65  lBufferSize(Page
7d50: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
7d60: 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20  t dc;           
7d70: 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63  /* Device charac
7d80: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 69  teristics */.  i
7d90: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
7da0: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
7db0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
7dc0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73         /* Page s
7dd0: 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ize */.  sqlite3
7de0: 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67  _file *fd = pPag
7df0: 65 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66  er->fd;..  if( f
7e00: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
7e10: 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f     dc = sqlite3O
7e20: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
7e30: 69 73 74 69 63 73 28 66 64 29 3b 0a 20 20 20 20  istics(fd);.    
7e40: 6e 53 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nSector = sqlite
7e50: 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66 64  3OsSectorSize(fd
7e60: 29 3b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 70  );.    nPage = p
7e70: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
7e80: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 53  .  }..  assert(S
7e90: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
7ea0: 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
7eb0: 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49 54  ;.  assert(SQLIT
7ec0: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
7ed0: 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
7ee0: 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d 65 74  .  if( !fd->pMet
7ef0: 68 6f 64 73 20 7c 7c 20 28 64 63 26 28 53 51 4c  hods || (dc&(SQL
7f00: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
7f10: 7c 28 6e 50 61 67 65 3e 3e 38 29 29 26 26 6e 53  |(nPage>>8))&&nS
7f20: 65 63 74 6f 72 3c 3d 6e 50 61 67 65 29 20 29 7b  ector<=nPage) ){
7f30: 0a 20 20 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  .    return JOUR
7f40: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
7f50: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
7f60: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
7f70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
7f80: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
7f90: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
7fa0: 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
7fb0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
7fc0: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 72  within the pager
7fd0: 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69  .** code. The fi
7fe0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
7ff0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
8000: 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65   pager structure
8010: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
8020: 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
8030: 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
8040: 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41  ned by a pager A
8050: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  PI function. .**
8060: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
8070: 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
8080: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
8090: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
80a0: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
80b0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
80c0: 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49  ment is SQLITE_I
80d0: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
80e0: 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f  RUPT, or SQLITE_
80f0: 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  FULL.** the erro
8100: 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73  r becomes persis
8110: 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62 73 65 71  tent. All subseq
8120: 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f  uent API calls o
8130: 6e 20 74 68 69 73 20 50 61 67 65 72 0a 2a 2a 20  n this Pager.** 
8140: 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
8150: 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
8160: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
8170: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
8180: 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50  _error(Pager *pP
8190: 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20  ager, int rc){. 
81a0: 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20   int rc2 = rc & 
81b0: 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a  0xff;.  assert(.
81c0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
81d0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
81e0: 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
81f0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
8200: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
8210: 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
8220: 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
8230: 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
8240: 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51   if(.    rc2==SQ
8250: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
8260: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
8270: 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  RR ||.    rc2==S
8280: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20  QLITE_CORRUPT.  
8290: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
82a0: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d  rrCode = rc;.  }
82b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
82c0: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  ./*.** If SQLITE
82d0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20  _CHECK_PAGES is 
82e0: 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20  defined then we 
82f0: 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63  do some sanity c
8300: 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68  hecking.** on th
8310: 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20  e cache using a 
8320: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20  hash function.  
8330: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
8340: 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20   testing.** and 
8350: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
8360: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8370: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a  _CHECK_PAGES./*.
8380: 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62  ** Return a 32-b
8390: 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70  it hash of the p
83a0: 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61  age data for pPa
83b0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  ge..*/.static u3
83c0: 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  2 pager_datahash
83d0: 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69  (int nByte, unsi
83e0: 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61  gned char *pData
83f0: 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20  ){.  u32 hash = 
8400: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  0;.  int i;.  fo
8410: 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20  r(i=0; i<nByte; 
8420: 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d  i++){.    hash =
8430: 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70   (hash*1039) + p
8440: 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72  Data[i];.  }.  r
8450: 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74  eturn hash;.}.st
8460: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70  atic u32 pager_p
8470: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
8480: 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Page){.  return 
8490: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
84a0: 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61  Page->pPager->pa
84b0: 67 65 53 69 7a 65 2c 20 0a 20 20 20 20 20 20 20  geSize, .       
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84d0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
84e0: 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  *)PGHDR_TO_DATA(
84f0: 70 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPage));.}../*.*
8500: 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45  * The CHECK_PAGE
8510: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50   macro takes a P
8520: 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75  gHdr* as an argu
8530: 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f  ment. If SQLITE_
8540: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69  CHECK_PAGES.** i
8550: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e  s defined, and N
8560: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
8570: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
8580: 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63  ) statement chec
8590: 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  ks.** that the p
85a0: 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69  age is either di
85b0: 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74  rty or still mat
85c0: 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61  ches the calcula
85d0: 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a  ted page-hash..*
85e0: 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  /.#define CHECK_
85f0: 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67  PAGE(x) checkPag
8600: 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64  e(x).static void
8610: 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72   checkPage(PgHdr
8620: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
8630: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
8640: 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
8650: 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20   !pPg->pageHash 
8660: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
8670: 64 65 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70  de || MEMDB || p
8680: 50 67 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20  Pg->dirty || .  
8690: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
86a0: 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73  h==pager_pagehas
86b0: 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c  h(pPg) );.}..#el
86c0: 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72  se.#define pager
86d0: 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20  _datahash(X,Y)  
86e0: 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  0.#define pager_
86f0: 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23  pagehash(X)  0.#
8700: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
8710: 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E(x).#endif../*.
8720: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
8730: 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e  called the journ
8740: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
8750: 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65  r pPager must be
8760: 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61   open..** The ma
8770: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8780: 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66  e name is read f
8790: 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74  rom the end of t
87a0: 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20  he file and .** 
87b0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d  written into mem
87c0: 6f 72 79 20 73 75 70 70 6c 69 65 64 20 62 79 20  ory supplied by 
87d0: 74 68 65 20 63 61 6c 6c 65 72 2e 20 0a 2a 2a 0a  the caller. .**.
87e0: 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20  ** zMaster must 
87f0: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
8800: 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d  r of at least nM
8810: 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f  aster bytes allo
8820: 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
8830: 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f  caller. This sho
8840: 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76  uld be sqlite3_v
8850: 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  fs.mxPathname+1 
8860: 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65  (to ensure there
8870: 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70   is.** enough sp
8880: 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ace to write the
8890: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
88a0: 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61  name). If the ma
88b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
88c0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  name in the jour
88d0: 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68  nal is longer th
88e0: 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  an nMaster bytes
88f0: 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a   (including a.**
8900: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
8910: 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68  , then this is h
8920: 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20  andled as if no 
8930: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
8940: 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73  ame.** were pres
8950: 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ent in the journ
8960: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  al..**.** If no 
8970: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
8980: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
8990: 65 6e 74 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69  ent zMaster[0] i
89a0: 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a  s set to 0 and.*
89b0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
89c0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
89d0: 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  int readMasterJo
89e0: 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69  urnal(sqlite3_fi
89f0: 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20  le *pJrnl, char 
8a00: 2a 7a 4d 61 73 74 65 72 2c 20 69 6e 74 20 6e 4d  *zMaster, int nM
8a10: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
8a20: 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69  ;.  u32 len;.  i
8a30: 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b  64 szJ;.  u32 ck
8a40: 73 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  sum;.  int i;.  
8a50: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
8a60: 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75  agic[8]; /* A bu
8a70: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
8a80: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
8a90: 0a 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d  ..  zMaster[0] =
8aa0: 20 27 5c 30 27 3b 0a 0a 20 20 72 63 20 3d 20 73   '\0';..  rc = s
8ab0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
8ac0: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20  (pJrnl, &szJ);. 
8ad0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8ae0: 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72  OK || szJ<16 ) r
8af0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
8b00: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
8b10: 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e  nl, szJ-16, &len
8b20: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
8b30: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
8b40: 72 63 3b 0a 0a 20 20 69 66 28 20 6c 65 6e 3e 3d  rc;..  if( len>=
8b50: 6e 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  nMaster ){.    r
8b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8b70: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61  .  }..  rc = rea
8b80: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
8b90: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 3b 0a  zJ-12, &cksum);.
8ba0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8bb0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
8bc0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
8bd0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
8be0: 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 3b  agic, 8, szJ-8);
8bf0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8c00: 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61  E_OK || memcmp(a
8c10: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
8c20: 61 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72  agic, 8) ) retur
8c30: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
8c40: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
8c50: 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c  l, zMaster, len,
8c60: 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20   szJ-16-len);.  
8c70: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8c80: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
8c90: 72 63 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65  rc;.  }.  zMaste
8ca0: 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 0a  r[len] = '\0';..
8cb0: 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20    /* See if the 
8cc0: 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73  checksum matches
8cd0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8ce0: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f  nal name */.  fo
8cf0: 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b  r(i=0; i<len; i+
8d00: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d  +){.    cksum -=
8d10: 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 20   zMaster[i];.   
8d20: 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b  }.  if( cksum ){
8d30: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
8d40: 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20  hecksum doesn't 
8d50: 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65  add up, then one
8d60: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
8d70: 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20  disk sectors.   
8d80: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
8d90: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
8da0: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f  l filename is co
8db0: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65  rrupted. This me
8dc0: 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e  ans.    ** defin
8dd0: 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c  itely roll back,
8de0: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
8df0: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
8e00: 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20  port a (nul).   
8e10: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
8e20: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20  al filename..   
8e30: 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 5b   */.    zMaster[
8e40: 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20  0] = '\0';.  }. 
8e50: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
8e60: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
8e70: 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Seek the journal
8e80: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8e90: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
8ea0: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65  tor boundary whe
8eb0: 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  re a.** journal 
8ec0: 68 65 61 64 65 72 20 6d 61 79 20 62 65 20 72 65  header may be re
8ed0: 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50  ad or written. P
8ee0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
8ef0: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 0a  is updated with.
8f00: 2a 2a 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20  ** the new seek 
8f10: 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e  offset..**.** i.
8f20: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
8f30: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
8f40: 2a 20 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20  * Input Offset  
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 4f 75 74 70              Outp
8f60: 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d  ut Offset.** ---
8f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f90: 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20  ----.** 0       
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fb0: 20 20 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20    0.** 512      
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fd0: 20 35 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20   512.** 100     
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ff0: 20 20 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20    512.** 2000   
9000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9010: 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73     2048.** .*/.s
9020: 74 61 74 69 63 20 76 6f 69 64 20 73 65 65 6b 4a  tatic void seekJ
9030: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
9040: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
9050: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
9060: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
9070: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
9080: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
9090: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
90a0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
90b0: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
90c0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
90d0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
90e0: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
90f0: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
9100: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
9110: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
9120: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
9130: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
9140: 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  er) );.  pPager-
9150: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66  >journalOff = of
9160: 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  fset;.}../*.** T
9170: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9180: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
9190: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
91a0: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
91b0: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
91c0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
91d0: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
91e0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
91f0: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
9200: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
9210: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
9220: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
9230: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
9240: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
9250: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
9260: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
9270: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
9280: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
9290: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
92a0: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
92b0: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
92c0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
92d0: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
92e0: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
92f0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
9300: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
9310: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
9320: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
9330: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
9340: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
9350: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
9360: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
9370: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
9380: 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20  _SZ - 24) bytes 
9390: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
93a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
93b0: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
93c0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
93d0: 20 63 68 61 72 20 7a 48 65 61 64 65 72 5b 73 69   char zHeader[si
93e0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
93f0: 69 63 29 2b 31 36 5d 3b 0a 20 20 69 6e 74 20 72  ic)+16];.  int r
9400: 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  c;..  if( pPager
9410: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20  ->stmtHdrOff==0 
9420: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
9430: 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67  tmtHdrOff = pPag
9440: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
9450: 20 20 7d 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e    }..  seekJourn
9460: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
9470: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9480: 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
9490: 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 6d 65 6d  urnalOff;..  mem
94a0: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
94b0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
94c0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
94d0: 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  ));..  /* .  ** 
94e0: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
94f0: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
9500: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
9510: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
9520: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
9530: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
9540: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
9550: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
9560: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
9570: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
9580: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
9590: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
95a0: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
95b0: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
95c0: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
95d0: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
95e0: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
95f0: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
9600: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
9610: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
9620: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
9630: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
9640: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
9650: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
9660: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
9670: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
9680: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
9690: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
96a0: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
96b0: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
96c0: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
96d0: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
96e0: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
96f0: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
9700: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
9710: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
9720: 69 6c 75 72 65 20 6f 63 63 75 72 65 64 20 77 68  ilure occured wh
9730: 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20  ilst writing to 
9740: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
9750: 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e   file it may con
9760: 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67  tain some garbag
9770: 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72  e data. There ar
9780: 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a  e two scenarios.
9790: 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20    ** where this 
97a0: 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f  risk can be igno
97b0: 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  red:.  **.  **  
97c0: 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65   * When the page
97d0: 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  r is in no-sync 
97e0: 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e  mode. Corruption
97f0: 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20   can follow a.  
9800: 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69  **     power fai
9810: 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73  lure in this cas
9820: 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20  e anyway..  **. 
9830: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
9840: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
9850: 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69  FE_APPEND flag i
9860: 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72  s set. This guar
9870: 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20  antees.  **     
9880: 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74  that garbage dat
9890: 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e  a is never appen
98a0: 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ded to the journ
98b0: 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  al file..  */.  
98c0: 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66  assert(pPager->f
98d0: 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61  d->pMethods||pPa
98e0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 3b 0a 20 20  ger->noSync);.  
98f0: 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  if( (pPager->noS
9900: 79 6e 63 29 20 0a 20 20 20 7c 7c 20 28 73 71 6c  ync) .   || (sql
9910: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
9920: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
9930: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
9940: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
9950: 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 75 74 33  ) .  ){.    put3
9960: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
9970: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
9980: 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66  gic)], 0xfffffff
9990: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
99a0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
99b0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
99c0: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 29 3b 0a  nalMagic)], 0);.
99d0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
99e0: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
99f0: 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a  initialiser */ .
9a00: 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e    sqlite3Randomn
9a10: 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65  ess(sizeof(pPage
9a20: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26  r->cksumInit), &
9a30: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
9a40: 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  t);.  put32bits(
9a50: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
9a60: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
9a70: 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  ], pPager->cksum
9a80: 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Init);.  /* The 
9a90: 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  initial database
9aa0: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
9ab0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
9ac0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
9ad0: 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+8], pPager->
9ae0: 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68  dbSize);.  /* Th
9af0: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
9b00: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
9b10: 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33  rocess */.  put3
9b20: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
9b30: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
9b40: 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72  gic)+12], pPager
9b50: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20  ->sectorSize);. 
9b60: 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
9b70: 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
9b80: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
9b90: 6f 75 72 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f  ournalHdr, sizeo
9ba0: 66 28 7a 48 65 61 64 65 72 29 29 29 0a 20 20 72  f(zHeader))).  r
9bb0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
9bc0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
9bd0: 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  zHeader, sizeof(
9be0: 7a 48 65 61 64 65 72 29 2c 70 50 61 67 65 72 2d  zHeader),pPager-
9bf0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
9c00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9c10: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
9c20: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20  R_SZ(pPager);.. 
9c30: 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
9c40: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
9c50: 77 72 69 74 74 65 6e 20 73 75 63 63 65 73 73 66  written successf
9c60: 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a  ully. Seek the j
9c70: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
9c80: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
9c90: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
9ca0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
9cb0: 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tor..  */.  if( 
9cc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9cd0: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
9ce0: 54 41 49 4c 20 25 70 20 25 6c 6c 64 5c 6e 22 2c  TAIL %p %lld\n",
9cf0: 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
9d00: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 29 0a  >journalOff-1)).
9d10: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9d20: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
9d30: 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 2c 20  jfd, "\000", 1, 
9d40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9d50: 66 66 2d 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ff-1);.  }.  ret
9d60: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
9d70: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
9d80: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
9d90: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
9da0: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65  ed. A journal he
9db0: 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f  ader file.** (JO
9dc0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
9dd0: 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d  es) is read from
9de0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
9df0: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
9e00: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65  rnal.** file. Se
9e10: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
9e20: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
9e30: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20  ournalHdr() for 
9e40: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
9e50: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
9e60: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
9e70: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
9e80: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
9e90: 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69  ssfully, *nRec i
9ea0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
9eb0: 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72  ber of.** page r
9ec0: 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  ecords following
9ed0: 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64   this header and
9ee0: 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20   *dbSize is set 
9ef0: 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
9f00: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62  he.** database b
9f10: 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
9f20: 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20  ction began, in 
9f30: 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61  pages. Also, pPa
9f40: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a  ger->cksumInit.*
9f50: 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
9f60: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
9f70: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
9f80: 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  er. SQLITE_OK is
9f90: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20   returned.** in 
9fa0: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
9fb0: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
9fc0: 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65  header file appe
9fd0: 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70  ars to be corrup
9fe0: 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
9ff0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
a000: 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64  and *nRec and *d
a010: 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65  bSize are not se
a020: 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48  t.  If JOURNAL_H
a030: 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63  DR_SZ bytes.** c
a040: 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72  annot be read fr
a050: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
a060: 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ile an error cod
a070: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
a080: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
a090: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50  dJournalHdr(.  P
a0a0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20  ager *pPager, . 
a0b0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
a0c0: 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20  ,.  u32 *pNRec, 
a0d0: 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a  .  u32 *pDbSize.
a0e0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
a0f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
a100: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
a110: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
a120: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
a130: 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 0a    i64 jrnlOff;..
a140: 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72    seekJournalHdr
a150: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
a160: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
a170: 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ff+JOURNAL_HDR_S
a180: 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72  Z(pPager) > jour
a190: 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  nalSize ){.    r
a1a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
a1b0: 45 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66  E;.  }.  jrnlOff
a1c0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
a1d0: 61 6c 4f 66 66 3b 0a 0a 20 20 72 63 20 3d 20 73  alOff;..  rc = s
a1e0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
a1f0: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
a200: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
a210: 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66  , jrnlOff);.  if
a220: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a230: 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73  ;.  jrnlOff += s
a240: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 3b 0a 0a  izeof(aMagic);..
a250: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61    if( memcmp(aMa
a260: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
a270: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
a280: 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  c))!=0 ){.    re
a290: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
a2a0: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65  ;.  }..  rc = re
a2b0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
a2c0: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70  >jfd, jrnlOff, p
a2d0: 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20  NRec);.  if( rc 
a2e0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
a2f0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
a300: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
a310: 6c 4f 66 66 2b 34 2c 20 26 70 50 61 67 65 72 2d  lOff+4, &pPager-
a320: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69  >cksumInit);.  i
a330: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
a340: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
a350: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
a360: 64 2c 20 6a 72 6e 6c 4f 66 66 2b 38 2c 20 70 44  d, jrnlOff+8, pD
a370: 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  bSize);.  if( rc
a380: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
a390: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
a3a0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
a3b0: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
a3c0: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
a3d0: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
a3e0: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
a3f0: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
a400: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
a410: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
a420: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
a430: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
a440: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
a450: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
a460: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
a470: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
a480: 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
a490: 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  ue.  ** of Pager
a4a0: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
a4b0: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
a4c0: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
a4d0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ne..  */.  rc = 
a4e0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
a4f0: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b  r->jfd, jrnlOff+
a500: 31 32 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67  12, (u32 *)&pPag
a510: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
a520: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
a530: 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72  rn rc;..  pPager
a540: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
a550: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
a560: 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
a570: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
a580: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
a590: 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
a5a0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
a5b0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
a5c0: 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
a5d0: 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
a5e0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
a5f0: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
a600: 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
a610: 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
a620: 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
a630: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
a640: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
a650: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
a660: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
a670: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
a680: 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
a690: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
a6a0: 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
a6b0: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
a6c0: 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
a6d0: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62   is:.**.** + 4 b
a6e0: 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50  ytes: PAGER_MJ_P
a6f0: 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65  GNO..** + N byte
a700: 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  s: length of mas
a710: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
a720: 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  ..** + 4 bytes: 
a730: 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  N.** + 4 bytes: 
a740: 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
a750: 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
a760: 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
a770: 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
a780: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
a790: 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
a7a0: 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
a7b0: 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
a7c0: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
a7d0: 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  rnal name..**.**
a7e0: 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61   If zMaster is a
a7f0: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f   NULL pointer (o
a800: 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67  ccurs for a sing
a810: 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
a820: 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68  saction), .** th
a830: 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
a840: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
a850: 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
a860: 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
a870: 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
a880: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
a890: 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a  rc;.  int len; .
a8a0: 20 20 69 6e 74 20 69 3b 20 0a 20 20 69 36 34 20    int i; .  i64 
a8b0: 6a 72 6e 6c 4f 66 66 3b 0a 20 20 75 33 32 20 63  jrnlOff;.  u32 c
a8c0: 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72  ksum = 0;.  char
a8d0: 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f   zBuf[sizeof(aJo
a8e0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d  urnalMagic)+2*4]
a8f0: 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  ;..  if( !zMaste
a900: 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74  r || pPager->set
a910: 4d 61 73 74 65 72 29 20 72 65 74 75 72 6e 20 53  Master) return S
a920: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67  QLITE_OK;.  pPag
a930: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
a940: 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  1;..  len = strl
a950: 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66  en(zMaster);.  f
a960: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69  or(i=0; i<len; i
a970: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
a980: 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20  = zMaster[i];.  
a990: 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
a9a0: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
a9b0: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
a9c0: 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
a9d0: 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
a9e0: 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
a9f0: 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
aa00: 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
aa10: 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
aa20: 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
aa30: 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
aa40: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
aa50: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
aa60: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
aa70: 0a 20 20 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  .    seekJournal
aa80: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  Hdr(pPager);.  }
aa90: 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61  .  jrnlOff = pPa
aaa0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
aab0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
aac0: 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30  alOff += (len+20
aad0: 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  );..  rc = write
aae0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
aaf0: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 50 41 47  fd, jrnlOff, PAG
ab00: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
ab10: 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  r));.  if( rc!=S
ab20: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
ab30: 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20  n rc;.  jrnlOff 
ab40: 2b 3d 20 34 3b 0a 0a 20 20 72 63 20 3d 20 73 71  += 4;..  rc = sq
ab50: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
ab60: 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
ab70: 72 2c 20 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29  r, len, jrnlOff)
ab80: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
ab90: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
aba0: 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20  c;.  jrnlOff += 
abb0: 6c 65 6e 3b 0a 0a 20 20 70 75 74 33 32 62 69 74  len;..  put32bit
abc0: 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20  s(zBuf, len);.  
abd0: 70 75 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b  put32bits(&zBuf[
abe0: 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65  4], cksum);.  me
abf0: 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61  mcpy(&zBuf[8], a
ac00: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
ac10: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ac20: 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ic));.  rc = sql
ac30: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
ac40: 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38  er->jfd, zBuf, 8
ac50: 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  +sizeof(aJournal
ac60: 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29  Magic), jrnlOff)
ac70: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
ac80: 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
ac90: 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74 75 72 6e  noSync;.  return
aca0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
acb0: 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61  d or remove a pa
acc0: 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  ge from the list
acd0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68   of all pages th
ace0: 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a  at are in the.**
acf0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
ad00: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61  al..**.** The Pa
ad10: 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70 61  ger keeps a sepa
ad20: 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67  rate list of pag
ad30: 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72  es that are curr
ad40: 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20  ently in.** the 
ad50: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
ad60: 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74  l.  This helps t
ad70: 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  he sqlite3PagerS
ad80: 74 6d 74 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72  tmtCommit().** r
ad90: 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20  outine run MUCH 
ada0: 66 61 73 74 65 72 20 66 6f 72 20 74 68 65 20 63  faster for the c
adb0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
adc0: 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a   there are many.
add0: 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f  ** pages in memo
ade0: 72 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65  ry but only a fe
adf0: 77 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61  w are in the sta
ae00: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
ae10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
ae20: 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
ae30: 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29  list(PgHdr *pPg)
ae40: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
ae50: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
ae60: 0a 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48  .  PgHistory *pH
ae70: 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
ae80: 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
ae90: 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44  ;.  assert( MEMD
aea0: 42 20 29 3b 0a 20 20 69 66 28 20 21 70 48 69 73  B );.  if( !pHis
aeb0: 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20  t->inStmt ){.   
aec0: 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
aed0: 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20  pPrevStmt==0 && 
aee0: 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74  pHist->pNextStmt
aef0: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
af00: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a  Pager->pStmt ){.
af10: 20 20 20 20 20 20 50 47 48 44 52 5f 54 4f 5f 48        PGHDR_TO_H
af20: 49 53 54 28 70 50 61 67 65 72 2d 3e 70 53 74 6d  IST(pPager->pStm
af30: 74 2c 20 70 50 61 67 65 72 29 2d 3e 70 50 72 65  t, pPager)->pPre
af40: 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20  vStmt = pPg;.   
af50: 20 7d 0a 20 20 20 20 70 48 69 73 74 2d 3e 70 4e   }.    pHist->pN
af60: 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67 65 72  extStmt = pPager
af70: 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 70 50 61  ->pStmt;.    pPa
af80: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
af90: 3b 0a 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53  ;.    pHist->inS
afa0: 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  tmt = 1;.  }.}..
afb0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67  /*.** Find a pag
afc0: 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  e in the hash ta
afd0: 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61  ble given its pa
afe0: 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  ge number.  Retu
aff0: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
b000: 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e  to the page or N
b010: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
b020: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
b030: 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  r *pager_lookup(
b040: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
b050: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
b060: 64 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61  dr *p;.  if( pPa
b070: 67 65 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20  ger->aHash==0 ) 
b080: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20  return 0;.  p = 
b090: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 67  pPager->aHash[pg
b0a0: 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
b0b0: 61 73 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65  ash-1)];.  while
b0c0: 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d  ( p && p->pgno!=
b0d0: 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20  pgno ){.    p = 
b0e0: 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  p->pNextHash;.  
b0f0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
b100: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
b110: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
b120: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b130: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
b140: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
b150: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
b160: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
b170: 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
b180: 20 20 20 20 20 6f 73 55 6e 6c 6f 63 6b 28 70 50       osUnlock(pP
b190: 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
b1a0: 4b 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  K);.      pPager
b1b0: 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
b1c0: 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55       IOTRACE(("U
b1d0: 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  NLOCK %p\n", pPa
b1e0: 67 65 72 29 29 0a 20 20 20 20 7d 0a 20 20 20 20  ger)).    }.    
b1f0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
b200: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
b210: 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
b220: 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
b230: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63   }.}../*.** Exec
b240: 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
b250: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
b260: 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
b270: 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
b280: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
b290: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
b2a0: 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
b2b0: 65 61 64 79 20 65 6e 74 65 72 65 64 0a 2a 2a 20  eady entered.** 
b2c0: 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 2e  the error-state.
b2d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b2e0: 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
b2f0: 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 29  llback(Pager *p)
b300: 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72 43 6f  {.  if( p->errCo
b310: 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  de ) return;.  a
b320: 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65 3e  ssert( p->state>
b330: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
b340: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  || p->journalOpe
b350: 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  n==0 );.  if( p-
b360: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
b370: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71  SERVED ){.    sq
b380: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
b390: 63 6b 28 70 29 3b 0a 20 20 7d 0a 20 20 70 61 67  ck(p);.  }.  pag
b3a0: 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 20 20  er_unlock(p);.  
b3b0: 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f  assert( p->errCo
b3c0: 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e 61  de || !p->journa
b3d0: 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65 78 63  lOpen || (p->exc
b3e0: 6c 75 73 69 76 65 4d 6f 64 65 26 26 21 70 2d 3e  lusiveMode&&!p->
b3f0: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b 0a 20  journalOff) );. 
b400: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43   assert( p->errC
b410: 6f 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d 74 4f  ode || !p->stmtO
b420: 70 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c 75 73  pen || p->exclus
b430: 69 76 65 4d 6f 64 65 20 29 3b 0a 7d 0a 0a 0a 2f  iveMode );.}.../
b440: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 69  *.** Clear the i
b450: 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
b460: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
b470: 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
b480: 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63  of the pager bac
b490: 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73  k to what it was
b4a0: 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72   when it was fir
b4b0: 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41  st.** opened.  A
b4c0: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ny outstanding p
b4d0: 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
b4e0: 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75  ated and subsequ
b4f0: 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20  ent attempts.** 
b500: 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20  to access those 
b510: 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  pages will likel
b520: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  y result in a co
b530: 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69  redump..*/.stati
b540: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
b550: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
b560: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c  ){.  PgHdr *pPg,
b570: 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70   *pNext;.  if( p
b580: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
b590: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70   return;.  for(p
b5a0: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
b5b0: 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
b5c0: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
b5d0: 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c  PGFREE %p %d\n",
b5e0: 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
b5f0: 6e 6f 29 29 3b 0a 20 20 20 20 50 41 47 45 52 5f  no));.    PAGER_
b600: 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
b610: 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29  er_pgfree_count)
b620: 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50  ;.    pNext = pP
b630: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
b640: 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70   lruListRemove(p
b650: 50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Pg);.    sqlite3
b660: 5f 66 72 65 65 28 70 50 67 2d 3e 70 44 61 74 61  _free(pPg->pData
b670: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
b680: 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ree(pPg);.  }.  
b690: 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c  assert(pPager->l
b6a0: 72 75 2e 70 46 69 72 73 74 3d 3d 30 29 3b 0a 20  ru.pFirst==0);. 
b6b0: 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
b6c0: 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64  lru.pFirstSynced
b6d0: 3d 3d 30 29 3b 0a 20 20 61 73 73 65 72 74 28 70  ==0);.  assert(p
b6e0: 50 61 67 65 72 2d 3e 6c 72 75 2e 70 4c 61 73 74  Pager->lru.pLast
b6f0: 3d 3d 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ==0);.  pPager->
b700: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 61  pStmt = 0;.  pPa
b710: 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20  ger->pAll = 0;. 
b720: 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d   pPager->nHash =
b730: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   0;.  sqlite3_fr
b740: 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
b750: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61  );.  pPager->nPa
b760: 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ge = 0;.  pPager
b770: 2d 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20 20 70  ->aHash = 0;.  p
b780: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
b790: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
b7a0: 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
b7b0: 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20 74 72  ansaction.  A tr
b7c0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
b7d0: 65 64 20 62 79 20 65 69 74 68 65 72 0a 2a 2a 20  ed by either.** 
b7e0: 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f  a COMMIT or a RO
b7f0: 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68  LLBACK..**.** Wh
b800: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
b810: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
b820: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
b830: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
b840: 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44  nd.** a RESERVED
b850: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
b860: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
b870: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
b880: 65 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a  e will release.*
b890: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  * the database l
b8a0: 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73  ock and acquires
b8b0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
b8c0: 6e 20 69 74 73 20 70 6c 61 63 65 20 69 66 20 74  n its place if t
b8d0: 68 61 74 20 69 73 0a 2a 2a 20 74 68 65 20 61 70  hat is.** the ap
b8e0: 70 72 6f 70 72 69 61 74 65 20 74 68 69 6e 67 20  propriate thing 
b8f0: 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73 65 20  to do.  Release 
b900: 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20 69 73  locks usually is
b910: 20 61 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a   appropriate,.**
b920: 20 75 6e 6c 65 73 73 20 77 65 20 61 72 65 20 69   unless we are i
b930: 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  n exclusive acce
b940: 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73  ss mode or unles
b950: 73 20 74 68 69 73 20 69 73 20 61 20 0a 2a 2a 20  s this is a .** 
b960: 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47 49 4e  COMMIT AND BEGIN
b970: 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44   or ROLLBACK AND
b980: 20 42 45 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e   BEGIN operation
b990: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ..**.** The jour
b9a0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 65 69 74 68  nal file is eith
b9b0: 65 72 20 64 65 6c 65 74 65 64 20 6f 72 20 74 72  er deleted or tr
b9c0: 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  uncated..**.** T
b9d0: 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65  ODO: Consider ke
b9e0: 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eping the journa
b9f0: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20  l file open for 
ba00: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
ba10: 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67  ses..** This mig
ba20: 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72  ht give a perfor
ba30: 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e  mance improvemen
ba40: 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65  t on windows whe
ba50: 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20  re opening.** a 
ba60: 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e  file is an expen
ba70: 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  sive operation..
ba80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
ba90: 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
baa0: 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
bab0: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
bac0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
bad0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63  ITE_OK;.  int rc
bae0: 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  2 = SQLITE_OK;. 
baf0: 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
bb00: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
bb10: 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53  >state<PAGER_RES
bb20: 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74  ERVED ){.    ret
bb30: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
bb40: 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65   }.  sqlite3Page
bb50: 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67  rStmtCommit(pPag
bb60: 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
bb70: 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20 21  r->stmtOpen && !
bb80: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
bb90: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c  eMode ){.    sql
bba0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
bbb0: 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70  er->stfd);.    p
bbc0: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
bbd0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
bbe0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
bbf0: 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  en ){.    if( pP
bc00: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
bc10: 6f 64 65 20 0a 20 20 20 20 20 20 20 20 20 20 26  ode .          &
bc20: 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  & (rc = sqlite3O
bc30: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
bc40: 2d 3e 6a 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49  ->jfd, 0))==SQLI
bc50: 54 45 5f 4f 4b 20 29 7b 3b 0a 20 20 20 20 20 20  TE_OK ){;.      
bc60: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
bc70: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
bc80: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
bc90: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rted = 0;.    }e
bca0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
bcb0: 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
bcc0: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50  ->jfd);.      pP
bcd0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
bce0: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  n = 0;.      if(
bcf0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
bd00: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
bd10: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
bd20: 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
bd30: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
bd40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
bd50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
bd60: 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  e( pPager->aInJo
bd70: 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61  urnal );.    pPa
bd80: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
bd90: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67  = 0;.    for(pPg
bda0: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
bdb0: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
bdc0: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50  xtAll){.      pP
bdd0: 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
bde0: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72  ;.      pPg->dir
bdf0: 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ty = 0;.      pP
be00: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
be10: 0a 20 20 20 20 20 20 70 50 67 2d 3e 61 6c 77 61  .      pPg->alwa
be20: 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ysRollback = 0;.
be30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
be40: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20  ECK_PAGES.      
be50: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
be60: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
be70: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
be80: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  }.    pPager->pD
be90: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  irty = 0;.    pP
bea0: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
beb0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
bec0: 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65  ->nRec = 0;.  }e
bed0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
bee0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
bef0: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  nal==0 );.    as
bf00: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69  sert( pPager->di
bf10: 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70  rtyCache==0 || p
bf20: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
bf30: 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  l==0 );.  }..  i
bf40: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
bf50: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
bf60: 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28   rc2 = osUnlock(
bf70: 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
bf80: 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50  ED_LOCK);.    pP
bf90: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
bfa0: 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65  GER_SHARED;.  }e
bfb0: 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
bfc0: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e  state==PAGER_SYN
bfd0: 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65  CED ){.    pPage
bfe0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
bff0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a  _EXCLUSIVE;.  }.
c000: 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
c010: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Size = 0;.  pPag
c020: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
c030: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  0;.  pPager->nee
c040: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 6c 72 75  dSync = 0;.  lru
c050: 4c 69 73 74 53 65 74 46 69 72 73 74 53 79 6e 63  ListSetFirstSync
c060: 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  ed(pPager);.  pP
c070: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
c080: 31 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63  1;..  return (rc
c090: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a  ==SQLITE_OK?rc2:
c0a0: 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc);.}../*.** Co
c0b0: 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e  mpute and return
c0c0: 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20   a checksum for 
c0d0: 74 68 65 20 70 61 67 65 20 6f 66 20 64 61 74 61  the page of data
c0e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
c0f0: 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b  not a real check
c100: 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c  sum.  It is real
c110: 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20  ly just the sum 
c120: 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f  of the .** rando
c130: 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  m initial value 
c140: 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d  and the page num
c150: 62 65 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d  ber.  We experim
c160: 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20  ented with.** a 
c170: 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20  checksum of the 
c180: 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75 74  entire data, but
c190: 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20   that was found 
c1a0: 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a  to be too slow..
c1b0: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
c1c0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
c1d0: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
c1e0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61   beginning of da
c1f0: 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68  ta and.** the ch
c200: 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64  ecksum is stored
c210: 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68   at the end.  Th
c220: 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e  is is important.
c230: 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20    If journal.** 
c240: 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72  corruption occur
c250: 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72  s due to a power
c260: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f   failure, the mo
c270: 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72  st likely scenar
c280: 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e  io.** is that on
c290: 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
c2a0: 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
c2b0: 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
c2c0: 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68  .  It is.** much
c2d0: 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
c2e0: 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
c2f0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
c300: 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
c310: 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
c320: 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
c330: 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
c340: 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
c350: 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
c360: 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
c370: 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
c380: 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
c390: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  orruption..**.**
c3a0: 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64   FIX ME:  Consid
c3b0: 65 72 20 61 64 64 69 6e 67 20 65 76 65 72 79 20  er adding every 
c3c0: 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79  200th (or so) by
c3d0: 74 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 74  te of the data t
c3e0: 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75  o the.** checksu
c3f0: 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69 66 20  m.  That way if 
c400: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70  a single page sp
c410: 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69  ans 3 or more di
c420: 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a  sk sectors and.*
c430: 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c  * only the middl
c440: 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72  e sector is corr
c450: 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69  upt, we will sti
c460: 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e  ll have a reason
c470: 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f  able.** chance o
c480: 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68  f failing the ch
c490: 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20  ecksum and thus 
c4a0: 64 65 74 65 63 74 69 6e 67 20 74 68 65 20 70 72  detecting the pr
c4b0: 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  oblem..*/.static
c4c0: 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d   u32 pager_cksum
c4d0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
c4e0: 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29  const u8 *aData)
c4f0: 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  {.  u32 cksum = 
c500: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
c510: 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61  t;.  int i = pPa
c520: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30  ger->pageSize-20
c530: 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20  0;.  while( i>0 
c540: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
c550: 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20  aData[i];.    i 
c560: 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65  -= 200;.  }.  re
c570: 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f  turn cksum;.}../
c580: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
c590: 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
c5a0: 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50  void makeClean(P
c5b0: 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52  gHdr*);../*.** R
c5c0: 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67  ead a single pag
c5d0: 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  e from the journ
c5e0: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f  al file opened o
c5f0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
c600: 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62  r.** jfd.  Playb
c610: 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67  ack this one pag
c620: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43  e..**.** If useC
c630: 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73  ksum==0 it means
c640: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f   this journal do
c650: 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b  es not use check
c660: 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73  sums.  Checksums
c670: 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64  .** are not used
c680: 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f   in statement jo
c690: 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73  urnals because s
c6a0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
c6b0: 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64  s do not.** need
c6c0: 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65   to survive powe
c6d0: 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73  r failures..*/.s
c6e0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
c6f0: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
c700: 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
c710: 65 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 66  er, .  sqlite3_f
c720: 69 6c 65 20 2a 6a 66 64 2c 0a 20 20 69 36 34 20  ile *jfd,.  i64 
c730: 6f 66 66 73 65 74 2c 0a 20 20 69 6e 74 20 75 73  offset,.  int us
c740: 65 43 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20  eCksum.){.  int 
c750: 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
c760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c770: 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
c780: 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ng page in the c
c790: 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ache */.  Pgno p
c7a0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
c7b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
c7c0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
c7d0: 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  page in journal 
c7e0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c800: 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75     /* Checksum u
c810: 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63  sed for sanity c
c820: 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20  hecking */.  u8 
c830: 2a 61 44 61 74 61 20 3d 20 28 75 38 20 2a 29 70  *aData = (u8 *)p
c840: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
c850: 3b 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72  ;   /* Temp stor
c860: 61 67 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a  age for a page *
c870: 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d  /..  /* useCksum
c880: 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20   should be true 
c890: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  for the main jou
c8a0: 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66  rnal and false f
c8b0: 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  or.  ** statemen
c8c0: 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72  t journals.  Ver
c8d0: 69 66 79 20 74 68 61 74 20 74 68 69 73 20 69 73  ify that this is
c8e0: 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65   always the case
c8f0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
c900: 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d  jfd == (useCksum
c910: 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a   ? pPager->jfd :
c920: 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29   pPager->stfd) )
c930: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74  ;.  assert( aDat
c940: 61 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61  a );..  rc = rea
c950: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66  d32bits(jfd, off
c960: 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  set, &pgno);.  i
c970: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c980: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
c990: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
c9a0: 61 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70  ad(jfd, aData, p
c9b0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
c9c0: 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 69 66   offset+4);.  if
c9d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c9e0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
c9f0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ca00: 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  f += pPager->pag
ca10: 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a  eSize + 4;..  /*
ca20: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
ca30: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
ca40: 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
ca50: 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
ca60: 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
ca70: 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
ca80: 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
ca90: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
caa0: 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
cab0: 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
cac0: 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
cad0: 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
cae0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
caf0: 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
cb00: 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
cb10: 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
cb20: 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
cb30: 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
cb40: 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
cb50: 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
cb60: 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
cb70: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
cb80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
cb90: 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  NE;.  }.  if( pg
cba0: 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61  no>(unsigned)pPa
cbb0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
cbc0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
cbd0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75  _OK;.  }.  if( u
cbe0: 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72  seCksum ){.    r
cbf0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
cc00: 66 64 2c 20 6f 66 66 73 65 74 2b 70 50 61 67 65  fd, offset+pPage
cc10: 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 26  r->pageSize+4, &
cc20: 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
cc30: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
cc40: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
cc50: 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20  nalOff += 4;.   
cc60: 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d   if( pager_cksum
cc70: 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21  (pPager, aData)!
cc80: 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20  =cksum ){.      
cc90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
cca0: 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
ccb0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
ccc0: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
ccd0: 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72  SERVED || pPager
cce0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
ccf0: 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f  XCLUSIVE );..  /
cd00: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
cd10: 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74  s in RESERVED st
cd20: 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ate, then there 
cd30: 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f  must be a copy o
cd40: 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65  f this.  ** page
cd50: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
cd60: 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  che. In this cas
cd70: 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68  e just update th
cd80: 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20  e pager cache,. 
cd90: 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61   ** not the data
cda0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70  base file. The p
cdb0: 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b  age is left mark
cdc0: 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73  ed dirty in this
cdd0: 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
cde0: 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f   An exception to
cdf0: 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a   the above rule:
ce00: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
ce10: 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
ce20: 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70  ode.  ** and a p
ce30: 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72  age is moved dur
ce40: 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  ing an increment
ce50: 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74  al vacuum then t
ce60: 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a  he page may.  **
ce70: 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70   not be in the p
ce80: 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65  ager cache. Late
ce90: 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  r: if a malloc()
cea0: 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   or IO error occ
ceb0: 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
cec0: 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c  a Movepage() cal
ced0: 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  l, then the page
cee0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74   may not be in t
cef0: 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69  he cache.  ** ei
cf00: 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e  ther. So the con
cf10: 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
cf20: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61   in the above pa
cf30: 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20  ragraph is not. 
cf40: 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65   ** assert()able
cf50: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
cf60: 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74  n EXCLUSIVE stat
cf70: 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
cf80: 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
cf90: 65 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20  e if it exists. 
cfa0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e   ** and the main
cfb0: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
cfc0: 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e  is then marked n
cfd0: 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20  ot dirty..  **. 
cfe0: 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31   ** Ticket #1171
cff0: 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  :  The statement
d000: 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
d010: 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74  ontain page cont
d020: 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ent that is.  **
d030: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
d040: 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
d050: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
d060: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
d070: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75  ..  ** This occu
d080: 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  rs when a page i
d090: 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  s changed prior 
d0a0: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
d0b0: 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  a statement.  **
d0c0: 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67   then changed ag
d0d0: 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73  ain within the s
d0e0: 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20  tatement.  When 
d0f0: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63  rolling back suc
d100: 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  h a.  ** stateme
d110: 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77  nt we must not w
d120: 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67  rite to the orig
d130: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e  inal database un
d140: 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a  less we know.  *
d150: 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68  * for certain th
d160: 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  at original page
d170: 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79   contents are sy
d180: 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61  nced into the ma
d190: 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
d1a0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72   journal.  Other
d1b0: 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f  wise, a power lo
d1c0: 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d  ss might leave m
d1d0: 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20  odified data in 
d1e0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
d1f0: 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61  e file without a
d200: 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72  n entry in the r
d210: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
d220: 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65  that can.  ** re
d230: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
d240: 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
d250: 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f  al form.  Two co
d260: 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65  nditions must be
d270: 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65  .  ** met before
d280: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
d290: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20  database files. 
d2a0: 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65  (1) the database
d2b0: 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f   must be.  ** lo
d2c0: 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e  cked.  (2) we kn
d2d0: 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ow that the orig
d2e0: 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
d2f0: 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65  t is fully synce
d300: 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61  d.  ** in the ma
d310: 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65  in journal eithe
d320: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  r because the pa
d330: 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
d340: 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20  he or else.  ** 
d350: 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b  the page is mark
d360: 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d  ed as needSync==
d370: 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20  0..  */.  pPg = 
d380: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
d390: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 50 41  ger, pgno);.  PA
d3a0: 47 45 52 54 52 41 43 45 34 28 22 50 4c 41 59 42  GERTRACE4("PLAYB
d3b0: 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68  ACK %d page %d h
d3c0: 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
d3e0: 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
d3f0: 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61  no, pager_dataha
d400: 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  sh(pPager->pageS
d410: 69 7a 65 2c 20 61 44 61 74 61 29 29 3b 0a 20 20  ize, aData));.  
d420: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
d430: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
d440: 56 45 20 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c  VE && (pPg==0 ||
d450: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
d460: 30 29 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66  0) ){.    i64 of
d470: 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
d480: 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
d490: 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
d4a0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
d4b0: 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61  Pager->fd, aData
d4c0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
d4d0: 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  ze, offset);.   
d4e0: 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
d4f0: 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29    makeClean(pPg)
d500: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
d510: 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20  ( pPg ){.    /* 
d520: 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65  No page should e
d530: 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c  ver be explicitl
d540: 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  y rolled back th
d550: 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
d560: 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20  cept.    ** for 
d570: 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20  page 1 which is 
d580: 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
d590: 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
d5a0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
d5b0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74   ** database act
d5c0: 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63  ive. However suc
d5d0: 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20  h a page may be 
d5e0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
d5f0: 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f   result.    ** o
d600: 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72  f an internal er
d610: 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ror resulting in
d620: 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61   an automatic ca
d630: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
d640: 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
d650: 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
d660: 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
d670: 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d   /* assert( pPg-
d680: 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d  >nRef==0 || pPg-
d690: 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20  >pgno==1 ); */. 
d6a0: 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44 52     pData = PGHDR
d6b0: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
d6c0: 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
d6d0: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
d6e0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
d6f0: 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  f( pPager->xRein
d700: 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 70 50  iter ){.      pP
d710: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
d720: 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  pPg, pPager->pag
d730: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69  eSize);.    }.#i
d740: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
d750: 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
d760: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
d770: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
d780: 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49  .#endif.    /* I
d790: 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20  f this was page 
d7a0: 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20  1, then restore 
d7b0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
d7c0: 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20  er.dbFileVers.. 
d7d0: 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65     ** Do this be
d7e0: 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e  fore any decodin
d7f0: 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  g. */.    if( pg
d800: 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d  no==1 ){.      m
d810: 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
d820: 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38  bFileVers, &((u8
d830: 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a  *)pData)[24],siz
d840: 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
d850: 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a  leVers));.    }.
d860: 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74  .    /* Decode t
d870: 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61  he page just rea
d880: 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20  d from disk */. 
d890: 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
d8a0: 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
d8b0: 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65  no, 3);.  }.  re
d8c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d8d0: 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73  * Parameter zMas
d8e0: 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ter is the name 
d8f0: 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
d900: 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67  nal file. A sing
d910: 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  le journal.** fi
d920: 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64  le that referred
d930: 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a   to the master j
d940: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
d950: 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64  just been rolled
d960: 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72   back..** This r
d970: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
d980: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
d990: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
d9a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d9b0: 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73  e,.** and does s
d9c0: 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  o if it is..**.*
d9d0: 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74  * Argument zMast
d9e0: 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  er may point to 
d9f0: 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e  Pager.pTmpSpace.
da00: 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20   So that buffer 
da10: 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c  is not .** avail
da20: 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74  able for use wit
da30: 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
da40: 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  n..**.**.** The 
da50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
da60: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ile contains the
da70: 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68   names of all ch
da80: 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a  ild journals..**
da90: 20 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61   To tell if a ma
daa0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  ster journal can
dab0: 20 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65   be deleted, che
dac0: 63 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68  ck to each of th
dad0: 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20  e.** children.  
dae0: 49 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  If all children 
daf0: 61 72 65 20 65 69 74 68 65 72 20 6d 69 73 73 69  are either missi
db00: 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66  ng or do not ref
db10: 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65  er to.** a diffe
db20: 72 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72  rent master jour
db30: 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  nal, then this m
db40: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61  aster journal ca
db50: 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f  n be deleted..*/
db60: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
db70: 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
db80: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
db90: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
dba0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
dbb0: 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
dbc0: 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Vfs;.  int rc;. 
dbd0: 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e   int master_open
dbe0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
dbf0: 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 0a 20  file *pMaster;. 
dc00: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
dc10: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 63 68 61 72 20  Journal;.  char 
dc20: 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  *zMasterJournal 
dc30: 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73  = 0; /* Contents
dc40: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
dc50: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
dc60: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   nMasterJournal;
dc70: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
dc80: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
dc90: 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   file */..  /* O
dca0: 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
dcb0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c  ournal file excl
dcc0: 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20  usively in case 
dcd0: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
dce0: 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69  ss.  ** is runni
dcf0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
dd00: 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69  also. Not that i
dd10: 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68  t makes too much
dd20: 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a   difference..  *
dd30: 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73  /.  pMaster = (s
dd40: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71  qlite3_file *)sq
dd50: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 56 66  lite3_malloc(pVf
dd60: 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29  s->szOsFile * 2)
dd70: 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28  ;.  pJournal = (
dd80: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28  sqlite3_file *)(
dd90: 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20  ((u8 *)pMaster) 
dda0: 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  + pVfs->szOsFile
ddb0: 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65  );.  if( !pMaste
ddc0: 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  r ){.    rc = SQ
ddd0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
dde0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61  lse{.    int fla
ddf0: 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
de00: 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
de10: 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
de20: 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d  URNAL);.    rc =
de30: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
de40: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d  Vfs, zMaster, pM
de50: 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29  aster, flags, 0)
de60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
de70: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
de80: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
de90: 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20    master_open = 
dea0: 31 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  1;..  rc = sqlit
deb0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61  e3OsFileSize(pMa
dec0: 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f  ster, &nMasterJo
ded0: 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63  urnal);.  if( rc
dee0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
def0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
df00: 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72  ;..  if( nMaster
df10: 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20  Journal>0 ){.   
df20: 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
df30: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
df40: 65 72 50 74 72 20 3d 20 30 3b 0a 20 20 20 20 69  erPtr = 0;.    i
df50: 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20  nt nMasterPtr = 
df60: 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
df70: 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20  Pathname+1;..   
df80: 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74   /* Load the ent
df90: 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
dfa0: 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61  al file into spa
dfb0: 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
dfc0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
dfd0: 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69  malloc() and poi
dfe0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74  nted to by zMast
dff0: 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20  erJournal. .    
e000: 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f  */.    zMasterJo
e010: 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29  urnal = (char *)
e020: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
e030: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20  MasterJournal + 
e040: 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  nMasterPtr);.   
e050: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
e060: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
e070: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
e080: 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
e090: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
e0a0: 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74 72 20  .    zMasterPtr 
e0b0: 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  = &zMasterJourna
e0c0: 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l[nMasterJournal
e0d0: 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ];.    rc = sqli
e0e0: 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65  te3OsRead(pMaste
e0f0: 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
e100: 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l, nMasterJourna
e110: 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  l, 0);.    if( r
e120: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
e130: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
e140: 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  t;..    zJournal
e150: 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
e160: 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a  l;.    while( (z
e170: 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a  Journal-zMasterJ
e180: 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a  ournal)<nMasterJ
e190: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
e1a0: 69 66 28 20 73 71 6c 69 74 65 33 4f 73 41 63 63  if( sqlite3OsAcc
e1b0: 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  ess(pVfs, zJourn
e1c0: 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
e1d0: 53 5f 45 58 49 53 54 53 29 20 29 7b 0a 20 20 20  S_EXISTS) ){.   
e1e0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
e1f0: 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e  he journals poin
e200: 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61  ted to by the ma
e210: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69  ster journal exi
e220: 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  sts..        ** 
e230: 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
e240: 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
e250: 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
e260: 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20  rnal. If.       
e270: 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77   ** so, return w
e280: 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20  ithout deleting 
e290: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
e2a0: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
e2b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
e2c0: 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  c;.        int f
e2d0: 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
e2e0: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
e2f0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
e300: 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20  URNAL);.        
e310: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
e320: 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  en(pVfs, zJourna
e330: 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61  l, pJournal, fla
e340: 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  gs, 0);.        
e350: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e360: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
e370: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
e380: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
e390: 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d        rc = readM
e3a0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f  asterJournal(pJo
e3b0: 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74  urnal, zMasterPt
e3c0: 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a  r, nMasterPtr);.
e3d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
e3e0: 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
e3f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
e400: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
e410: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
e420: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
e430: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
e440: 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30  c = zMasterPtr[0
e450: 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  ]!=0 && strcmp(z
e460: 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
e470: 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  er)==0;.        
e480: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20  if( c ){.       
e490: 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
e4a0: 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
e4b0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
e4c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
e4d0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
e4e0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
e4f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e500: 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  .      zJournal 
e510: 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72  += (strlen(zJour
e520: 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
e530: 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c   }.  .  rc = sql
e540: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
e550: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
e560: 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
e570: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75    if( zMasterJou
e580: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  rnal ){.    sqli
e590: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
e5a0: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a  Journal);.  }  .
e5b0: 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65    if( master_ope
e5c0: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
e5d0: 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29  OsClose(pMaster)
e5e0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
e5f0: 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
e600: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
e610: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
e620: 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
e630: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b  (Pager *pPager);
e640: 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
e650: 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f   the main file o
e660: 66 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  f the given page
e670: 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  r to the number 
e680: 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69  of pages.** indi
e690: 63 61 74 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e  cated. Also trun
e6a0: 63 61 74 65 20 74 68 65 20 63 61 63 68 65 64 20  cate the cached 
e6b0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
e6c0: 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  f the file..*/.s
e6d0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
e6e0: 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
e6f0: 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67  pPager, int nPag
e700: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
e710: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
e720: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
e730: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26  AGER_EXCLUSIVE &
e740: 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  & pPager->fd->pM
e750: 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72 63  ethods ){.    rc
e760: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
e770: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  cate(pPager->fd,
e780: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
e790: 65 2a 28 69 36 34 29 6e 50 61 67 65 29 3b 0a 20  e*(i64)nPage);. 
e7a0: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
e7b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
e7c0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
e7d0: 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f  Page;.    pager_
e7e0: 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70  truncate_cache(p
e7f0: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  Pager);.  }.  re
e800: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
e810: 2a 20 53 65 74 20 74 68 65 20 73 65 63 74 6f 72  * Set the sector
e820: 53 69 7a 65 20 66 6f 72 20 74 68 65 20 67 69 76  Size for the giv
e830: 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  en pager..**.** 
e840: 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  The sector size 
e850: 69 73 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  is the larger of
e860: 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
e870: 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20 62 79 20   reported.** by 
e880: 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
e890: 69 7a 65 28 29 20 61 6e 64 20 74 68 65 20 70 61  ize() and the pa
e8a0: 67 65 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  geSize..*/.stati
e8b0: 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72  c void setSector
e8c0: 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
e8d0: 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 70 50  er){.  assert(pP
e8e0: 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
e8f0: 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70  ds||pPager->temp
e900: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 50  File);.  if( !pP
e910: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
e920: 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20  {.    /* Sector 
e930: 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74  size doesn't mat
e940: 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  ter for temporar
e950: 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74  y files. Also, t
e960: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d  he file.    ** m
e970: 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ay not have been
e980: 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20   opened yet, in 
e990: 77 68 63 69 68 20 63 61 73 65 20 74 68 65 20 4f  whcih case the O
e9a0: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
e9b0: 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73    ** call will s
e9c0: 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a  egfault..    */.
e9d0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
e9e0: 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
e9f0: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  OsSectorSize(pPa
ea00: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20  ger->fd);.  }.  
ea10: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
ea20: 6f 72 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 70  orSize<pPager->p
ea30: 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 70  ageSize ){.    p
ea40: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
ea50: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
ea60: 53 69 7a 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Size;.  }.}../*.
ea70: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
ea80: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
ea90: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
eaa0: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
eab0: 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
eac0: 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
ead0: 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
eae0: 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
eaf0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
eb00: 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
eb10: 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31  lows: .**.**  (1
eb20: 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  )  8 byte prefix
eb30: 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f  .  A copy of aJo
eb40: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
eb50: 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69    (2)  4 byte bi
eb60: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
eb70: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
eb80: 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
eb90: 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20  ge records.**   
eba0: 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e      in the journ
ebb0: 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  al.  If this val
ebc0: 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
ebd0: 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74  , then compute t
ebe0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62  he.**       numb
ebf0: 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
ec00: 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ds from the jour
ec10: 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33  nal size..**  (3
ec20: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
ec30: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
ec40: 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
ec50: 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
ec60: 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
ec70: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28   checksum..**  (
ec80: 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  4)  4 byte integ
ec90: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
eca0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
ecb0: 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  to truncate the.
ecc0: 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  **       databas
ecd0: 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f  e to during a ro
ece0: 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20  llback..**  (5) 
ecf0: 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
ed00: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
ed10: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
ed20: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
ed30: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  al.**       name
ed40: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79  .  The value may
ed50: 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61   be zero (indica
ed60: 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73  te that there is
ed70: 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20   no master.**   
ed80: 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a      journal.).**
ed90: 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f    (6)  N bytes o
eda0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
edb0: 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20  rnal name.  The 
edc0: 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c  name will be nul
edd0: 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20  -terminated.**  
ede0: 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62       and might b
edf0: 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74  e shorter than t
ee00: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
ee10: 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20  om (5).  If the 
ee20: 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20  first byte.**   
ee30: 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20      of the name 
ee40: 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65  is \000 then the
ee50: 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20  re is no master 
ee60: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
ee70: 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
ee80: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74  urnal name is st
ee90: 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a  ored in UTF-8..*
eea0: 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20  *  (7)  Zero or 
eeb0: 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
eec0: 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
eed0: 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
eee0: 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
eef0: 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
ef00: 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
ef10: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
ef20: 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
ef30: 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
ef40: 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
ef50: 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
ef60: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
ef70: 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 36  mean the first 6
ef80: 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
ef90: 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
efa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
efb0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
efc0: 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   7th item..**.**
efd0: 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
efe0: 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
eff0: 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
f000: 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
f010: 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
f020: 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
f030: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
f040: 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
f050: 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
f060: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
f070: 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
f080: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
f090: 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
f0a0: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
f0b0: 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
f0c0: 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
f0d0: 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
f0e0: 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
f0f0: 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
f100: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
f110: 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
f120: 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
f130: 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
f140: 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
f150: 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
f160: 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
f170: 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
f180: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
f190: 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
f1a0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
f1b0: 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
f1c0: 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
f1d0: 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
f1e0: 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
f1f0: 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
f200: 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
f210: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
f220: 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
f230: 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
f240: 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
f250: 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
f260: 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
f270: 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
f280: 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
f290: 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
f2a0: 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
f2b0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
f2c0: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
f2d0: 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
f2e0: 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
f2f0: 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
f300: 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
f310: 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
f320: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
f330: 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
f340: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
f350: 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
f360: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
f370: 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
f380: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
f390: 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
f3a0: 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
f3b0: 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
f3c0: 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
f3d0: 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
f3e0: 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
f3f0: 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
f400: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
f410: 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
f420: 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
f430: 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
f440: 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
f450: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
f460: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
f470: 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
f480: 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
f490: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
f4a0: 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
f4b0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
f4c0: 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
f4d0: 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
f4e0: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
f4f0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
f500: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
f510: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
f520: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
f530: 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65  isHot){.  sqlite
f540: 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
f550: 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36  ager->pVfs;.  i6
f560: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
f570: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
f580: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
f590: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
f5a0: 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
f5b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
f5c0: 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
f5d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
f5e0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
f600: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
f610: 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
f620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
f630: 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
f640: 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
f650: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
f660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f670: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20   Result code of 
f680: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
f690: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
f6a0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
f6b0: 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
f6c0: 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
f6d0: 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
f6e0: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
f6f0: 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
f700: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
f710: 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
f720: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
f730: 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
f740: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
f750: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20  nalOpen );.  rc 
f760: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
f770: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
f780: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
f790: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
f7a0: 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  zJ==0 ){.    got
f7b0: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
f7c0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
f7d0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
f7e0: 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
f7f0: 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
f800: 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
f810: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
f820: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
f830: 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
f840: 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
f850: 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
f860: 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
f870: 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
f880: 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
f890: 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
f8a0: 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
f8b0: 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61  .  zMaster = pPa
f8c0: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
f8d0: 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
f8e0: 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
f8f0: 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
f900: 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
f910: 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 61 73  athname+1);.  as
f920: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
f930: 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
f940: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c!=SQLITE_OK .  
f950: 20 7c 7c 20 28 7a 4d 61 73 74 65 72 5b 30 5d 20   || (zMaster[0] 
f960: 26 26 20 21 73 71 6c 69 74 65 33 4f 73 41 63 63  && !sqlite3OsAcc
f970: 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
f980: 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
f990: 5f 45 58 49 53 54 53 29 29 20 0a 20 20 29 7b 0a  _EXISTS)) .  ){.
f9a0: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
f9b0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
f9c0: 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20  ITE_DONE ) rc = 
f9d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67  SQLITE_OK;.    g
f9e0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
f9f0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
fa00: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
fa10: 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a    zMaster = 0;..
fa20: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
fa30: 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
fa40: 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f   when the readJo
fa50: 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20  urnalHdr() call 
fa60: 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c  returns.  ** SQL
fa70: 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
fa80: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  O error occurs. 
fa90: 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
faa0: 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
fab0: 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
fac0: 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
fad0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
fae0: 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
faf0: 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
fb00: 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
fb10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
fb20: 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
fb30: 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
fb40: 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
fb50: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
fb60: 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c  t of failed whil
fb70: 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
fb80: 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
fb90: 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
fba0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
fbb0: 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
fbc0: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
fbd0: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
fbe0: 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
fbf0: 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
fc00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
fc10: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
fc20: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
fc30: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
fc40: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
fc50: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
fc60: 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
fc70: 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
fc80: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
fc90: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
fca0: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
fcb0: 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
fcc0: 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
fcd0: 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
fce0: 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
fcf0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
fd00: 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
fd10: 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
fd20: 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
fd30: 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
fd40: 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
fd50: 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
fd60: 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
fd70: 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
fd80: 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
fd90: 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
fda0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
fdb0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
fdc0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
fdd0: 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
fde0: 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55  Rec = (szJ - JOU
fdf0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
fe00: 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
fe10: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
fe20: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
fe30: 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20  c is 0 and this 
fe40: 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61  rollback is of a
fe50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65   transaction cre
fe60: 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20  ated by this.   
fe70: 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20   ** process and 
fe80: 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
fe90: 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  inal header in t
fea0: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  he journal, then
feb0: 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a   it means.    **
fec0: 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20   that this part 
fed0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
fee0: 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20  as being filled 
fef0: 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  but has not yet 
ff00: 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63  been.    ** sync
ff10: 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d  ed to disk.  Com
ff20: 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  pute the number 
ff30: 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f  of pages based o
ff40: 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a  n the remaining.
ff50: 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74      ** size of t
ff60: 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
ff70: 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64      ** The third
ff80: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73   term of the tes
ff90: 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66  t was added to f
ffa0: 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  ix ticket #2565.
ffb0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
ffc0: 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f  nRec==0 && !isHo
ffd0: 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61  t &&.        pPa
ffe0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
fff0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
10000 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
10010 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20  journalOff ){.  
10020 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20      nRec = (szJ 
10030 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
10040 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
10050 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
10060 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
10070 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
10080 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
10090 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
100a0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
100b0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
100c0 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20 6f  e back to it's o
100d0 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
100e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
100f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
10100 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
10110 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
10120 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
10130 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
10140 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
10150 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10160 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
10170 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
10180 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
10190 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
101a0 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a  ges out of the j
101b0 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
101c0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
101d0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
101e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
101f0 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ec; i++){.      
10200 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
10210 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
10220 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  ger, pPager->jfd
10230 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
10240 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20  lOff, 1);.      
10250 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10260 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
10270 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
10280 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
10290 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
102a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
102b0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
102c0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
102d0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
102e0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
102f0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
10300 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10310 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e  .    }.  }.  /*N
10320 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73  OTREACHED*/.  as
10330 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f  sert( 0 );..end_
10340 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
10350 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10360 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  .    zMaster = p
10370 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
10380 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d  ;.    rc = readM
10390 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
103a0 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
103b0 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
103c0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
103d0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
103e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
103f0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
10400 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
10410 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
10420 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
10430 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  aster[0] ){.    
10440 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
10450 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
10460 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
10470 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75  e will return su
10480 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65  ccess,.    ** se
10490 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
104a0 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
104b0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
104c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
104d0 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  = pager_delmaste
104e0 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  r(pPager, zMaste
104f0 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  r);.  }..  /* Th
10500 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
10510 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
10520 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
10530 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
10540 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
10550 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
10560 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
10570 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
10580 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65   size.  ** value
10590 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
105a0 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
105b0 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
105c0 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74  ..  */.  setSect
105d0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
105e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
105f0 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
10600 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
10610 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rnal..**.** This
10620 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70   is similar to p
10630 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
10640 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
10650 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20  nal but with.** 
10660 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73  a few extra twis
10670 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ts..**.**    (1)
10680 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
10690 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
106a0 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
106b0 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20  e start of.**   
106c0 20 20 20 20 20 20 74 68 65 20 73 74 61 74 65 6d        the statem
106d0 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ent is stored in
106e0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
106f0 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a  e, not in the.**
10700 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
10710 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a   file itself..**
10720 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61  .**    (2)  In a
10730 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69  ddition to playi
10740 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74 61 74  ng back the stat
10750 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61  ement journal, a
10760 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70  lso.**         p
10770 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65  layback all page
10780 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  s of the transac
10790 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67  tion journal beg
107a0 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  inning.**       
107b0 20 20 61 74 20 6f 66 66 73 65 74 20 70 50 61 67    at offset pPag
107c0 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a  er->stmtJSize..*
107d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
107e0 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  er_stmt_playback
107f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
10800 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
10810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10820 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20  ize of the full 
10830 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
10840 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e   hdrOff;.  int n
10850 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
10860 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10870 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e   Records */.  in
10880 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
10890 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
108a0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
108b0 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61  rc;..  szJ = pPa
108c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
108d0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
108e0 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f  .  {.    i64 os_
108f0 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  szJ;.    rc = sq
10900 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
10910 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73  pPager->jfd, &os
10920 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20 72  _szJ);.    if( r
10930 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
10940 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73  eturn rc;.    as
10950 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a  sert( szJ==os_sz
10960 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  J );.  }.#endif.
10970 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66  .  /* Set hdrOff
10980 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65   to be the offse
10990 74 20 6a 75 73 74 20 61 66 74 65 72 20 74 68 65  t just after the
109a0 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 61 73 74   end of the last
109b0 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61   journal.  ** pa
109c0 67 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72  ge written befor
109d0 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
109e0 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f 72 20 74  nal-header for t
109f0 68 69 73 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  his statement.  
10a00 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
10a10 61 73 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 74  as written, or t
10a20 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
10a30 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c  le if no journal
10a40 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73  .  ** header was
10a50 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20   written..  */. 
10a60 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72   hdrOff = pPager
10a70 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20  ->stmtHdrOff;.  
10a80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
10a90 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72  fullSync || !hdr
10aa0 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64  Off );.  if( !hd
10ab0 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f  rOff ){.    hdrO
10ac0 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20  ff = szJ;.  }.  
10ad0 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74  .  /* Truncate t
10ae0 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b  he database back
10af0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
10b00 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   size..  */.  rc
10b10 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
10b20 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
10b30 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 61  ->stmtSize);.  a
10b40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
10b50 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
10b60 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  ED );..  /* Figu
10b70 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
10b80 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
10b90 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
10ba0 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
10bb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d  ert( pPager->stm
10bc0 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72  tInUse && pPager
10bd0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
10be0 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72  .  nRec = pPager
10bf0 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20  ->stmtNRec;.  . 
10c00 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
10c10 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
10c20 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
10c30 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
10c40 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
10c50 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65  base file.  Note
10c60 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d   that the statem
10c70 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74  ent journal omit
10c80 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d  s checksums from
10c90 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72  .  ** each recor
10ca0 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61  d since power-fa
10cb0 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20 69  ilure recovery i
10cc0 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20  s not important 
10cd0 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  to statement.  *
10ce0 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f  * journals..  */
10cf0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52  .  for(i=0; i<nR
10d00 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36  ec; i++){.    i6
10d10 34 20 6f 66 66 73 65 74 20 3d 20 69 2a 28 34 2b  4 offset = i*(4+
10d20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10d30 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
10d40 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
10d50 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
10d60 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65 74  er->stfd, offset
10d70 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
10d80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
10d90 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
10da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
10db0 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
10dc0 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ack;.  }..  /* N
10dd0 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67  ow roll some pag
10de0 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  es back from the
10df0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
10e00 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74  rnal. Pager.stmt
10e10 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74  JSize.  ** was t
10e20 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
10e30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
10e40 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
10e50 77 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a  was started, so.
10e60 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20    ** everything 
10e70 61 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73  after that needs
10e80 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
10e90 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20  ck, either into 
10ea0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
10eb0 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61  e, the memory ca
10ec0 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20  che, or both..  
10ed0 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73  **.  ** If it is
10ee0 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
10ef0 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66  Pager.stmtHdrOff
10f00 20 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74   is the offset t
10f10 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  o the start.  **
10f20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f   of the first jo
10f30 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
10f40 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73  tten during this
10f50 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
10f60 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70  action..  */.  p
10f70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10f80 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f = pPager->stmt
10f90 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  JSize;.  pPager-
10fa0 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50 61  >cksumInit = pPa
10fb0 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a  ger->stmtCksum;.
10fc0 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
10fd0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 68 64  >journalOff < hd
10fe0 72 4f 66 66 20 29 7b 0a 20 20 20 20 72 63 20 3d  rOff ){.    rc =
10ff0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
11000 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
11010 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50   pPager->jfd, pP
11020 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11030 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
11040 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
11050 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
11060 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
11070 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
11080 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  ack;.  }..  whil
11090 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
110a0 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20  alOff < szJ ){. 
110b0 20 20 20 75 33 32 20 6e 4a 52 65 63 3b 20 20 20     u32 nJRec;   
110c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
110d0 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
110e0 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
110f0 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
11100 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
11110 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  ger, szJ, &nJRec
11120 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69  , &dummy);.    i
11130 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11140 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
11150 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
11160 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  E );.      goto 
11170 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
11180 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
11190 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20   nJRec==0 ){.   
111a0 20 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20     nJRec = (szJ 
111b0 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
111c0 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d  lOff) / (pPager-
111d0 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20  >pageSize+8);.  
111e0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a    }.    for(i=nJ
111f0 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70  Rec-1; i>=0 && p
11200 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11210 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20  f < szJ; i--){. 
11220 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
11230 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
11240 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
11250 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
11260 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20  ournalOff, 1);. 
11270 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
11280 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
11290 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
112a0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
112b0 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
112c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
112d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
112e0 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f  f = szJ;.  .end_
112f0 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  stmt_playback:. 
11300 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11310 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65 72  OK) {.    pPager
11320 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
11330 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72  zJ;.    /* pager
11340 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50  _reload_cache(pP
11350 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20  ager); */.  }.  
11360 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11370 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
11380 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
11390 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
113a0 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
113b0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
113c0 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
113d0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
113e0 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
113f0 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20    if( mxPage>10 
11400 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
11410 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a  xPage = mxPage;.
11420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
11430 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
11440 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
11450 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74  djust the robust
11460 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61  ness of the data
11470 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64  base to damage d
11480 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
11490 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
114a0 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e  lures by changin
114b0 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
114c0 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72  syncs()s when wr
114d0 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c  iting.** the rol
114e0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20  lback journal.  
114f0 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
11500 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  levels:.**.**   
11510 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74   OFF       sqlit
11520 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  e3OsSync() is ne
11530 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
11540 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
11550 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11560 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
11570 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
11580 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
11590 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
115a0 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
115b0 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
115c0 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
115d0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
115e0 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
115f0 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
11600 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
11610 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
11620 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
11630 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
11640 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
11650 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
11660 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
11670 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
11680 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
11690 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
116a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
116b0 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
116c0 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
116d0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
116e0 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
116f0 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
11700 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
11710 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
11720 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
11730 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
11740 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
11750 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
11760 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
11770 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
11780 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
11790 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  - the nRec field
117a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
117b0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
117c0 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77  header - being w
117d0 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65  ritten in betwee
117e0 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20  n the two.**    
117f0 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29            syncs)
11800 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
11810 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
11820 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
11830 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
11840 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
11850 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
11860 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
11870 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
11880 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
11890 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
118a0 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
118c0 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
118d0 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
118e0 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
118f0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  back..**.** Nume
11900 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
11910 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
11920 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
11930 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
11940 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
11950 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11960 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
11970 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  S.void sqlite3Pa
11980 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
11990 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
119a0 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20   int level, int 
119b0 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70  full_fsync){.  p
119c0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
119d0 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61   level==1 || pPa
119e0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
119f0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
11a00 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20  c = level==3 && 
11a10 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
11a20 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  e;.  pPager->syn
11a30 63 5f 66 6c 61 67 73 20 3d 20 28 66 75 6c 6c 5f  c_flags = (full_
11a40 66 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e  fsync?SQLITE_SYN
11a50 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59  C_FULL:SQLITE_SY
11a60 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66  NC_NORMAL);.  if
11a70 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
11a80 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53   ) pPager->needS
11a90 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  ync = 0;.}.#endi
11aa0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
11ab0 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
11ac0 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
11ad0 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
11ae0 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
11af0 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
11b00 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
11b10 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
11b20 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
11b30 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
11b40 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
11b50 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
11b60 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
11b70 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
11b80 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
11b90 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
11ba0 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  ary file. .**.**
11bb0 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
11bc0 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
11bd0 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  *fd.  Return SQL
11be0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
11bf0 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  s or some.** oth
11c00 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
11c10 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53   we fail. The OS
11c20 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
11c30 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74  lly delete the t
11c40 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65  emporary.** file
11c50 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
11c60 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
11c70 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
11c80 65 6e 74 65 6d 70 28 0a 20 20 73 71 6c 69 74 65  entemp(.  sqlite
11c90 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
11ca0 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
11cb0 69 6c 65 20 73 79 73 74 65 6d 20 6c 61 79 65 72  ile system layer
11cc0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
11cd0 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57  le *pFile,  /* W
11ce0 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
11cf0 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f  scriptor here */
11d00 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
11d10 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  me,      /* Name
11d20 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 20 4d   of the file.  M
11d30 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
11d40 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
11d50 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
11d60 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
11d70 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b  to the VFS */.){
11d80 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
11d90 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d  ert( zFilename!=
11da0 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  0 );..#ifdef SQL
11db0 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
11dc0 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
11dd0 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
11de0 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
11df0 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
11e00 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67  endif..  vfsFlag
11e10 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45  s |=  SQLITE_OPE
11e20 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
11e30 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
11e40 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53   |.            S
11e50 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
11e60 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  SIVE | SQLITE_OP
11e70 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
11e80 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
11e90 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 46 69  OsOpen(pVfs, zFi
11ea0 6c 65 6e 61 6d 65 2c 20 70 46 69 6c 65 2c 20 76  lename, pFile, v
11eb0 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61  fsFlags, 0);.  a
11ec0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
11ed0 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 70  E_OK || pFile->p
11ee0 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 72 65 74  Methods );.  ret
11ef0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11f00 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   Create a new pa
11f10 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74  ge cache and put
11f20 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
11f30 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20  e page cache in 
11f40 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65  *ppPager..** The
11f50 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
11f60 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73  ed need not exis
11f70 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20  t.  The file is 
11f80 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c  not locked until
11f90 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61  .** the first ca
11fa0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
11fb0 65 72 47 65 74 28 29 20 61 6e 64 20 69 73 20 6f  erGet() and is o
11fc0 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e  nly held open un
11fd0 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20  til the.** last 
11fe0 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
11ff0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61   using sqlite3Pa
12000 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a  gerUnref()..**.*
12010 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
12020 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
12030 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
12040 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
12050 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
12060 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
12070 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68  o be cached.  Th
12080 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64  e file will be d
12090 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
120a0 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20  tically when it 
120b0 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
120c0 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
120d0 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
120e0 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
120f0 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68   is held in cach
12100 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65  e..** It is neve
12110 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
12120 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  k.  This can be 
12130 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
12140 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  t an.** in-memor
12150 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  y database..*/.i
12160 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
12170 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
12180 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
12190 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
121a0 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73  ile system to us
121b0 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70  e */.  Pager **p
121c0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
121d0 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61  /* Return the Pa
121e0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65  ger structure he
121f0 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
12200 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
12210 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
12220 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
12230 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
12240 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20  Extra,          
12250 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74      /* Extra byt
12260 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63  es append to eac
12270 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
12280 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
122a0 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c  * flags controll
122b0 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f  ing this file */
122c0 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
122d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
122e0 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
122f0 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
12300 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b  fs.xOpen() */.){
12310 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50  .  u8 *pPtr;.  P
12320 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30  ager *pPager = 0
12330 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
12340 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
12350 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
12360 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62  = 0;.  int memDb
12370 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64   = 0;.  int read
12380 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Only = 0;.  int 
12390 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
123a0 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
123b0 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20  _JOURNAL)==0;.  
123c0 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  int noReadlock =
123d0 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
123e0 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b  NO_READLOCK)!=0;
123f0 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69  .  int journalFi
12400 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  leSize = sqlite3
12410 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
12420 29 3b 0a 20 20 69 6e 74 20 6e 44 65 66 61 75 6c  );.  int nDefaul
12430 74 50 61 67 65 20 3d 20 53 51 4c 49 54 45 5f 44  tPage = SQLITE_D
12440 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
12450 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  ;.  char *zPathn
12460 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 50 61 74 68  ame;.  int nPath
12470 6e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  name;..  /* The 
12480 64 65 66 61 75 6c 74 20 72 65 74 75 72 6e 20 69  default return i
12490 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
124a0 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
124b0 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74   0;..  /* Comput
124c0 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  e the full pathn
124d0 61 6d 65 20 2a 2f 0a 20 20 7a 50 61 74 68 6e 61  ame */.  zPathna
124e0 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  me = sqlite3_mal
124f0 6c 6f 63 28 70 56 66 73 2d 3e 6d 78 50 61 74 68  loc(pVfs->mxPath
12500 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 7a  name+1);.  if( z
12510 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Pathname==0 ){. 
12520 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12530 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
12540 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
12550 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23  Filename[0] ){.#
12560 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12570 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
12580 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
12590 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
125a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
125b0 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50  Db = 1;.      zP
125c0 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a  athname[0] = 0;.
125d0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
125e0 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20  .    {.      rc 
125f0 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
12600 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
12610 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  ilename, zPathna
12620 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  me);.    }.  }el
12630 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
12640 69 74 65 33 4f 73 47 65 74 54 65 6d 70 4e 61 6d  ite3OsGetTempNam
12650 65 28 70 56 66 73 2c 20 7a 50 61 74 68 6e 61 6d  e(pVfs, zPathnam
12660 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
12670 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12680 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12690 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
126a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
126b0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 74 72   nPathname = str
126c0 6c 65 6e 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  len(zPathname);.
126d0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
126e0 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 70 61  emory for the pa
126f0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
12700 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69  .  pPager = sqli
12710 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20  te3MallocZero(. 
12720 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65     sizeof(*pPage
12730 72 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  r) +           /
12740 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
12750 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  e */.    journal
12760 46 69 6c 65 53 69 7a 65 20 2b 20 20 20 20 20 20  FileSize +      
12770 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72       /* The jour
12780 6e 61 6c 20 66 69 6c 65 20 73 74 72 75 63 74 75  nal file structu
12790 72 65 20 2a 2f 20 0a 20 20 20 20 70 56 66 73 2d  re */ .    pVfs-
127a0 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 20 2b 20  >szOsFile * 2 + 
127b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 62         /* The db
127c0 20 61 6e 64 20 73 74 6d 74 20 6a 6f 75 72 6e 61   and stmt journa
127d0 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
127e0 34 2a 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 30  4*nPathname + 40
127f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
12800 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69 72 65 63  Filename, zDirec
12810 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  tory, zJournal, 
12820 7a 53 74 6d 74 4a 72 6e 6c 20 2a 2f 0a 20 20 29  zStmtJrnl */.  )
12830 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 20  ;.  if( !pPager 
12840 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
12850 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
12860 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12870 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
12880 50 74 72 20 3d 20 28 75 38 20 2a 29 26 70 50 61  Ptr = (u8 *)&pPa
12890 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72  ger[1];.  pPager
128a0 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73  ->vfsFlags = vfs
128b0 46 6c 61 67 73 3b 0a 20 20 70 50 61 67 65 72 2d  Flags;.  pPager-
128c0 3e 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  >fd = (sqlite3_f
128d0 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d  ile*)&pPtr[pVfs-
128e0 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20 20  >szOsFile*0];.  
128f0 70 50 61 67 65 72 2d 3e 73 74 66 64 20 3d 20 28  pPager->stfd = (
12900 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70  sqlite3_file*)&p
12910 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69  Ptr[pVfs->szOsFi
12920 6c 65 2a 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  le*1];.  pPager-
12930 3e 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  >jfd = (sqlite3_
12940 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73  file*)&pPtr[pVfs
12950 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 5d 3b 0a 20  ->szOsFile*2];. 
12960 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
12970 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 74  me = (char*)&pPt
12980 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  r[pVfs->szOsFile
12990 2a 32 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  *2+journalFileSi
129a0 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  ze];.  pPager->z
129b0 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61  Directory = &pPa
129c0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e  ger->zFilename[n
129d0 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70  Pathname+1];.  p
129e0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
129f0 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  = &pPager->zDire
12a00 63 74 6f 72 79 5b 6e 50 61 74 68 6e 61 6d 65 2b  ctory[nPathname+
12a10 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 53  1];.  pPager->zS
12a20 74 6d 74 4a 72 6e 6c 20 3d 20 26 70 50 61 67 65  tmtJrnl = &pPage
12a30 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
12a40 68 6e 61 6d 65 2b 31 30 5d 3b 0a 20 20 70 50 61  hname+10];.  pPa
12a50 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  ger->pVfs = pVfs
12a60 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65  ;.  memcpy(pPage
12a70 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  r->zFilename, zP
12a80 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
12a90 6d 65 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  me+1);.  sqlite3
12aa0 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
12ab0 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
12ac0 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a   pager file..  *
12ad0 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
12ae0 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
12af0 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20  ] && !memDb ){. 
12b00 20 20 20 69 66 28 20 6e 50 61 74 68 6e 61 6d 65     if( nPathname
12b10 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  >(pVfs->mxPathna
12b20 6d 65 20 2d 20 73 69 7a 65 6f 66 28 22 2d 6a 6f  me - sizeof("-jo
12b30 75 72 6e 61 6c 22 29 29 20 29 7b 0a 20 20 20 20  urnal")) ){.    
12b40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
12b50 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c 73  NTOPEN;.    }els
12b60 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 6f 75  e{.      int fou
12b70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  t = 0;.      rc 
12b80 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
12b90 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46  pVfs, pPager->zF
12ba0 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
12bb0 3e 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >fd,.           
12bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
12bd0 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 2c 20  ager->vfsFlags, 
12be0 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 72 65  &fout);.      re
12bf0 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53  adOnly = (fout&S
12c00 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
12c10 4e 4c 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  NLY);..      /* 
12c20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  If the file was 
12c30 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65  successfully ope
12c40 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69  ned for read/wri
12c50 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 20  te access,.     
12c60 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66   ** choose a def
12c70 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
12c80 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74  n case we have t
12c90 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20  o create the.   
12ca0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
12cb0 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74  ile. The default
12cc0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68   page size is th
12cd0 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20  e maximum of:.  
12ce0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
12cf0 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41     + SQLITE_DEFA
12d00 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20  ULT_PAGE_SIZE,. 
12d10 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65       **    + The
12d20 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
12d30 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
12d40 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 20 20 2a  orSize().      *
12d50 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65  *    + The large
12d60 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61  st page size tha
12d70 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  t can be written
12d80 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20   atomically..   
12d90 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
12da0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
12db0 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20   !readOnly ){.  
12dc0 20 20 20 20 20 20 69 6e 74 20 69 53 65 63 74 6f        int iSecto
12dd0 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f  rSize = sqlite3O
12de0 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  sSectorSize(pPag
12df0 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20  er->fd);.       
12e00 20 69 66 28 20 6e 44 65 66 61 75 6c 74 50 61 67   if( nDefaultPag
12e10 65 3c 69 53 65 63 74 6f 72 53 69 7a 65 20 29 7b  e<iSectorSize ){
12e20 0a 20 20 20 20 20 20 20 20 20 20 6e 44 65 66 61  .          nDefa
12e30 75 6c 74 50 61 67 65 20 3d 20 69 53 65 63 74 6f  ultPage = iSecto
12e40 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d  rSize;.        }
12e50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
12e60 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
12e70 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  TE.        {.   
12e80 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d         int iDc =
12e90 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
12ea0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
12eb0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
12ec0 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20         int ii;. 
12ed0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
12ee0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
12ef0 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
12f00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
12f10 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
12f20 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
12f30 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  36>>8));.       
12f40 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
12f50 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
12f60 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a  E_SIZE<=65536);.
12f70 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69            for(ii
12f80 3d 6e 44 65 66 61 75 6c 74 50 61 67 65 3b 20 69  =nDefaultPage; i
12f90 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  i<=SQLITE_MAX_DE
12fa0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
12fb0 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20   ii=ii*2){.     
12fc0 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28         if( iDc&(
12fd0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
12fe0 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 20 6e  MIC|(ii>>8)) ) n
12ff0 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20 69 69  DefaultPage = ii
13000 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
13010 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
13020 20 20 20 20 20 20 20 69 66 28 20 6e 44 65 66 61         if( nDefa
13030 75 6c 74 50 61 67 65 3e 53 51 4c 49 54 45 5f 4d  ultPage>SQLITE_M
13040 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
13050 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
13060 20 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d    nDefaultPage =
13070 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41   SQLITE_MAX_DEFA
13080 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
13090 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
130a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
130b0 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20  f( !memDb ){.   
130c0 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
130d0 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
130e0 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
130f0 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
13100 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
13110 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
13120 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
13130 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
13140 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
13150 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
13160 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
13170 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
13180 74 65 28 29 2e 0a 20 20 20 20 2a 2f 20 0a 20 20  te()..    */ .  
13190 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
131a0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
131b0 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
131c0 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  IVE;.  }..  if( 
131d0 70 50 61 67 65 72 20 26 26 20 72 63 3d 3d 53 51  pPager && rc==SQ
131e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
131f0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
13200 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
13210 65 33 5f 6d 61 6c 6c 6f 63 28 6e 44 65 66 61 75  e3_malloc(nDefau
13220 6c 74 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20  ltPage);.  }..  
13230 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
13240 63 63 75 72 65 64 20 69 6e 20 65 69 74 68 65 72  ccured in either
13250 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61   of the blocks a
13260 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72 65 65 20  bove..  ** Free 
13270 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
13280 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
13290 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53 69 6e  e file..  ** Sin
132a0 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ce the pager is 
132b0 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68  not allocated th
132c0 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
132d0 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20  o set .  ** any 
132e0 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61  Pager.errMask va
132f0 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  riables..  */.  
13300 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21  if( !pPager || !
13310 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
13320 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
13330 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
13340 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
13350 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
13360 20 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d     return ((rc==
13370 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54  SQLITE_OK)?SQLIT
13380 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d  E_NOMEM:rc);.  }
13390 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 33 28  ..  PAGERTRACE3(
133a0 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20  "OPEN %d %s\n", 
133b0 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61  FILEHANDLEID(pPa
133c0 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72  ger->fd), pPager
133d0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
133e0 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  IOTRACE(("OPEN %
133f0 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %s\n", pPager,
13400 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
13410 6d 65 29 29 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  me))..  /* Fill 
13420 69 6e 20 50 61 67 65 72 2e 7a 44 69 72 65 63 74  in Pager.zDirect
13430 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70  ory[] */.  memcp
13440 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  y(pPager->zDirec
13450 74 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e 7a 46  tory, pPager->zF
13460 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
13470 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28 69 3d 73  me+1);.  for(i=s
13480 74 72 6c 65 6e 28 70 50 61 67 65 72 2d 3e 7a 44  trlen(pPager->zD
13490 69 72 65 63 74 6f 72 79 29 3b 20 69 3e 30 20 26  irectory); i>0 &
134a0 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  & pPager->zDirec
134b0 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20  tory[i-1]!='/'; 
134c0 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30  i--){}.  if( i>0
134d0 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65   ) pPager->zDire
134e0 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a  ctory[i-1] = 0;.
134f0 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61  .  /* Fill in Pa
13500 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d 20 61  ger.zJournal[] a
13510 6e 64 20 50 61 67 65 72 2e 7a 53 74 6d 74 4a 72  nd Pager.zStmtJr
13520 6e 6c 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  nl[] */.  memcpy
13530 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
13540 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  l, pPager->zFile
13550 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
13560 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67  ;.  memcpy(&pPag
13570 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
13580 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e  thname], "-journ
13590 61 6c 22 2c 20 39 29 3b 0a 20 20 6d 65 6d 63 70  al", 9);.  memcp
135a0 79 28 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74 4a  y(pPager->zStmtJ
135b0 72 6e 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  rnl, pPager->zFi
135c0 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
135d0 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50  e);.  memcpy(&pP
135e0 61 67 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 5b  ager->zStmtJrnl[
135f0 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 73 74  nPathname], "-st
13600 6d 74 6a 72 6e 6c 22 2c 20 31 30 29 3b 0a 0a 20  mtjrnl", 10);.. 
13610 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   /* pPager->jour
13620 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  nalOpen = 0; */.
13630 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
13640 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61  rnal = useJourna
13650 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70  l && !memDb;.  p
13660 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
13670 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26  k = noReadlock &
13680 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  & readOnly;.  /*
13690 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
136a0 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  n = 0; */.  /* p
136b0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
136c0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
136d0 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20  ager->nRef = 0; 
136e0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
136f0 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20  ize = memDb-1;. 
13700 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
13710 65 20 3d 20 6e 44 65 66 61 75 6c 74 50 61 67 65  e = nDefaultPage
13720 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
13730 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
13740 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
13750 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
13760 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
13770 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
13780 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 30  er->mxPage = 100
13790 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  ;.  pPager->mxPg
137a0 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  no = SQLITE_MAX_
137b0 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a  PAGE_COUNT;.  /*
137c0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
137d0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
137e0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
137f0 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65  er->state == (te
13800 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45  mpFile ? PAGER_E
13810 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52  XCLUSIVE : PAGER
13820 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a  _UNLOCK) );.  /*
13830 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
13840 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
13850 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65  r->tempFile = te
13860 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74  mpFile;.  assert
13870 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  ( tempFile==PAGE
13880 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
13890 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  RMAL .          
138a0 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  || tempFile==PAG
138b0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
138c0 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
138d0 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
138e0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
138f0 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72  E==1 );.  pPager
13900 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
13910 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70  = tempFile; .  p
13920 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d  Pager->memDb = m
13930 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
13940 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f  readOnly = readO
13950 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nly;.  /* pPager
13960 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  ->needSync = 0; 
13970 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  */.  pPager->noS
13980 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
13990 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f  mpFile || !useJo
139a0 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d  urnal;.  pPager-
139b0 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61  >fullSync = (pPa
139c0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29  ger->noSync?0:1)
139d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  ;.  pPager->sync
139e0 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  _flags = SQLITE_
139f0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f  SYNC_NORMAL;.  /
13a00 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
13a10 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
13a20 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
13a30 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
13a40 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
13a50 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
13a60 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41  nExtra = FORCE_A
13a70 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29  LIGNMENT(nExtra)
13a80 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
13a90 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
13aa0 7c 6d 65 6d 44 62 7c 7c 74 65 6d 70 46 69 6c 65  |memDb||tempFile
13ab0 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20  );.  if( !memDb 
13ac0 29 7b 0a 20 20 20 20 73 65 74 53 65 63 74 6f 72  ){.    setSector
13ad0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
13ae0 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  }.  /* pPager->p
13af0 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
13b00 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28   */.  /* memset(
13b10 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
13b20 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
13b30 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a  >aHash)); */.  *
13b40 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
13b50 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
13b60 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
13b70 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67 65  NAGEMENT.  pPage
13b80 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30 3b  r->iInUseMM = 0;
13b90 0a 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73  .  pPager->iInUs
13ba0 65 44 42 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  eDB = 0;.  if( !
13bb0 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 71 6c  memDb ){.    sql
13bc0 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
13bd0 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x = sqlite3_mute
13be0 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
13bf0 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32  UTEX_STATIC_MEM2
13c00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
13c10 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
13c20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
13c30 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 50 61  Next = sqlite3Pa
13c40 67 65 72 4c 69 73 74 3b 0a 20 20 20 20 69 66 28  gerList;.    if(
13c50 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
13c60 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
13c70 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  t( sqlite3PagerL
13c80 69 73 74 2d 3e 70 50 72 65 76 3d 3d 30 20 29 3b  ist->pPrev==0 );
13c90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
13ca0 67 65 72 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  gerList->pPrev =
13cb0 20 70 50 61 67 65 72 3b 0a 20 20 20 20 7d 0a 20   pPager;.    }. 
13cc0 20 20 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76     pPager->pPrev
13cd0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
13ce0 33 50 61 67 65 72 4c 69 73 74 20 3d 20 70 50 61  3PagerList = pPa
13cf0 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
13d00 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
13d10 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ex);.  }.#endif.
13d20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13d30 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
13d40 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
13d50 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  r function..*/.v
13d60 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
13d70 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 50  SetBusyhandler(P
13d80 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75  ager *pPager, Bu
13d90 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79  syHandler *pBusy
13da0 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67  Handler){.  pPag
13db0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
13dc0 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b   = pBusyHandler;
13dd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
13de0 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
13df0 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
13e00 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64   not NULL, the d
13e10 65 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c  estructor is cal
13e20 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  led.** when the 
13e30 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
13e40 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61  on each page rea
13e50 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20  ches zero.  The 
13e60 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a  destructor can.*
13e70 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65  * be used to cle
13e80 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f  an up informatio
13e90 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73  n in the extra s
13ea0 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20  egment appended 
13eb0 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a  to each page..**
13ec0 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74  .** The destruct
13ed0 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  or is not called
13ee0 20 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c   as a result sql
13ef0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29  ite3PagerClose()
13f00 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f  .  .** Destructo
13f10 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c  rs are only call
13f20 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  ed by sqlite3Pag
13f30 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f  erUnref()..*/.vo
13f40 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
13f50 65 74 44 65 73 74 72 75 63 74 6f 72 28 50 61 67  etDestructor(Pag
13f60 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
13f70 20 28 2a 78 44 65 73 63 29 28 44 62 50 61 67 65   (*xDesc)(DbPage
13f80 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65  *,int)){.  pPage
13f90 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d  r->xDestructor =
13fa0 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   xDesc;.}../*.**
13fb0 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69   Set the reiniti
13fc0 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20  alizer for this 
13fd0 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
13fe0 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69  ULL, the reiniti
13ff0 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c  alizer.** is cal
14000 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e  led when the con
14010 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69  tent of a page i
14020 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  n cache is resto
14030 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
14040 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20  nal.** value as 
14050 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f  a result of a ro
14060 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c  llback.  The cal
14070 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68  lback gives high
14080 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a  er-level code.**
14090 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
140a0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45  to restore the E
140b0 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20  XTRA section to 
140c0 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
140d0 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20  estored.** page 
140e0 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  data..*/.void sq
140f0 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
14100 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
14110 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
14120 6e 69 74 29 28 44 62 50 61 67 65 2a 2c 69 6e 74  nit)(DbPage*,int
14130 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52  )){.  pPager->xR
14140 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
14150 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
14160 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 74 6f  the page size to
14170 20 2a 70 50 61 67 65 53 69 7a 65 2e 20 49 66 20   *pPageSize. If 
14180 74 68 65 20 73 75 67 67 65 73 74 20 6e 65 77 20  the suggest new 
14190 70 61 67 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20  page size is.** 
141a0 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20 74  inappropriate, t
141b0 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  hen an alternati
141c0 76 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  ve page size is 
141d0 73 65 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76  set to that.** v
141e0 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75  alue before retu
141f0 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rning..*/.int sq
14200 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
14210 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
14220 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67 65 53  ger, u16 *pPageS
14230 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ize){.  int rc =
14240 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 31   SQLITE_OK;.  u1
14250 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50  6 pageSize = *pP
14260 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
14270 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c  t( pageSize==0 |
14280 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  | (pageSize>=512
14290 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
142a0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
142b0 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 70 61 67  ZE) );.  if( pag
142c0 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a  eSize && pageSiz
142d0 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e!=pPager->pageS
142e0 69 7a 65 20 0a 20 20 20 26 26 20 21 70 50 61 67  ize .   && !pPag
142f0 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61  er->memDb && pPa
14300 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 0a 20 20  ger->nRef==0 .  
14310 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65  ){.    char *pNe
14320 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  w = (char *)sqli
14330 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 61 67 65 53  te3_malloc(pageS
14340 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ize);.    if( !p
14350 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20  New ){.      rc 
14360 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
14370 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14380 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
14390 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72  er);.      pager
143a0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
143b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
143c0 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
143d0 65 3b 0a 20 20 20 20 20 20 73 65 74 53 65 63 74  e;.      setSect
143e0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
143f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
14400 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
14410 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61  pace);.      pPa
14420 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
14430 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 61 67   pNew;.      pag
14440 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
14450 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 50  .    }.  }.  *pP
14460 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ageSize = pPager
14470 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 72 65  ->pageSize;.  re
14480 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14490 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
144a0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
144b0 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
144c0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
144d0 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
144e0 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
144f0 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
14500 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
14510 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
14520 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
14530 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
14540 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
14550 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
14560 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
14570 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
14580 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
14590 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
145a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
145b0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
145c0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
145d0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
145e0 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
145f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
14600 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
14610 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
14620 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
14630 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
14640 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  r->mxPgno;.}../*
14650 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
14660 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65  g set of routine
14670 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69  s are used to di
14680 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61  sable the simula
14690 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72  ted.** I/O error
146a0 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65   mechanism.  The
146b0 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
146c0 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69  used to avoid si
146d0 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72  mulated.** error
146e0 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72  s in places wher
146f0 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  e we do not care
14700 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a   about errors..*
14710 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51  *.** Unless -DSQ
14720 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75  LITE_TEST=1 is u
14730 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69  sed, these routi
14740 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f  nes are all no-o
14750 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61  ps.** and genera
14760 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23  te no code..*/.#
14770 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
14780 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  T.extern int sql
14790 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
147a0 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e  nding;.extern in
147b0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
147c0 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69  or_hit;.static i
147d0 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f  nt saved_cnt;.vo
147e0 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  id disable_simul
147f0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
14800 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e  oid){.  saved_cn
14810 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  t = sqlite3_io_e
14820 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20  rror_pending;.  
14830 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
14840 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d  _pending = -1;.}
14850 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d  .void enable_sim
14860 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
14870 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
14880 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
14890 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a  ng = saved_cnt;.
148a0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
148b0 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
148c0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
148d0 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73   define enable_s
148e0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
148f0 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  rs().#endif../*.
14900 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  ** Read the firs
14910 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74  t N bytes from t
14920 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
14930 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65  the file into me
14940 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65  mory.** that pDe
14950 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a  st points to. .*
14960 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68  *.** No error ch
14970 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20  ecking is done. 
14980 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72  The rational for
14990 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68   this is that th
149a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
149b0 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 76  may be called ev
149c0 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20 64  en if the file d
149d0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72  oes not exist or
149e0 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64 65   contain a heade
149f0 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20  r. In .** these 
14a00 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73 52  cases sqlite3OsR
14a10 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75 72  ead() will retur
14a20 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77  n an error, to w
14a30 68 69 63 68 20 74 68 65 20 63 6f 72 72 65 63 74  hich the correct
14a40 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69 73   .** response is
14a50 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d   to zero the mem
14a60 6f 72 79 20 61 74 20 70 44 65 73 74 20 61 6e 64  ory at pDest and
14a70 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72 65   continue.  A re
14a80 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  al IO error .** 
14a90 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79 20  will presumably 
14aa0 72 65 63 75 72 20 61 6e 64 20 62 65 20 70 69 63  recur and be pic
14ab0 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28 54 6f  ked up later (To
14ac0 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74 20  do: Think about 
14ad0 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  this)..*/.int sq
14ae0 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
14af0 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a  leheader(Pager *
14b00 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75  pPager, int N, u
14b10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
14b20 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  est){.  int rc =
14b30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65   SQLITE_OK;.  me
14b40 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e  mset(pDest, 0, N
14b50 29 3b 0a 20 20 61 73 73 65 72 74 28 4d 45 4d 44  );.  assert(MEMD
14b60 42 7c 7c 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  B||pPager->fd->p
14b70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d  Methods||pPager-
14b80 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66  >tempFile);.  if
14b90 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  ( pPager->fd->pM
14ba0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 49 4f  ethods ){.    IO
14bb0 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70  TRACE(("DBHDR %p
14bc0 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72   0 %d\n", pPager
14bd0 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73  , N)).    rc = s
14be0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
14bf0 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
14c00 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  N, 0);.    if( r
14c10 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
14c20 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
14c30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14c40 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
14c50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14c60 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
14c70 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
14c80 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ages in the disk
14c90 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
14ca0 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e   with.** pPager.
14cb0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50   .**.** If the P
14cc0 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65 73  ENDING_BYTE lies
14cd0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69 72   on the page dir
14ce0 65 63 74 6c 79 20 61 66 74 65 72 20 74 68 65 20  ectly after the 
14cf0 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  end of the.** fi
14d00 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65  le, then conside
14d10 72 20 74 68 69 73 20 70 61 67 65 20 70 61 72 74  r this page part
14d20 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 6f   of the file too
14d30 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
14d40 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54  f.** PENDING_BYT
14d50 45 20 69 73 20 62 79 74 65 20 34 30 39 36 20 28  E is byte 4096 (
14d60 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
14d70 66 20 70 61 67 65 20 35 29 20 61 6e 64 20 74 68  f page 5) and th
14d80 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
14d90 20 66 69 6c 65 20 69 73 20 34 30 39 36 20 62 79   file is 4096 by
14da0 74 65 73 2c 20 35 20 69 73 20 72 65 74 75 72 6e  tes, 5 is return
14db0 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34 2e  ed instead of 4.
14dc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
14dd0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
14de0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
14df0 69 36 34 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  i64 n = 0;.  int
14e00 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
14e10 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66  Pager!=0 );.  if
14e20 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
14e30 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
14e40 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
14e50 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
14e60 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72  {.    n = pPager
14e70 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c  ->dbSize;.  } el
14e80 73 65 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28  se {.    assert(
14e90 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
14ea0 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65  hods||pPager->te
14eb0 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  mpFile);.    if(
14ec0 20 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d   (pPager->fd->pM
14ed0 65 74 68 6f 64 73 29 0a 20 20 20 20 20 26 26 20  ethods).     && 
14ee0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
14ef0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
14f00 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54 45  fd, &n))!=SQLITE
14f10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67  _OK ){.      pag
14f20 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
14f30 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75   rc);.      retu
14f40 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
14f50 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61  if( n>0 && n<pPa
14f60 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
14f70 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20  .      n = 1;.  
14f80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
14f90 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   /= pPager->page
14fa0 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Size;.    }.    
14fb0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
14fc0 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
14fd0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
14fe0 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20  >dbSize = n;.   
14ff0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d   }.  }.  if( n==
15000 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50  (PENDING_BYTE/pP
15010 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
15020 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a  ){.    n++;.  }.
15030 20 20 69 66 28 20 6e 3e 70 50 61 67 65 72 2d 3e    if( n>pPager->
15040 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  mxPgno ){.    pP
15050 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6e  ager->mxPgno = n
15060 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
15070 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
15080 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
15090 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  DB./*.** Clear a
150a0 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b   PgHistory block
150b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
150c0 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67 48  clearHistory(PgH
150d0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a  istory *pHist){.
150e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
150f0 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20  Hist->pOrig);.  
15100 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69  sqlite3_free(pHi
15110 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48  st->pStmt);.  pH
15120 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a  ist->pOrig = 0;.
15130 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
15140 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66   0;.}.#else.#def
15150 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f 72 79  ine clearHistory
15160 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
15170 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
15180 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
15190 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
151a0 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  Pager*);../*.** 
151b0 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20  Unlink pPg from 
151c0 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e  it's hash chain.
151d0 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70 61   Also set the pa
151e0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20 74  ge number to 0 t
151f0 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68  o indicate.** th
15200 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  at the page is n
15210 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68  ot part of any h
15220 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73 20  ash chain. This 
15230 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61  is required beca
15240 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  use the.** sqlit
15250 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
15260 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65  ) routine can le
15270 61 76 65 20 61 20 70 61 67 65 20 69 6e 20 74 68  ave a page in th
15280 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f  e .** pNextFree/
15290 70 50 72 65 76 46 72 65 65 20 6c 69 73 74 20 74  pPrevFree list t
152a0 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 61 72  hat is not a par
152b0 74 20 6f 66 20 61 6e 79 20 68 61 73 68 2d 63 68  t of any hash-ch
152c0 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ain..*/.static v
152d0 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68  oid unlinkHashCh
152e0 61 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ain(Pager *pPage
152f0 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  r, PgHdr *pPg){.
15300 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d    if( pPg->pgno=
15310 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
15320 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
15330 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72 65  ==0 && pPg->pPre
15340 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20  vHash==0 );.    
15350 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
15360 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
15370 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   ){.    pPg->pNe
15380 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
15390 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61  h = pPg->pPrevHa
153a0 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  sh;.  }.  if( pP
153b0 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a  g->pPrevHash ){.
153c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
153d0 65 72 2d 3e 61 48 61 73 68 5b 70 50 67 2d 3e 70  er->aHash[pPg->p
153e0 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
153f0 48 61 73 68 2d 31 29 5d 21 3d 70 50 67 20 29 3b  Hash-1)]!=pPg );
15400 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48  .    pPg->pPrevH
15410 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  ash->pNextHash =
15420 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b   pPg->pNextHash;
15430 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
15440 74 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20  t h = pPg->pgno 
15450 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
15460 2d 31 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  -1);.    pPager-
15470 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d  >aHash[h] = pPg-
15480 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a  >pNextHash;.  }.
15490 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
154a0 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28     clearHistory(
154b0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
154c0 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20 7d  g, pPager));.  }
154d0 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30  .  pPg->pgno = 0
154e0 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ;.  pPg->pNextHa
154f0 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48  sh = pPg->pPrevH
15500 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ash = 0;.}../*.*
15510 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20  * Unlink a page 
15520 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69  from the free li
15530 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20  st (the list of 
15540 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65 20  all pages where 
15550 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20  nRef==0).** and 
15560 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f  from its hash co
15570 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a  llision chain..*
15580 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
15590 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a  linkPage(PgHdr *
155a0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
155b0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
155c0 67 65 72 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  ger;..  /* Unlin
155d0 6b 20 66 72 6f 6d 20 66 72 65 65 20 70 61 67 65  k from free page
155e0 20 6c 69 73 74 20 2a 2f 0a 20 20 6c 72 75 4c 69   list */.  lruLi
155f0 73 74 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 0a  stRemove(pPg);..
15600 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d    /* Unlink from
15610 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74   the pgno hash t
15620 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  able */.  unlink
15630 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
15640 2c 20 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , pPg);.}../*.**
15650 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
15660 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74   used to truncat
15670 65 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e  e the cache when
15680 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69   a database.** i
15690 73 20 74 72 75 6e 63 61 74 65 64 2e 20 20 44 72  s truncated.  Dr
156a0 6f 70 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  op from the cach
156b0 65 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73  e all pages whos
156c0 65 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72  e pgno is.** lar
156d0 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d  ger than pPager-
156e0 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75  >dbSize and is u
156f0 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a  nreferenced..**.
15700 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61  ** Referenced pa
15710 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ges larger than 
15720 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
15730 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  re zeroed..**.**
15740 20 41 63 74 75 61 6c 6c 79 2c 20 61 74 20 74 68   Actually, at th
15750 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75  e point this rou
15760 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
15770 69 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61  it would be.** a
15780 6e 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20  n error to have 
15790 61 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  a referenced pag
157a0 65 2e 20 20 42 75 74 20 72 61 74 68 65 72 20 74  e.  But rather t
157b0 68 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68  han delete.** th
157c0 61 74 20 70 61 67 65 20 61 6e 64 20 67 75 61 72  at page and guar
157d0 61 6e 74 65 65 20 61 20 73 75 62 73 65 71 75 65  antee a subseque
157e0 6e 74 20 73 65 67 66 61 75 6c 74 2c 20 69 74 20  nt segfault, it 
157f0 73 65 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20  seems better.** 
15800 74 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64 20 68  to zero it and h
15810 6f 70 65 20 74 68 61 74 20 77 65 20 65 72 72 6f  ope that we erro
15820 72 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f  r out sanely..*/
15830 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
15840 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
15850 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
15860 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
15870 20 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a    PgHdr **ppPg;.
15880 20 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70    int dbSize = p
15890 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a  Pager->dbSize;..
158a0 20 20 70 70 50 67 20 3d 20 26 70 50 61 67 65 72    ppPg = &pPager
158b0 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28  ->pAll;.  while(
158c0 20 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d   (pPg = *ppPg)!=
158d0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  0 ){.    if( pPg
158e0 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29  ->pgno<=dbSize )
158f0 7b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26  {.      ppPg = &
15900 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
15910 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67     }else if( pPg
15920 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20  ->nRef>0 ){.    
15930 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
15940 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20  O_DATA(pPg), 0, 
15950 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15960 29 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20  );.      ppPg = 
15970 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a  &pPg->pNextAll;.
15980 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15990 20 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e   *ppPg = pPg->pN
159a0 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 49 4f  extAll;.      IO
159b0 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25  TRACE(("PGFREE %
159c0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
159d0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
159e0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
159f0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
15a00 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  ree_count);.    
15a10 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67    unlinkPage(pPg
15a20 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65  );.      makeCle
15a30 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73  an(pPg);.      s
15a40 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 2d  qlite3_free(pPg-
15a50 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73  >pData);.      s
15a60 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 29  qlite3_free(pPg)
15a70 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
15a80 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20  nPage--;.    }. 
15a90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20   }.}../*.** Try 
15aa0 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  to obtain a lock
15ab0 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76   on a file.  Inv
15ac0 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c  oke the busy cal
15ad0 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63  lback if the loc
15ae0 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c  k.** is currentl
15af0 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
15b00 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74    Repeat until t
15b10 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
15b20 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73   returns.** fals
15b30 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c  e or until the l
15b40 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a  ock succeeds..**
15b50 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
15b60 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
15b70 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
15b80 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  e if we cannot o
15b90 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63  btain.** the loc
15ba0 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
15bb0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
15bc0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
15bd0 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  r, int locktype)
15be0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
15bf0 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61  * The OS lock va
15c00 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65  lues must be the
15c10 20 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67   same as the Pag
15c20 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a  er lock values *
15c30 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  /.  assert( PAGE
15c40 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44  R_SHARED==SHARED
15c50 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
15c60 74 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  t( PAGER_RESERVE
15c70 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  D==RESERVED_LOCK
15c80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
15c90 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45  GER_EXCLUSIVE==E
15ca0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
15cb0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
15cc0 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
15cd0 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68  unlocked then th
15ce0 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75  e size must be u
15cf0 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65  nknown */.  asse
15d00 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
15d10 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
15d20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
15d30 65 3c 30 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a  e<0 || MEMDB );.
15d40 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
15d50 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  tate>=locktype )
15d60 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
15d70 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
15d80 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63     do {.      rc
15d90 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
15da0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63  (pPager->fd, loc
15db0 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69  ktype);.    }whi
15dc0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
15dd0 55 53 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e  USY && sqlite3In
15de0 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
15df0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
15e00 64 6c 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  dler) );.    if(
15e10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15e20 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
15e30 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65  state = locktype
15e40 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
15e50 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  ("LOCK %p %d\n",
15e60 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70   pPager, locktyp
15e70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e)).    }.  }.  
15e80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15e90 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
15ea0 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d   file to the num
15eb0 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65  ber of pages spe
15ec0 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  cified..*/.int s
15ed0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
15ee0 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
15ef0 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
15f00 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
15f10 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
15f20 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
15f30 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71  || MEMDB );.  sq
15f40 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
15f50 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  unt(pPager);.  i
15f60 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
15f70 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  de ){.    rc = p
15f80 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
15f90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
15fa0 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d   }.  if( nPage>=
15fb0 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
15fc0 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
15fd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15fe0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44  ;.  }.  if( MEMD
15ff0 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
16000 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
16010 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  .    pager_trunc
16020 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72  ate_cache(pPager
16030 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
16040 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
16050 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
16060 29 3b 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f  );.  rc = syncJo
16070 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
16080 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
16090 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
160a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
160b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
160c0 20 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c    /* Get an excl
160d0 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
160e0 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
160f0 65 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f  e truncating. */
16100 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
16110 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61  ager);.  rc = pa
16120 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
16130 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
16140 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 70 61 67 65  VE_LOCK);.  page
16150 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
16160 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16170 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
16180 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  n rc;.  }..  rc 
16190 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
161a0 28 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b  (pPager, nPage);
161b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
161c0 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
161d0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
161e0 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
161f0 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66   and close all f
16200 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iles..**.** If a
16210 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
16220 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65   in progress whe
16230 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
16240 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a  s called, that.*
16250 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
16260 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41   rolled back.  A
16270 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ll outstanding p
16280 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
16290 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69  ated.** and thei
162a0 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65  r memory is free
162b0 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  d.  Any attempt 
162c0 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73  to use a page as
162d0 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
162e0 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65   this page cache
162f0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
16300 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c  tion returns wil
16310 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
16320 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
16330 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
16340 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63  ction always suc
16350 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e  ceeds. If a tran
16360 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
16370 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20  e an attempt.** 
16380 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20  is made to roll 
16390 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65  it back. If an e
163a0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
163b0 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ng the rollback 
163c0 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  .** a hot journa
163d0 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e  l may be left in
163e0 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
163f0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20  but no error is 
16400 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74  returned.** to t
16410 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e  he caller..*/.in
16420 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  t sqlite3PagerCl
16430 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
16440 72 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  r){.#ifdef SQLIT
16450 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
16460 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28  MANAGEMENT.  if(
16470 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 73   !MEMDB ){.    s
16480 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
16490 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
164a0 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
164b0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
164c0 4d 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  M2);.    sqlite3
164d0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
164e0 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ex);.    if( pPa
164f0 67 65 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ger->pPrev ){.  
16500 20 20 20 20 70 50 61 67 65 72 2d 3e 70 50 72 65      pPager->pPre
16510 76 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 67 65  v->pNext = pPage
16520 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
16530 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
16540 65 33 50 61 67 65 72 4c 69 73 74 20 3d 20 70 50  e3PagerList = pP
16550 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ager->pNext;.   
16560 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
16570 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
16580 20 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 2d    pPager->pNext-
16590 3e 70 50 72 65 76 20 3d 20 70 50 61 67 65 72 2d  >pPrev = pPager-
165a0 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20  >pPrev;.    }.  
165b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
165c0 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20  leave(mutex);.  
165d0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 64 69 73 61  }.#endif..  disa
165e0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
165f0 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 70 50 61  _errors();.  pPa
16600 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  ger->errCode = 0
16610 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
16620 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20  usiveMode = 0;. 
16630 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
16640 67 65 72 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c  ger);.  pagerUnl
16650 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
16660 50 61 67 65 72 29 3b 0a 20 20 65 6e 61 62 6c 65  Pager);.  enable
16670 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
16680 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54  rors();.  PAGERT
16690 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c  RACE2("CLOSE %d\
166a0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
166b0 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  er));.  IOTRACE(
166c0 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
166d0 50 61 67 65 72 29 29 0a 20 20 61 73 73 65 72 74  Pager)).  assert
166e0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
166f0 65 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f  e || (pPager->jo
16700 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20  urnalOpen==0 && 
16710 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
16720 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  ==0) );.  if( pP
16730 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
16740 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
16750 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
16760 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  jfd);.  }.  sqli
16770 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
16780 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >aInJournal);.  
16790 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
167a0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
167b0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
167c0 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20  r->stfd);.  }.  
167d0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
167e0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a  Pager->fd);.  /*
167f0 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20   Temp files are 
16800 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
16810 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a  leted by the OS.
16820 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d    ** if( pPager-
16830 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a  >tempFile ){.  *
16840 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  *   sqlite3OsDel
16850 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ete(pPager->zFil
16860 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20  ename);.  ** }. 
16870 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66   */..  sqlite3_f
16880 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73  ree(pPager->aHas
16890 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  h);.  sqlite3_fr
168a0 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
168b0 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  pace);.  sqlite3
168c0 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
168d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
168e0 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  K;.}..#if !defin
168f0 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65  ed(NDEBUG) || de
16900 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
16910 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
16920 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
16930 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
16940 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f  ge data..*/.Pgno
16950 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
16960 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a  enumber(DbPage *
16970 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
16980 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  pgno;.}.#endif..
16990 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72  /*.** The page_r
169a0 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e  ef() function in
169b0 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66  crements the ref
169c0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
169d0 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74   a page..** If t
169e0 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
169f0 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
16a00 6c 69 73 74 20 28 74 68 65 20 72 65 66 65 72 65  list (the refere
16a10 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72  nce count is zer
16a20 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76  o) then.** remov
16a30 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72  e it from the fr
16a40 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  eelist..**.** Fo
16a50 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65  r non-test syste
16a60 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69  ms, page_ref() i
16a70 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63  s a macro that c
16a80 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29  alls _page_ref()
16a90 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68  .** online of th
16aa0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
16ab0 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20  t is zero.  For 
16ac0 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61  test systems, pa
16ad0 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61  ge_ref().** is a
16ae0 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73   real function s
16af0 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 65  o that we can se
16b00 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e  t breakpoints an
16b10 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73  d trace it..*/.s
16b20 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65  tatic void _page
16b30 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29  _ref(PgHdr *pPg)
16b40 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  {.  if( pPg->nRe
16b50 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
16b60 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
16b70 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
16b80 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74  list.  Remove it
16b90 2e 20 2a 2f 0a 20 20 20 20 6c 72 75 4c 69 73 74  . */.    lruList
16ba0 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 20 20 20  Remove(pPg);.   
16bb0 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52   pPg->pPager->nR
16bc0 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  ef++;.  }.  pPg-
16bd0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e  >nRef++;.  REFIN
16be0 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65  FO(pPg);.}.#ifde
16bf0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
16c00 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
16c10 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67  e_ref(PgHdr *pPg
16c20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
16c30 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
16c40 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b   _page_ref(pPg);
16c50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16c60 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pPg->nRef++;. 
16c70 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67       REFINFO(pPg
16c80 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
16c90 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
16ca0 5f 72 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e  _ref(P)   ((P)->
16cb0 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65  nRef==0?_page_re
16cc0 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e  f(P):(void)(P)->
16cd0 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a  nRef++).#endif..
16ce0 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
16cf0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
16d00 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  unt for a page. 
16d10 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74   The input point
16d20 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72  er is.** a refer
16d30 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
16d40 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71   data..*/.int sq
16d50 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62  lite3PagerRef(Db
16d60 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 70 61  Page *pPg){.  pa
16d70 67 65 72 45 6e 74 65 72 28 70 50 67 2d 3e 70 50  gerEnter(pPg->pP
16d80 61 67 65 72 29 3b 0a 20 20 70 61 67 65 5f 72 65  ager);.  page_re
16d90 66 28 70 50 67 29 3b 0a 20 20 70 61 67 65 72 4c  f(pPg);.  pagerL
16da0 65 61 76 65 28 70 50 67 2d 3e 70 50 61 67 65 72  eave(pPg->pPager
16db0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
16dc0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
16dd0 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
16de0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
16df0 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  s, make sure all
16e00 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
16e10 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69  have.** been wri
16e20 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
16e30 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c  nal have actuall
16e40 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75  y reached the su
16e50 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  rface of the.** 
16e60 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74  disk.  It is not
16e70 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20   safe to modify 
16e80 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
16e90 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c  abase file until
16ea0 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f   after.** the jo
16eb0 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73  urnal has been s
16ec0 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f  ynced.  If the o
16ed0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
16ee0 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66   is modified bef
16ef0 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ore.** the journ
16f00 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64  al is synced and
16f10 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
16f20 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73   occurs, the uns
16f30 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ynced journal.**
16f40 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c   data would be l
16f50 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64  ost and we would
16f60 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f   be unable to co
16f70 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63  mpletely rollbac
16f80 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
16f90 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61  e changes.  Data
16fa0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
16fb0 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20  would occur..** 
16fc0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16fd0 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68   also updates th
16fe0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20  e nRec field in 
16ff0 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68  the header of th
17000 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53  e journal..** (S
17010 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74  ee comments on t
17020 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
17030 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  k() routine for 
17040 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
17050 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74  mation.).** If t
17060 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  he sync mode is 
17070 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20  FULL, two syncs 
17080 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72  will occur.  Fir
17090 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75  st the whole jou
170a0 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65  rnal.** is synce
170b0 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63  d, then the nRec
170c0 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
170d0 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64  d, then a second
170e0 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
170f0 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
17100 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20  y databases, we 
17110 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77  do not care if w
17120 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f  e are able to ro
17130 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20  llback.** after 
17140 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
17150 20 73 6f 20 6e 6f 20 73 79 6e 63 20 6f 63 63 75   so no sync occu
17160 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  rs..**.** If the
17170 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41   IOCAP_SEQUENTIA
17180 4c 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f  L flag is set fo
17190 72 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  r the persistent
171a0 20 6d 65 64 69 61 20 6f 6e 20 77 68 69 63 68 0a   media on which.
171b0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
171c0 69 73 20 73 74 6f 72 65 64 2c 20 74 68 65 6e 20  is stored, then 
171d0 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
171e0 72 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  r called on the 
171f0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e  journal.** file.
17200 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c   In this case al
17210 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
17220 65 64 20 69 73 20 74 6f 20 75 70 64 61 74 65 20  ed is to update 
17230 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
17240 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n.** the journal
17250 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   header..**.** T
17260 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
17270 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  rs the needSync 
17280 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70  field of every p
17290 61 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64  age current held
172a0 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a   in.** memory..*
172b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
172c0 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  cJournal(Pager *
172d0 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
172e0 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20   *pPg;.  int rc 
172f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20  = SQLITE_OK;... 
17300 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
17310 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69  rnal before modi
17320 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64  fying the main d
17330 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73  atabase.  ** (as
17340 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20  suming there is 
17350 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74  a journal and it
17360 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
17370 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ced.).  */.  if(
17380 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
17390 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  c ){.    if( !pP
173a0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
173b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 63 20  {.      int iDc 
173c0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
173d0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
173e0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
173f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
17400 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
17410 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 61 73 73  );..      /* ass
17420 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f  ert( !pPager->no
17430 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e  Sync ); // noSyn
17440 63 20 6d 69 67 68 74 20 62 65 20 73 65 74 20 69  c might be set i
17450 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20  f synchronous.  
17460 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65      ** was turne
17470 64 20 6f 66 66 20 61 66 74 65 72 20 74 68 65 20  d off after the 
17480 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
17490 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74  started.  Ticket
174a0 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66   #615 */.#ifndef
174b0 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a   NDEBUG.      {.
174c0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
174d0 73 75 72 65 20 74 68 65 20 70 50 61 67 65 72 2d  sure the pPager-
174e0 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65  >nRec counter we
174f0 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72   are keeping agr
17500 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ees.        ** w
17510 69 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d  ith the nRec com
17520 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  puted from the s
17530 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
17540 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
17550 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
17560 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 72 63 20  jSz;.        rc 
17570 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
17580 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
17590 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20   &jSz);.        
175a0 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
175b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61  rn rc;.        a
175c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
175d0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29  ournalOff==jSz )
175e0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
175f0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
17600 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
17610 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
17620 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
17630 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
17640 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
17650 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
17660 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
17670 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
17680 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
17690 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
176a0 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
176b0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
176c0 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
176d0 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
176e0 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
176f0 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
17700 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
17710 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
17720 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
17730 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
17740 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
17750 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65   if the persiste
17760 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74  nt media support
17770 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
17780 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
17790 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69  perty. Because i
177a0 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
177b0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a  s not possible .
177c0 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67          ** for g
177d0 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62  arbage data to b
177e0 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
177f0 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63  e file, the nRec
17800 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
17810 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  * is populated w
17820 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77  ith 0xFFFFFFFF w
17830 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
17840 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
17850 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  n.        ** and
17860 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
17870 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
17880 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
17890 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 20 20  64 jrnlOff;.    
178a0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
178b0 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28  fullSync && 0==(
178c0 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
178d0 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
178e0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
178f0 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
17900 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
17910 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
17920 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
17930 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
17940 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
17950 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17960 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
17970 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
17980 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  _flags);.       
17990 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
179a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
179b0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 6a 72 6e    }..        jrn
179c0 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lOff = pPager->j
179d0 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65  ournalHdr + size
179e0 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
179f0 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  );.        IOTRA
17a00 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
17a10 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
17a20 20 6a 72 6e 6c 4f 66 66 2c 20 34 29 29 3b 0a 20   jrnlOff, 4));. 
17a30 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
17a40 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
17a50 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 50  jfd, jrnlOff, pP
17a60 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20  ager->nRec);.   
17a70 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
17a80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
17a90 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
17aa0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
17ab0 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
17ac0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
17ad0 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E2("SYNC journal
17ae0 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
17af0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
17b00 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
17b10 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
17b20 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
17b30 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
17b40 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
17b50 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c  ger->sync_flags|
17b60 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61   .          (pPa
17b70 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d  ger->sync_flags=
17b80 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
17b90 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
17ba0 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
17bb0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
17bc0 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
17bd0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
17be0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
17bf0 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20  lStarted = 1;.  
17c00 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
17c10 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20  needSync = 0;.. 
17c20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20     /* Erase the 
17c30 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72  needSync flag fr
17c40 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20  om every page.. 
17c50 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50     */.    for(pP
17c60 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
17c70 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
17c80 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
17c90 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
17ca0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 72 75 4c  ;.    }.    lruL
17cb0 69 73 74 53 65 74 46 69 72 73 74 53 79 6e 63 65  istSetFirstSynce
17cc0 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  d(pPager);.  }..
17cd0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
17ce0 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72   /* If the Pager
17cf0 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
17d00 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65  s clear then the
17d10 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
17d20 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61    ** flag must a
17d30 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72  lso be clear for
17d40 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72   all pages.  Ver
17d50 69 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20  ify that this.  
17d60 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  ** invariant is 
17d70 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  true..  */.  els
17d80 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  e{.    for(pPg=p
17d90 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
17da0 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
17db0 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65  All){.      asse
17dc0 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
17dd0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  c==0 );.    }.  
17de0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17df0 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
17e00 65 64 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e  ed==pPager->lru.
17e10 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65  pFirst );.  }.#e
17e20 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
17e30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67  c;.}../*.** Merg
17e40 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66 20 70  e two lists of p
17e50 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  ages connected b
17e60 79 20 70 44 69 72 74 79 20 61 6e 64 20 69 6e 20  y pDirty and in 
17e70 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44  pgno order..** D
17e80 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69 78 69 6e  o not both fixin
17e90 67 20 74 68 65 20 70 50 72 65 76 44 69 72 74 79  g the pPrevDirty
17ea0 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74   pointers..*/.st
17eb0 61 74 69 63 20 50 67 48 64 72 20 2a 6d 65 72 67  atic PgHdr *merg
17ec0 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
17ed0 20 2a 70 41 2c 20 50 67 48 64 72 20 2a 70 42 29   *pA, PgHdr *pB)
17ee0 7b 0a 20 20 50 67 48 64 72 20 72 65 73 75 6c 74  {.  PgHdr result
17ef0 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54 61 69  , *pTail;.  pTai
17f00 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20 20 77  l = &result;.  w
17f10 68 69 6c 65 28 20 70 41 20 26 26 20 70 42 20 29  hile( pA && pB )
17f20 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 67  {.    if( pA->pg
17f30 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20  no<pB->pgno ){. 
17f40 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72       pTail->pDir
17f50 74 79 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70  ty = pA;.      p
17f60 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20  Tail = pA;.     
17f70 20 70 41 20 3d 20 70 41 2d 3e 70 44 69 72 74 79   pA = pA->pDirty
17f80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17f90 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
17fa0 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 54 61   = pB;.      pTa
17fb0 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70  il = pB;.      p
17fc0 42 20 3d 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a  B = pB->pDirty;.
17fd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
17fe0 70 41 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d  pA ){.    pTail-
17ff0 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20  >pDirty = pA;.  
18000 7d 65 6c 73 65 20 69 66 28 20 70 42 20 29 7b 0a  }else if( pB ){.
18010 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
18020 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b  y = pB;.  }else{
18030 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72  .    pTail->pDir
18040 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ty = 0;.  }.  re
18050 74 75 72 6e 20 72 65 73 75 6c 74 2e 70 44 69 72  turn result.pDir
18060 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72  ty;.}../*.** Sor
18070 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61  t the list of pa
18080 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67  ges in accending
18090 20 6f 72 64 65 72 20 62 79 20 70 67 6e 6f 2e 20   order by pgno. 
180a0 20 50 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f   Pages are.** co
180b0 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
180c0 79 20 70 6f 69 6e 74 65 72 73 2e 20 20 54 68 65  y pointers.  The
180d0 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e   pPrevDirty poin
180e0 74 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72  ters are.** corr
180f0 75 70 74 65 64 20 62 79 20 74 68 69 73 20 73 6f  upted by this so
18100 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  rt..*/.#define N
18110 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c  _SORT_BUCKET_ALL
18120 4f 43 20 32 35 0a 23 64 65 66 69 6e 65 20 4e 5f  OC 25.#define N_
18130 53 4f 52 54 5f 42 55 43 4b 45 54 20 20 20 20 20  SORT_BUCKET     
18140 20 20 32 35 0a 23 69 66 64 65 66 20 53 51 4c 49    25.#ifdef SQLI
18150 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 73 71  TE_TEST.  int sq
18160 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f  lite3_pager_n_so
18170 72 74 5f 62 75 63 6b 65 74 20 3d 20 30 3b 0a 20  rt_bucket = 0;. 
18180 20 23 75 6e 64 65 66 20 4e 5f 53 4f 52 54 5f 42   #undef N_SORT_B
18190 55 43 4b 45 54 0a 20 20 23 64 65 66 69 6e 65 20  UCKET.  #define 
181a0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 5c 0a  N_SORT_BUCKET \.
181b0 20 20 20 28 73 71 6c 69 74 65 33 5f 70 61 67 65     (sqlite3_page
181c0 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3f  r_n_sort_bucket?
181d0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f  sqlite3_pager_n_
181e0 73 6f 72 74 5f 62 75 63 6b 65 74 3a 4e 5f 53 4f  sort_bucket:N_SO
181f0 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 29  RT_BUCKET_ALLOC)
18200 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 50  .#endif.static P
18210 67 48 64 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c  gHdr *sort_pagel
18220 69 73 74 28 50 67 48 64 72 20 2a 70 49 6e 29 7b  ist(PgHdr *pIn){
18230 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f  .  PgHdr *a[N_SO
18240 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 5d  RT_BUCKET_ALLOC]
18250 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  , *p;.  int i;. 
18260 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69   memset(a, 0, si
18270 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77 68 69 6c  zeof(a));.  whil
18280 65 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 70 20  e( pIn ){.    p 
18290 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d  = pIn;.    pIn =
182a0 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20   p->pDirty;.    
182b0 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  p->pDirty = 0;. 
182c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f     for(i=0; i<N_
182d0 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69  SORT_BUCKET-1; i
182e0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
182f0 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
18300 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20    a[i] = p;.    
18310 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
18320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18330 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69  p = merge_pageli
18340 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20  st(a[i], p);.   
18350 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20       a[i] = 0;. 
18360 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
18370 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42   if( i==N_SORT_B
18380 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20 20  UCKET-1 ){.     
18390 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20 54 6f   /* Coverage: To
183a0 20 67 65 74 20 68 65 72 65 2c 20 74 68 65 72 65   get here, there
183b0 20 6e 65 65 64 20 74 6f 20 62 65 20 32 5e 28 4e   need to be 2^(N
183c0 5f 53 4f 52 54 5f 42 55 43 4b 45 54 29 20 0a 20  _SORT_BUCKET) . 
183d0 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73       ** elements
183e0 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 69   in the input li
183f0 73 74 2e 20 54 68 69 73 20 69 73 20 70 6f 73 73  st. This is poss
18400 69 62 6c 65 2c 20 62 75 74 20 69 6d 70 72 61 63  ible, but imprac
18410 74 69 63 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 20  tical..      ** 
18420 54 65 73 74 69 6e 67 20 74 68 69 73 20 6c 69 6e  Testing this lin
18430 65 20 69 73 20 74 68 65 20 70 6f 69 6e 74 20 6f  e is the point o
18440 66 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  f global variabl
18450 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  e.      ** sqlit
18460 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
18470 62 75 63 6b 65 74 2e 0a 20 20 20 20 20 20 2a 2f  bucket..      */
18480 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 6d 65  .      a[i] = me
18490 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69  rge_pagelist(a[i
184a0 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ], p);.    }.  }
184b0 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a 20 20 66  .  p = a[0];.  f
184c0 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52 54  or(i=1; i<N_SORT
184d0 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a 20  _BUCKET; i++){. 
184e0 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67     p = merge_pag
184f0 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d 29 3b 0a  elist(p, a[i]);.
18500 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
18510 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
18520 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 28   list of pages (
18530 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65  connected by the
18540 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f   PgHdr.pDirty po
18550 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20  inter) write.** 
18560 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f  every one of tho
18570 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20  se pages out to 
18580 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18590 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20  e and mark them 
185a0 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e  all.** as clean.
185b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
185c0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
185d0 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74  ist(PgHdr *pList
185e0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
185f0 65 72 3b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a  er;.  PgHdr *p;.
18600 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
18610 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
18620 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
18630 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e  pPager = pList->
18640 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74  pPager;..  /* At
18650 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
18660 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20  e may be either 
18670 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
18680 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
18690 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
186a0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
186b0 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45   is already an E
186c0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74  XCLUSIVE lock, t
186d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a  he following.  *
186e0 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
186f0 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e  e3OsLock() are n
18700 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  o-ops..  **.  **
18710 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b   Moving the lock
18720 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74   from RESERVED t
18730 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75  o EXCLUSIVE actu
18740 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f  ally involves go
18750 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ing.  ** through
18760 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65   an intermediate
18770 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20   state PENDING. 
18780 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b    A PENDING lock
18790 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20   prevents new.  
187a0 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20  ** readers from 
187b0 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65  attaching to the
187c0 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73   database but is
187d0 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f   unsufficient fo
187e0 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69  r us to.  ** wri
187f0 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66  te.  The idea of
18800 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
18810 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65  is to prevent ne
18820 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20  w readers from. 
18830 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68   ** coming in wh
18840 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20  ile we wait for 
18850 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73  existing readers
18860 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a   to clear..  **.
18870 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70    ** While the p
18880 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52  ager is in the R
18890 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
188a0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
188b0 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69  base file.  ** i
188c0 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  s unchanged and 
188d0 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20  we can rollback 
188e0 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
188f0 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20  o playback the. 
18900 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f   ** journal into
18910 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
18920 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e  tabase file.  On
18930 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e  ce we transition
18940 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49   to.  ** EXCLUSI
18950 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  VE, it means the
18960 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
18970 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20  as been changed 
18980 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b  and any rollback
18990 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69  .  ** will requi
189a0 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  re a journal pla
189b0 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63  yback..  */.  rc
189c0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
189d0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
189e0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
189f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18a00 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
18a10 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73   rc;.  }..  pLis
18a20 74 20 3d 20 73 6f 72 74 5f 70 61 67 65 6c 69 73  t = sort_pagelis
18a30 74 28 70 4c 69 73 74 29 3b 0a 20 20 66 6f 72 28  t(pList);.  for(
18a40 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
18a50 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73  >pDirty){.    as
18a60 73 65 72 74 28 20 70 2d 3e 64 69 72 74 79 20 29  sert( p->dirty )
18a70 3b 0a 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d  ;.    p->dirty =
18a80 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   0;.  }.  while(
18a90 20 70 4c 69 73 74 20 29 7b 0a 0a 20 20 20 20 2f   pList ){..    /
18aa0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61  * If the file ha
18ab0 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
18ac0 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
18ad0 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  ow. */.    if( !
18ae0 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
18af0 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 61 73  hods ){.      as
18b00 73 65 72 74 28 70 50 61 67 65 72 2d 3e 74 65 6d  sert(pPager->tem
18b10 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 63  pFile);.      rc
18b20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
18b30 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2d 3e  pentemp(pPager->
18b40 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 66 64  pVfs, pPager->fd
18b50 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
18b60 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
18b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 76 66 73       pPager->vfs
18b90 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
18ba0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
18bb0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
18bc0 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72  If there are dir
18bd0 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
18be0 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20  page cache with 
18bf0 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
18c00 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ater.    ** than
18c10 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
18c20 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65  his means sqlite
18c30 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 29  3PagerTruncate()
18c40 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
18c50 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
18c60 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
18c70 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
18c80 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
18c90 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
18ca0 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
18cb0 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
18cc0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69    */.    if( pLi
18cd0 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  st->pgno<=pPager
18ce0 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
18cf0 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
18d00 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28  pList->pgno-1)*(
18d10 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
18d20 53 69 7a 65 3b 0a 20 20 20 20 20 20 63 68 61 72  Size;.      char
18d30 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32   *pData = CODEC2
18d40 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54  (pPager, PGHDR_T
18d50 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70  O_DATA(pList), p
18d60 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a  List->pgno, 6);.
18d70 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
18d80 34 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65  4("STORE %d page
18d90 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
18da0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
18db0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
18dc0 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
18dd0 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
18de0 73 68 28 70 4c 69 73 74 29 29 3b 0a 20 20 20 20  sh(pList));.    
18df0 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
18e00 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
18e10 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  er, pList->pgno)
18e20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
18e30 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
18e40 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
18e50 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18e60 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
18e70 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
18e80 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
18e90 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  b_count);.      
18ea0 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
18eb0 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20  r->nWrite);.    
18ec0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
18ed0 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  o==1 ){.        
18ee0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
18ef0 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61  dbFileVers, &pDa
18f00 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70  ta[24], sizeof(p
18f10 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
18f20 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s));.      }.   
18f30 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
18f40 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
18f50 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4e    PAGERTRACE3("N
18f60 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
18f70 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
18f80 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
18f90 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  no);.    }.#endi
18fa0 66 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  f.    if( rc ) r
18fb0 65 74 75 72 6e 20 72 63 3b 0a 23 69 66 64 65 66  eturn rc;.#ifdef
18fc0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
18fd0 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  GES.    pList->p
18fe0 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
18ff0 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
19000 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73  .#endif.    pLis
19010 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
19020 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  y;.  }.  return 
19030 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
19040 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72  .** Collect ever
19050 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e 74  y dirty page int
19060 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20 61  o a dirty list a
19070 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70  nd.** return a p
19080 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
19090 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e  ad of that list.
190a0 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a    All pages are.
190b0 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65  ** collected eve
190c0 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73 74  n if they are st
190d0 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  ill in use..*/.s
190e0 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
190f0 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
19100 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70 50  _pages(Pager *pP
19110 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
19120 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a  pPager->pDirty;.
19130 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
19140 54 52 55 45 20 69 66 20 74 68 65 72 65 20 69 73  TRUE if there is
19150 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f   a hot journal o
19160 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
19170 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72  r..** A hot jour
19180 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20  nal is one that 
19190 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
191a0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ed back..**.** I
191b0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  f the current si
191c0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
191d0 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74  se file is 0 but
191e0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
191f0 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20  ** exists, that 
19200 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f  is probably an o
19210 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ld journal left 
19220 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  over from a prio
19230 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69  r.** database wi
19240 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
19250 2e 20 20 4a 75 73 74 20 64 65 6c 65 74 65 20 74  .  Just delete t
19260 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  he journal..*/.s
19270 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
19280 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
19290 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
192a0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
192b0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 66  ager->pVfs;.  if
192c0 28 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  ( !pPager->useJo
192d0 75 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 20 30  urnal ) return 0
192e0 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
192f0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70  OsAccess(pVfs, p
19300 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
19310 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
19320 58 49 53 54 53 29 20 29 7b 0a 20 20 20 20 72 65  XISTS) ){.    re
19330 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
19340 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  ( sqlite3OsCheck
19350 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61  ReservedLock(pPa
19360 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
19370 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
19380 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
19390 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
193a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
193b0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
193c0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
193d0 61 6c 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  al, 0);.    retu
193e0 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 0;.  }else{. 
193f0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
19400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
19410 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
19420 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20 63  the cache that c
19430 61 6e 20 62 65 20 72 65 63 79 63 6c 65 64 2e 20  an be recycled. 
19440 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
19450 69 6e 65 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ine may return S
19460 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
19470 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49  ITE_FULL or SQLI
19480 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f  TE_OK. It .** do
19490 65 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 70  es not set the p
194a0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 76  Pager->errCode v
194b0 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ariable..*/.stat
194c0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 63  ic int pager_rec
194d0 79 63 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  ycle(Pager *pPag
194e0 65 72 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67  er, PgHdr **ppPg
194f0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
19500 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20  .  *ppPg = 0;.. 
19510 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61   /* It is illega
19520 6c 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66  l to call this f
19530 75 6e 63 74 69 6f 6e 20 75 6e 6c 65 73 73 20 74  unction unless t
19540 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 0a  he pager object.
19550 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20    ** pointed to 
19560 62 79 20 70 50 61 67 65 72 20 68 61 73 20 61 74  by pPager has at
19570 20 6c 65 61 73 74 20 6f 6e 65 20 66 72 65 65 20   least one free 
19580 70 61 67 65 20 28 70 61 67 65 20 77 69 74 68 20  page (page with 
19590 6e 52 65 66 3d 3d 30 29 2e 0a 20 20 2a 2f 20 0a  nRef==0)..  */ .
195a0 20 20 61 73 73 65 72 74 28 21 4d 45 4d 44 42 29    assert(!MEMDB)
195b0 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
195c0 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29 3b 0a  r->lru.pFirst);.
195d0 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67  .  /* Find a pag
195e0 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54  e to recycle.  T
195f0 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ry to locate a p
19600 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
19610 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75  t.  ** require u
19620 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63  s to do an fsync
19630 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  () on the journa
19640 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20  l..  */.  pPg = 
19650 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
19660 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20  stSynced;..  /* 
19670 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20  If we could not 
19680 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61 74  find a page that
19690 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
196a0 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a  e an fsync().  *
196b0 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * on the journal
196c0 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63   file then fsync
196d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
196e0 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20 20  e.  This is a.  
196f0 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65  ** very slow ope
19700 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f  ration, so we wo
19710 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64  rk hard to avoid
19720 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69   it.  But someti
19730 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27  mes.  ** it can'
19740 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a  t be helped..  *
19750 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 26  /.  if( pPg==0 &
19760 26 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  & pPager->lru.pF
19770 69 72 73 74 29 7b 0a 20 20 20 20 69 6e 74 20 69  irst){.    int i
19780 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
19790 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
197a0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
197b0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79  .    int rc = sy
197c0 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
197d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
197e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
197f0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
19800 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
19810 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
19820 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
19830 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
19840 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
19850 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65  sync mode, write
19860 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68   a new journal h
19870 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 20  eader into the. 
19880 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
19890 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f  file. This is do
198a0 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72  ne to avoid ever
198b0 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75   modifying a jou
198c0 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65  rnal.      ** he
198d0 61 64 65 72 20 74 68 61 74 20 69 73 20 69 6e 76  ader that is inv
198e0 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c  olved in the rol
198f0 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74  lback of pages t
19900 68 61 74 20 68 61 76 65 0a 20 20 20 20 20 20 2a  hat have.      *
19910 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  * already been w
19920 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
19930 74 61 62 61 73 65 20 28 69 6e 20 63 61 73 65 20  tabase (in case 
19940 74 68 65 20 68 65 61 64 65 72 20 69 73 0a 20 20  the header is.  
19950 20 20 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77      ** trashed w
19960 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
19970 6c 64 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a  ld is updated)..
19980 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
19990 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
199a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
199b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
199c0 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 61  f > 0 );.      a
199d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
199e0 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  oNotSync==0 );. 
199f0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
19a00 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
19a10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
19a20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
19a30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
19a40 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d  .    }.    pPg =
19a50 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69   pPager->lru.pFi
19a60 72 73 74 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  rst;.  }..  asse
19a70 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  rt( pPg->nRef==0
19a80 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
19a90 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
19aa0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
19ab0 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20   it is dirty..  
19ac0 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  */.  if( pPg->di
19ad0 72 74 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  rty ){.    int r
19ae0 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
19af0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
19b00 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  );.    makeClean
19b10 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e  (pPg);.    pPg->
19b20 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70  dirty = 1;.    p
19b30 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
19b40 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
19b50 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70  rite_pagelist( p
19b60 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64  Pg );.    pPg->d
19b70 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  irty = 0;.    if
19b80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19b90 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
19ba0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
19bb0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
19bc0 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ty==0 );..  /* I
19bd0 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  f the page we ar
19be0 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d  e recycling is m
19bf0 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
19c00 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20  ollback, then.  
19c10 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61  ** set the globa
19c20 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  l alwaysRollback
19c30 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61   flag, thus disa
19c40 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73  bling the.  ** s
19c50 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
19c60 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69  ollback() optimi
19c70 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72  zation for the r
19c80 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e  est of this tran
19c90 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74  saction..  ** It
19ca0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
19cb0 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73 65   do this because
19cc0 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64   the page marked
19cd0 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a   alwaysRollback.
19ce0 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65    ** might be re
19cf0 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74 65  loaded at a late
19d00 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74 68  r time but at th
19d10 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27  at point we won'
19d20 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  t remember.  ** 
19d30 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b  that is was mark
19d40 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ed alwaysRollbac
19d50 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74  k.  This means t
19d60 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75  hat all pages mu
19d70 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65  st.  ** be marke
19d80 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
19d90 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e  ack from here on
19da0 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   out..  */.  if(
19db0 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
19dc0 62 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54 52  back ){.    IOTR
19dd0 41 43 45 28 28 22 41 4c 57 41 59 53 5f 52 4f 4c  ACE(("ALWAYS_ROL
19de0 4c 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  LBACK %p\n", pPa
19df0 67 65 72 29 29 0a 20 20 20 20 70 50 61 67 65 72  ger)).    pPager
19e00 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
19e10 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
19e20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70  Unlink the old p
19e30 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
19e40 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68  e list and the h
19e50 61 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  ash table.  */. 
19e60 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29   unlinkPage(pPg)
19e70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
19e80 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20 20 2a  >pgno==0 );..  *
19e90 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65  ppPg = pPg;.  re
19ea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19eb0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
19ec0 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
19ed0 41 4e 41 47 45 4d 45 4e 54 0a 2f 2a 0a 2a 2a 20  ANAGEMENT./*.** 
19ee0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
19ef0 20 63 61 6c 6c 65 64 20 74 6f 20 66 72 65 65 20   called to free 
19f00 73 75 70 65 72 66 6c 75 6f 75 73 20 64 79 6e 61  superfluous dyna
19f10 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
19f20 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64  d memory.** held
19f30 20 62 79 20 74 68 65 20 70 61 67 65 72 20 73 79   by the pager sy
19f40 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20  stem. Memory in 
19f50 75 73 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74  use by any SQLit
19f60 65 20 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65  e pager allocate
19f70 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72  d.** by the curr
19f80 65 6e 74 20 74 68 72 65 61 64 20 6d 61 79 20 62  ent thread may b
19f90 65 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  e sqlite3_free()
19fa0 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69  ed..**.** nReq i
19fb0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
19fc0 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
19fd0 72 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20 74  required. Once t
19fe0 68 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20  his much has.** 
19ff0 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20 74  been released, t
1a000 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
1a010 72 6e 73 2e 20 54 68 65 20 72 65 74 75 72 6e 20  rns. The return 
1a020 76 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f 74  value is the tot
1a030 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66  al number .** of
1a040 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
1a050 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 69 6e   released..*/.in
1a060 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
1a070 6c 65 61 73 65 4d 65 6d 6f 72 79 28 69 6e 74 20  leaseMemory(int 
1a080 6e 52 65 71 29 7b 0a 20 20 69 6e 74 20 6e 52 65  nReq){.  int nRe
1a090 6c 65 61 73 65 64 20 3d 20 30 3b 20 20 20 20 20  leased = 0;     
1a0a0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
1a0b0 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64   memory released
1a0c0 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 73 71 6c   so far */.  sql
1a0d0 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
1a0e0 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  x;       /* The 
1a0f0 4d 45 4d 32 20 6d 75 74 65 78 20 2a 2f 0a 20 20  MEM2 mutex */.  
1a100 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
1a110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a120 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1a130 70 61 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  pagers */.  int 
1a140 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1a150 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68  .  /* Acquire th
1a160 65 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d  e memory-managem
1a170 65 6e 74 20 6d 75 74 65 78 0a 20 20 2a 2f 0a 20  ent mutex.  */. 
1a180 20 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33   mutex = sqlite3
1a190 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
1a1a0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
1a1b0 5f 4d 45 4d 32 29 3b 0a 20 20 73 71 6c 69 74 65  _MEM2);.  sqlite
1a1c0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
1a1d0 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 67 6e  tex);..  /* Sign
1a1e0 61 6c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  al all database 
1a1f0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
1a200 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65   memory manageme
1a210 6e 74 20 77 61 6e 74 73 0a 20 20 2a 2a 20 74 6f  nt wants.  ** to
1a220 20 68 61 76 65 20 61 63 63 65 73 73 20 74 6f 20   have access to 
1a230 74 68 65 20 70 61 67 65 72 73 2e 0a 20 20 2a 2f  the pagers..  */
1a240 0a 20 20 66 6f 72 28 70 50 61 67 65 72 3d 73 71  .  for(pPager=sq
1a250 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 20  lite3PagerList; 
1a260 70 50 61 67 65 72 3b 20 70 50 61 67 65 72 3d 70  pPager; pPager=p
1a270 50 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  Pager->pNext){. 
1a280 20 20 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55      pPager->iInU
1a290 73 65 4d 4d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  seMM = 1;.  }.. 
1a2a0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
1a2b0 54 45 5f 4f 4b 20 26 26 20 28 6e 52 65 71 3c 30  TE_OK && (nReq<0
1a2c0 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52   || nReleased<nR
1a2d0 65 71 29 20 29 7b 0a 20 20 20 20 50 67 48 64 72  eq) ){.    PgHdr
1a2e0 20 2a 70 50 67 3b 0a 20 20 20 20 50 67 48 64 72   *pPg;.    PgHdr
1a2f0 20 2a 70 52 65 63 79 63 6c 65 64 3b 0a 20 0a 20   *pRecycled;. . 
1a300 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e     /* Try to fin
1a310 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79  d a page to recy
1a320 63 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  cle that does no
1a330 74 20 72 65 71 75 69 72 65 20 61 20 73 79 6e 63  t require a sync
1a340 28 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 74 68  (). If.    ** th
1a350 69 73 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  is is not possib
1a360 6c 65 2c 20 66 69 6e 64 20 6f 6e 65 20 74 68 61  le, find one tha
1a370 74 20 64 6f 65 73 20 72 65 71 75 69 72 65 20 61  t does require a
1a380 20 73 79 6e 63 28 29 2e 0a 20 20 20 20 2a 2f 0a   sync()..    */.
1a390 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1a3a0 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f  x_enter(sqlite3_
1a3b0 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
1a3c0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
1a3d0 4c 52 55 29 29 3b 0a 20 20 20 20 70 50 67 20 3d  LRU));.    pPg =
1a3e0 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c   sqlite3LruPageL
1a3f0 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64  ist.pFirstSynced
1a400 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67  ;.    while( pPg
1a410 20 26 26 20 28 70 50 67 2d 3e 6e 65 65 64 53 79   && (pPg->needSy
1a420 6e 63 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65  nc || pPg->pPage
1a430 72 2d 3e 69 49 6e 55 73 65 44 42 29 20 29 7b 0a  r->iInUseDB) ){.
1a440 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d        pPg = pPg-
1a450 3e 67 66 72 65 65 2e 70 4e 65 78 74 3b 0a 20 20  >gfree.pNext;.  
1a460 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 67    }.    if( !pPg
1a470 20 29 7b 0a 20 20 20 20 20 20 70 50 67 20 3d 20   ){.      pPg = 
1a480 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
1a490 73 74 2e 70 46 69 72 73 74 3b 0a 20 20 20 20 20  st.pFirst;.     
1a4a0 20 77 68 69 6c 65 28 20 70 50 67 20 26 26 20 70   while( pPg && p
1a4b0 50 67 2d 3e 70 50 61 67 65 72 2d 3e 69 49 6e 55  Pg->pPager->iInU
1a4c0 73 65 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  seDB ){.        
1a4d0 70 50 67 20 3d 20 70 50 67 2d 3e 67 66 72 65 65  pPg = pPg->gfree
1a4e0 2e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  .pNext;.      }.
1a4f0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1a500 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
1a510 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
1a520 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1a530 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 0a 20 20  TATIC_LRU));..  
1a540 20 20 2f 2a 20 49 66 20 70 50 67 3d 3d 30 2c 20    /* If pPg==0, 
1a550 74 68 65 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61  then the block a
1a560 62 6f 76 65 20 68 61 73 20 66 61 69 6c 65 64 20  bove has failed 
1a570 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 74  to find a page t
1a580 6f 0a 20 20 20 20 2a 2a 20 72 65 63 79 63 6c 65  o.    ** recycle
1a590 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72  . In this case r
1a5a0 65 74 75 72 6e 20 65 61 72 6c 79 20 2d 20 6e 6f  eturn early - no
1a5b0 20 66 75 72 74 68 65 72 20 6d 65 6d 6f 72 79 20   further memory 
1a5c0 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72  will.    ** be r
1a5d0 65 6c 65 61 73 65 64 2e 0a 20 20 20 20 2a 2f 0a  eleased..    */.
1a5e0 20 20 20 20 69 66 28 20 21 70 50 67 20 29 20 62      if( !pPg ) b
1a5f0 72 65 61 6b 3b 0a 0a 20 20 20 20 70 50 61 67 65  reak;..    pPage
1a600 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1a610 0a 20 20 20 20 61 73 73 65 72 74 28 21 70 50 67  .    assert(!pPg
1a620 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70 50  ->needSync || pP
1a630 67 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  g==pPager->lru.p
1a640 46 69 72 73 74 29 3b 0a 20 20 20 20 61 73 73 65  First);.    asse
1a650 72 74 28 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  rt(pPg->needSync
1a660 20 7c 7c 20 70 50 67 3d 3d 70 50 61 67 65 72 2d   || pPg==pPager-
1a670 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65  >lru.pFirstSynce
1a680 64 29 3b 0a 20 20 0a 20 20 20 20 72 63 20 3d 20  d);.  .    rc = 
1a690 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50  pager_recycle(pP
1a6a0 61 67 65 72 2c 20 26 70 52 65 63 79 63 6c 65 64  ager, &pRecycled
1a6b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 52  );.    assert(pR
1a6c0 65 63 79 63 6c 65 64 3d 3d 70 50 67 20 7c 7c 20  ecycled==pPg || 
1a6d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  rc!=SQLITE_OK);.
1a6e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1a6f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
1a700 2a 20 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20  * We've found a 
1a710 70 61 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74  page to free. At
1a720 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
1a730 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20  page has been . 
1a740 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64 20       ** removed 
1a750 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 68 61  from the page ha
1a760 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d 6c  sh-table, free-l
1a770 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64 2d 6c  ist and synced-l
1a780 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 28 70  ist .      ** (p
1a790 46 69 72 73 74 53 79 6e 63 65 64 29 2e 20 49 74  FirstSynced). It
1a7a0 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 74 68 65   is still in the
1a7b0 20 61 6c 6c 20 70 61 67 65 73 20 28 70 41 6c 6c   all pages (pAll
1a7c0 29 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 2a  ) list. .      *
1a7d0 2a 20 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  * Remove it from
1a7e0 20 74 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72   this list befor
1a7f0 65 20 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20  e freeing..     
1a800 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 6f 64   **.      ** Tod
1a810 6f 3a 20 43 68 65 63 6b 20 74 68 65 20 50 61 67  o: Check the Pag
1a820 65 72 2e 70 53 74 6d 74 20 6c 69 73 74 20 74 6f  er.pStmt list to
1a830 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20   make sure this 
1a840 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20  is Ok. It .     
1a850 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69 73 20   ** probably is 
1a860 74 68 6f 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f  though..      */
1a870 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 54  .      PgHdr *pT
1a880 6d 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  mp;.      assert
1a890 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20 69  ( pPg );.      i
1a8a0 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e  f( pPg==pPager->
1a8b0 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pAll ){.        
1a8c0 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
1a8d0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
1a8e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a8f0 20 20 20 20 66 6f 72 28 20 70 54 6d 70 3d 70 50      for( pTmp=pP
1a900 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70  ager->pAll; pTmp
1a910 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b  ->pNextAll!=pPg;
1a920 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78   pTmp=pTmp->pNex
1a930 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20 20 20 20  tAll ){}.       
1a940 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20   pTmp->pNextAll 
1a950 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
1a960 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
1a970 52 65 6c 65 61 73 65 64 20 2b 3d 20 28 0a 20 20  Released += (.  
1a980 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
1a990 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70  pPg) + pPager->p
1a9a0 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20  ageSize.        
1a9b0 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20    + sizeof(u32) 
1a9c0 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  + pPager->nExtra
1a9d0 0a 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d  .          + MEM
1a9e0 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74  DB*sizeof(PgHist
1a9f0 6f 72 79 29 20 0a 20 20 20 20 20 20 29 3b 0a 20  ory) .      );. 
1aa00 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
1aa10 47 46 52 45 45 20 25 70 20 25 64 20 2a 5c 6e 22  GFREE %p %d *\n"
1aa20 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
1aa30 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47  gno));.      PAG
1aa40 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
1aa50 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75  pager_pgfree_cou
1aa60 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
1aa70 65 33 5f 66 72 65 65 28 70 50 67 2d 3e 70 44 61  e3_free(pPg->pDa
1aa80 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ta);.      sqlit
1aa90 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20  e3_free(pPg);.  
1aaa0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
1aab0 65 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e--;.    }else{.
1aac0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f        /* An erro
1aad0 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74  r occured whilst
1aae0 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
1aaf0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72  database file or
1ab00 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
1ab10 61 6c 20 69 6e 20 70 61 67 65 72 5f 72 65 63 79  al in pager_recy
1ab20 63 6c 65 28 29 2e 20 54 68 65 20 65 72 72 6f 72  cle(). The error
1ab30 20 69 73 20 6e 6f 74 20 72 65 74 75 72 6e 65 64   is not returned
1ab40 20 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 2a   to the .      *
1ab50 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73  * caller of this
1ab60 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65   function. Inste
1ab70 61 64 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ad, set the Page
1ab80 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62  r.errCode variab
1ab90 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  le..      ** The
1aba0 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72   error will be r
1abb0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75  eturned to the u
1abc0 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69  ser (or users, i
1abd0 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20 20 20  n the case .    
1abe0 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72 65 64    ** of a shared
1abf0 20 70 61 67 65 72 20 63 61 63 68 65 29 20 6f 66   pager cache) of
1ac00 20 74 68 65 20 70 61 67 65 72 20 66 6f 72 20 77   the pager for w
1ac10 68 69 63 68 20 74 68 65 20 65 72 72 6f 72 20 6f  hich the error o
1ac20 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  ccured..      */
1ac30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 0a 20  .      assert(. 
1ac40 20 20 20 20 20 20 20 20 20 28 72 63 26 30 78 66           (rc&0xf
1ac50 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
1ac60 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 72 63   ||.          rc
1ac70 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
1ac80 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53  .          rc==S
1ac90 51 4c 49 54 45 5f 42 55 53 59 0a 20 20 20 20 20  QLITE_BUSY.     
1aca0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1acb0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1acc0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
1acd0 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  );.      pager_e
1ace0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
1acf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1ad00 2a 20 43 6c 65 61 72 20 74 68 65 20 6d 65 6d 6f  * Clear the memo
1ad10 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 66 6c  ry management fl
1ad20 61 67 73 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ags and release 
1ad30 74 68 65 20 6d 75 74 65 78 0a 20 20 2a 2f 0a 20  the mutex.  */. 
1ad40 20 66 6f 72 28 70 50 61 67 65 72 3d 73 71 6c 69   for(pPager=sqli
1ad50 74 65 33 50 61 67 65 72 4c 69 73 74 3b 20 70 50  te3PagerList; pP
1ad60 61 67 65 72 3b 20 70 50 61 67 65 72 3d 70 50 61  ager; pPager=pPa
1ad70 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ger->pNext){.   
1ad80 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65    pPager->iInUse
1ad90 4d 4d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  MM = 0;.  }.  sq
1ada0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1adb0 65 28 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  e(mutex);..  /* 
1adc0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1add0 72 20 6f 66 20 62 79 74 65 73 20 72 65 6c 65 61  r of bytes relea
1ade0 73 65 64 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  sed.  */.  retur
1adf0 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23  n nReleased;.}.#
1ae00 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1ae10 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
1ae20 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a  NAGEMENT */../*.
1ae30 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74  ** Read the cont
1ae40 65 6e 74 20 6f 66 20 70 61 67 65 20 70 50 67 20  ent of page pPg 
1ae50 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
1ae60 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ase file..*/.sta
1ae70 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61  tic int readDbPa
1ae80 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
1ae90 2c 20 50 67 48 64 72 20 2a 70 50 67 2c 20 50 67  , PgHdr *pPg, Pg
1aea0 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
1aeb0 72 63 3b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  rc;.  i64 offset
1aec0 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44  ;.  assert( MEMD
1aed0 42 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  B==0 );.  assert
1aee0 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
1aef0 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74  thods||pPager->t
1af00 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  empFile);.  if( 
1af10 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  !pPager->fd->pMe
1af20 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72 65 74  thods ){.    ret
1af30 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1af40 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
1af50 0a 20 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e  .  offset = (pgn
1af60 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
1af70 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 72 63  ->pageSize;.  rc
1af80 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
1af90 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48  (pPager->fd, PGH
1afa0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1afb0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1afc0 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 50 41  e, offset);.  PA
1afd0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1afe0 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
1aff0 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  unt);.  PAGER_IN
1b000 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
1b010 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50  );.  IOTRACE(("P
1b020 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
1b030 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
1b040 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
1b050 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
1b060 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
1b070 28 28 75 38 2a 29 50 47 48 44 52 5f 54 4f 5f 44  ((u8*)PGHDR_TO_D
1b080 41 54 41 28 70 50 67 29 29 5b 32 34 5d 2c 0a 20  ATA(pPg))[24],. 
1b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
1b0c0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1b0d0 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d 0a 20 20  leVers));.  }.  
1b0e0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 50  CODEC1(pPager, P
1b0f0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1b100 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  ), pPg->pgno, 3)
1b110 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28  ;.  PAGERTRACE4(
1b120 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  "FETCH %d page %
1b130 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
1b140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b150 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1b160 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65   pPg->pgno, page
1b170 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
1b180 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1b190 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
1b1a0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1b1b0 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 73   to obtain the s
1b1c0 68 61 72 65 64 20 6c 6f 63 6b 20 72 65 71 75 69  hared lock requi
1b1d0 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61  red before.** da
1b1e0 74 61 20 6d 61 79 20 62 65 20 72 65 61 64 20 66  ta may be read f
1b1f0 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
1b200 63 68 65 2e 20 49 66 20 74 68 65 20 73 68 61 72  che. If the shar
1b210 65 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65  ed lock has alre
1b220 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61  ady.** been obta
1b230 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ined, this funct
1b240 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
1b250 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c  **.** Immediatel
1b260 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e  y after obtainin
1b270 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  g the shared loc
1b280 6b 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c  k (if required),
1b290 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
1b2a0 2a 20 63 68 65 63 6b 73 20 66 6f 72 20 61 20 68  * checks for a h
1b2b0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ot-journal file.
1b2c0 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64   If one is found
1b2d0 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72  , an emergency r
1b2e0 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65  ollback.** is pe
1b2f0 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61 74  rformed immediat
1b300 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ely..*/.static i
1b310 6e 74 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f  nt pagerSharedLo
1b320 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
1b330 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1b340 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
1b350 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
1b360 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
1b370 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
1b380 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
1b390 56 66 73 3b 0a 20 20 20 20 69 66 28 20 21 4d 45  Vfs;.    if( !ME
1b3a0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 61 73 73  MDB ){.      ass
1b3b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
1b3c0 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  f==0 );.      if
1b3d0 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  ( !pPager->noRea
1b3e0 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  dlock ){.       
1b3f0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
1b400 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
1b410 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
1b420 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1b430 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b440 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
1b450 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
1b460 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc);.        }.
1b470 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1b480 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53  pPager->state>=S
1b490 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
1b4a0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f      }.  .      /
1b4b0 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  * If a journal f
1b4c0 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20  ile exists, and 
1b4d0 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45  there is no RESE
1b4e0 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
1b4f0 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
1b500 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
1b510 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
1b520 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
1b530 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
1b540 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 68    */.      if( h
1b550 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  asHotJournal(pPa
1b560 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
1b570 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
1b580 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1b590 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
1b5a0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
1b5b0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6d  is.        ** im
1b5c0 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
1b5d0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
1b5e0 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
1b5f0 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
1b600 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53         ** EXCLUS
1b610 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
1b620 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
1b630 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
1b640 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1b650 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
1b660 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
1b670 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
1b680 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
1b690 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
1b6a0 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
1b6b0 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
1b6c0 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
1b6d0 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20  olling it .     
1b6e0 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20     ** back..    
1b6f0 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20      ** .        
1b700 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
1b710 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
1b720 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
1b730 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a   requested, the.
1b740 20 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e          ** secon
1b750 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67  d process will g
1b760 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  et to this point
1b770 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
1b780 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20   fail to.       
1b790 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20   ** obtain it's 
1b7a0 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  own EXCLUSIVE lo
1b7b0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1b7c0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  se file..       
1b7d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
1b7e0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
1b7f0 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
1b800 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
1b810 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b820 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1b830 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
1b840 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1b850 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
1b860 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
1b870 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1b880 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
1b890 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
1b8a0 53 49 56 45 3b 0a 20 0a 20 20 20 20 20 20 20 20  SIVE;. .        
1b8b0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
1b8c0 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20  nal for reading 
1b8d0 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51  only.  Return SQ
1b8e0 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20  LITE_BUSY if.   
1b8f0 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75       ** we are u
1b900 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  nable to open th
1b910 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
1b920 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1b930 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e      ** The journ
1b940 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
1b950 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
1b960 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a  ed itself.  The.
1b970 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
1b980 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
1b990 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65   open unless the
1b9a0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
1b9b0 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20  ile holds.      
1b9c0 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63    ** a write loc
1b9d0 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  k, so there is n
1b9e0 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20  ever any chance 
1b9f0 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20  of two or more. 
1ba00 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
1ba10 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  ses opening the 
1ba20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73  journal at the s
1ba30 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ame time..      
1ba40 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1ba50 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
1ba60 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
1ba70 61 63 63 65 73 73 2e 20 54 68 69 73 20 69 73 20  access. This is 
1ba80 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20  because in .    
1ba90 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65      ** exclusive
1baa0 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65  -access mode the
1bab0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1bac0 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70   will be kept op
1bad0 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  en and.        *
1bae0 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20  * possibly used 
1baf0 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
1bb00 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73  n later on. On s
1bb10 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65  ome systems, the
1bb20 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 73 54 72  .        ** OsTr
1bb30 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73  uncate() call us
1bb40 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ed in exclusive-
1bb50 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f  access mode also
1bb60 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
1bb70 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74    ** a read/writ
1bb80 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20  e file handle.. 
1bb90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1bba0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
1bbb0 53 59 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  SY;.        if( 
1bbc0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1bbd0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
1bbe0 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
1bbf0 43 43 45 53 53 5f 45 58 49 53 54 53 29 20 29 7b  CCESS_EXISTS) ){
1bc00 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
1bc10 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  out = 0;.       
1bc20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53     int flags = S
1bc30 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1bc40 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
1bc50 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
1bc60 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1bc70 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
1bc80 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  le );.          
1bc90 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
1bca0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
1bcb0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
1bcc0 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 26  r->jfd, flags, &
1bcd0 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  fout);.         
1bce0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
1bcf0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
1bd00 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ->jfd->pMethods 
1bd10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1bd20 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45   fout&SQLITE_OPE
1bd30 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20  N_READONLY ){.  
1bd40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1bd50 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
1bd60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
1bd70 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
1bd80 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  fd);.          }
1bd90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1bda0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1bdb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1bdc0 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
1bdd0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1bde0 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
1bdf0 4c 49 54 45 5f 4e 4f 4d 45 4d 3f 72 63 3a 53 51  LITE_NOMEM?rc:SQ
1be00 4c 49 54 45 5f 42 55 53 59 29 3b 0a 20 20 20 20  LITE_BUSY);.    
1be10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
1be20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1be30 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  n = 1;.        p
1be40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
1be50 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  arted = 0;.     
1be60 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1be70 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
1be80 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
1be90 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
1bea0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1beb0 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20  lHdr = 0;. .    
1bec0 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
1bed0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
1bee0 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
1bef0 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
1bf00 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  .        ** lock
1bf10 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
1bf20 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20  he read lock..  
1bf30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1bf40 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
1bf50 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b  back(pPager, 1);
1bf60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1bf70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bf80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
1bf90 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
1bfa0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
1bfb0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
1bfc0 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d  (pPager->state==
1bfd0 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
1bfe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50  .            (pP
1bff0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
1c000 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ode && pPager->s
1c010 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45  tate>PAGER_SHARE
1c020 44 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  D).        );.  
1c030 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
1c040 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b   pPager->pAll ){
1c050 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1c060 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20  shared-lock has 
1c070 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72  just been acquir
1c080 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
1c090 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20  se file.        
1c0a0 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
1c0b0 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69   already pages i
1c0c0 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f  n the cache (fro
1c0d0 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  m a previous.   
1c0e0 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20       ** read or 
1c0f0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1c100 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  n).  Check to se
1c110 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
1c120 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73  e.        ** has
1c130 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
1c140 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1c150 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c   has changed, fl
1c160 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 20 20  ush the.        
1c170 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  ** cache..      
1c180 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1c190 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  Database changes
1c1a0 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20   is detected by 
1c1b0 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79  looking at 15 by
1c1c0 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  tes beginning.  
1c1d0 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73        ** at offs
1c1e0 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66  et 24 into the f
1c1f0 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20  ile.  The first 
1c200 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79  4 of these 16 by
1c210 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 20 20  tes are.        
1c220 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e  ** a 32-bit coun
1c230 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72  ter that is incr
1c240 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63  emented with eac
1c250 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20  h change.  The. 
1c260 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20         ** other 
1c270 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e  bytes change ran
1c280 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20  domly with each 
1c290 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e  file change when
1c2a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
1c2b0 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20  dec is in use.. 
1c2c0 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20         ** .     
1c2d0 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61     ** There is a
1c2e0 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
1c2f0 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61  ll chance that a
1c300 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74   change will not
1c310 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   be .        ** 
1c320 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63  detected.  The c
1c330 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65  hance of an unde
1c340 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73  tected change is
1c350 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20   so small that. 
1c360 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e         ** it can
1c370 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20   be neglected.. 
1c380 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1c390 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72    char dbFileVer
1c3a0 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s[sizeof(pPager-
1c3b0 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20  >dbFileVers)];. 
1c3c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1c3d0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1c3e0 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  ger);..        i
1c3f0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1c400 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  de ){.          
1c410 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
1c420 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  rrCode;.        
1c430 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  }..        if( p
1c440 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20  Pager->dbSize>0 
1c450 29 7b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  ){.          IOT
1c460 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70  RACE(("CKVERS %p
1c470 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1c480 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
1c490 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  s)));.          
1c4a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1c4b0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
1c4c0 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
1c4d0 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20  of(dbFileVers), 
1c4e0 32 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  24);.          i
1c4f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1c510 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1c520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1c530 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1c540 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72  memset(dbFileVer
1c550 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46  s, 0, sizeof(dbF
1c560 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
1c570 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
1c580 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d  ( memcmp(pPager-
1c590 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
1c5a0 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
1c5b0 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20  dbFileVers))!=0 
1c5c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67  ){.          pag
1c5d0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
1c5e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c5f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
1c600 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78  sert( pPager->ex
1c610 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
1c620 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41  Pager->state<=PA
1c630 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
1c640 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1c650 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
1c660 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
1c670 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
1c680 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20  _SHARED;.    }. 
1c690 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1c6a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
1c6b0 74 65 20 61 20 50 67 48 64 72 20 6f 62 6a 65 63  te a PgHdr objec
1c6c0 74 2e 20 20 20 45 69 74 68 65 72 20 63 72 65 61  t.   Either crea
1c6d0 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 6f 72 20  te a new one or 
1c6e0 72 65 75 73 65 0a 2a 2a 20 61 6e 20 65 78 69 73  reuse.** an exis
1c6f0 74 69 6e 67 20 6f 6e 65 20 74 68 61 74 20 69 73  ting one that is
1c700 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 69   not otherwise i
1c710 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  n use..**.** A n
1c720 65 77 20 50 67 48 64 72 20 73 74 72 75 63 74 75  ew PgHdr structu
1c730 72 65 20 69 73 20 63 72 65 61 74 65 64 20 69 66  re is created if
1c740 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
1c750 6f 77 69 6e 67 20 61 72 65 0a 2a 2a 20 74 72 75  owing are.** tru
1c760 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  e:.**.**     (1)
1c770 20 20 57 65 20 68 61 76 65 20 6e 6f 74 20 65 78    We have not ex
1c780 63 65 65 64 65 64 20 6f 75 72 20 6d 61 78 69 6d  ceeded our maxim
1c790 75 6d 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 63  um allocated cac
1c7a0 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20  he size.**      
1c7b0 20 20 20 20 61 73 20 73 65 74 20 62 79 20 74 68      as set by th
1c7c0 65 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f  e "PRAGMA cache_
1c7d0 73 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  size" command..*
1c7e0 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68  *.**     (2)  Th
1c7f0 65 72 65 20 61 72 65 20 6e 6f 20 75 6e 75 73 65  ere are no unuse
1c800 64 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20  d PgHdr objects 
1c810 61 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68 69  available at thi
1c820 73 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  s time..**.**   
1c830 20 20 28 33 29 20 20 54 68 69 73 20 69 73 20 61    (3)  This is a
1c840 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
1c850 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  base..**.**     
1c860 28 34 29 20 20 54 68 65 72 65 20 61 72 65 20 6e  (4)  There are n
1c870 6f 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20  o PgHdr objects 
1c880 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71 75  that do not requ
1c890 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ire a journal.**
1c8a0 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 73            file s
1c8b0 79 6e 63 20 61 6e 64 20 61 20 73 79 6e 63 20 6f  ync and a sync o
1c8c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1c8d0 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  le is currently.
1c8e0 2a 2a 20 20 20 20 20 20 20 20 20 20 70 72 6f 68  **          proh
1c8f0 69 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74  ibited..**.** Ot
1c900 68 65 72 77 69 73 65 2c 20 72 65 75 73 65 20 61  herwise, reuse a
1c910 6e 20 65 78 69 73 74 69 6e 67 20 50 67 48 64 72  n existing PgHdr
1c920 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1c930 73 2c 20 72 65 75 73 65 20 61 6e 0a 2a 2a 20 65  s, reuse an.** e
1c940 78 69 73 74 69 6e 67 20 50 67 48 64 72 20 69 66  xisting PgHdr if
1c950 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
1c960 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
1c970 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57  **.**     (1)  W
1c980 65 20 68 61 76 65 20 72 65 61 63 68 65 64 20 6f  e have reached o
1c990 72 20 65 78 63 65 65 64 65 64 20 74 68 65 20 6d  r exceeded the m
1c9a0 61 78 69 6d 75 6d 20 63 61 63 68 65 20 73 69 7a  aximum cache siz
1c9b0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c  e.**          al
1c9c0 6c 6f 77 65 64 20 62 79 20 22 50 52 41 47 4d 41  lowed by "PRAGMA
1c9d0 20 63 61 63 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a   cache_size"..**
1c9e0 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65  .**     (2)  The
1c9f0 72 65 20 69 73 20 61 20 50 67 48 64 72 20 61 76  re is a PgHdr av
1ca00 61 69 6c 61 62 6c 65 20 77 69 74 68 20 50 67 48  ailable with PgH
1ca10 64 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a  dr->nRef==0.**.*
1ca20 2a 20 20 20 20 20 28 33 29 20 20 57 65 20 61 72  *     (3)  We ar
1ca30 65 20 6e 6f 74 20 69 6e 20 61 6e 20 69 6e 2d 6d  e not in an in-m
1ca40 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a 2a  emory database.*
1ca50 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 45 69  *.**     (4)  Ei
1ca60 74 68 65 72 20 74 68 65 72 65 20 69 73 20 61 6e  ther there is an
1ca70 20 61 76 61 69 6c 61 62 6c 65 20 50 67 48 64 72   available PgHdr
1ca80 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
1ca90 65 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eed.**          
1caa0 74 6f 20 62 65 20 73 79 6e 63 65 64 20 74 6f 20  to be synced to 
1cab0 64 69 73 6b 20 6f 72 20 65 6c 73 65 20 64 69 73  disk or else dis
1cac0 6b 20 73 79 6e 63 69 6e 67 20 69 73 20 63 75 72  k syncing is cur
1cad0 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20  rently.**       
1cae0 20 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73     allowed..*/.s
1caf0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41  tatic int pagerA
1cb00 6c 6c 6f 63 61 74 65 50 61 67 65 28 50 61 67 65  llocatePage(Page
1cb10 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
1cb20 20 2a 2a 70 70 50 67 29 7b 0a 20 20 69 6e 74 20   **ppPg){.  int 
1cb30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1cb40 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1cb50 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 0a 20 20  void *pData;..  
1cb60 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  /* Create a new 
1cb70 50 67 48 64 72 20 69 66 20 61 6e 79 20 6f 66 20  PgHdr if any of 
1cb80 74 68 65 20 66 6f 75 72 20 63 6f 6e 64 69 74 69  the four conditi
1cb90 6f 6e 73 20 64 65 66 69 6e 65 64 20 0a 20 20 2a  ons defined .  *
1cba0 2a 20 61 62 6f 76 65 20 61 72 65 20 6d 65 74 3a  * above are met:
1cbb0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
1cbc0 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e  ->nPage<pPager->
1cbd0 6d 78 50 61 67 65 0a 20 20 20 7c 7c 20 70 50 61  mxPage.   || pPa
1cbe0 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3d  ger->lru.pFirst=
1cbf0 3d 30 20 0a 20 20 20 7c 7c 20 4d 45 4d 44 42 0a  =0 .   || MEMDB.
1cc00 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6c     || (pPager->l
1cc10 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  ru.pFirstSynced=
1cc20 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 64 6f  =0 && pPager->do
1cc30 4e 6f 74 53 79 6e 63 29 0a 20 20 29 7b 0a 20 20  NotSync).  ){.  
1cc40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50    if( pPager->nP
1cc50 61 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61  age>=pPager->nHa
1cc60 73 68 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  sh ){.      page
1cc70 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61  r_resize_hash_ta
1cc80 62 6c 65 28 70 50 61 67 65 72 2c 0a 20 20 20 20  ble(pPager,.    
1cc90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 61       pPager->nHa
1cca0 73 68 3c 32 35 36 20 3f 20 32 35 36 20 3a 20 70  sh<256 ? 256 : p
1ccb0 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a 32 29 3b  Pager->nHash*2);
1ccc0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
1ccd0 72 2d 3e 6e 48 61 73 68 3d 3d 30 20 29 7b 0a 20  r->nHash==0 ){. 
1cce0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1ccf0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1cd00 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c    goto pager_all
1cd10 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 20  ocate_out;.     
1cd20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67   }.    }.    pag
1cd30 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
1cd40 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74  .    pPg = sqlit
1cd50 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
1cd60 66 28 2a 70 50 67 29 20 2b 20 73 69 7a 65 6f 66  f(*pPg) + sizeof
1cd70 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e  (u32) + pPager->
1cd80 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20  nExtra.         
1cd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cda0 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f     + MEMDB*sizeo
1cdb0 66 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a  f(PgHistory) );.
1cdc0 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20      if( pPg ){. 
1cdd0 20 20 20 20 20 70 44 61 74 61 20 3d 20 73 71 6c       pData = sql
1cde0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61  ite3_malloc( pPa
1cdf0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  ger->pageSize );
1ce00 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61  .      if( pData
1ce10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
1ce20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 29  qlite3_free(pPg)
1ce30 3b 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20  ;.        pPg = 
1ce40 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1ce50 0a 20 20 20 20 70 61 67 65 72 45 6e 74 65 72 28  .    pagerEnter(
1ce60 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
1ce70 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPg==0 ){.     
1ce80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1ce90 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  EM;.      goto p
1cea0 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75  ager_allocate_ou
1ceb0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  t;.    }.    mem
1cec0 73 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a 65  set(pPg, 0, size
1ced0 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20 69  of(*pPg));.    i
1cee0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1cef0 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
1cf00 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
1cf10 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  er), 0, sizeof(P
1cf20 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20 20 20  gHistory));.    
1cf30 7d 0a 20 20 20 20 70 50 67 2d 3e 70 44 61 74 61  }.    pPg->pData
1cf40 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 70 50   = pData;.    pP
1cf50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
1cf60 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  er;.    pPg->pNe
1cf70 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e  xtAll = pPager->
1cf80 70 41 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 72  pAll;.    pPager
1cf90 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20  ->pAll = pPg;.  
1cfa0 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b    pPager->nPage+
1cfb0 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
1cfc0 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e 20 65 78  /* Recycle an ex
1cfd0 69 73 74 69 6e 67 20 70 61 67 65 20 77 69 74 68  isting page with
1cfe0 20 61 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e   a zero ref-coun
1cff0 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  t. */.    rc = p
1d000 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61  ager_recycle(pPa
1d010 67 65 72 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  ger, &pPg);.    
1d020 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
1d030 55 53 59 20 29 7b 0a 20 20 20 20 20 20 72 63 20  USY ){.      rc 
1d040 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  = SQLITE_IOERR_B
1d050 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20  LOCKED;.    }.  
1d060 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d070 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
1d080 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65  o pager_allocate
1d090 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
1d0a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d0b0 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  state>=SHARED_LO
1d0c0 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
1d0d0 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70  (pPg);.  }.  *pp
1d0e0 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72  Pg = pPg;..pager
1d0f0 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20  _allocate_out:. 
1d100 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d110 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77  *.** Make sure w
1d120 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74 65  e have the conte
1d130 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20  nt for a page.  
1d140 49 66 20 74 68 65 20 70 61 67 65 20 77 61 73 0a  If the page was.
1d150 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63  ** previously ac
1d160 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f  quired with noCo
1d170 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74  ntent==1, then t
1d180 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a  he content was.*
1d190 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69 7a  * just initializ
1d1a0 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74  ed to zeros inst
1d1b0 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65 61  ead of being rea
1d1c0 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20  d from disk..** 
1d1d0 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64 20  But now we need 
1d1e0 74 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f 66  the real data of
1d1f0 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d  f of disk.  So m
1d200 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20 68  ake sure we.** h
1d210 61 76 65 20 69 74 2e 20 20 52 65 61 64 20 69 74  ave it.  Read it
1d220 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f 74   in if we do not
1d230 20 68 61 76 65 20 69 74 20 61 6c 72 65 61 64 79   have it already
1d240 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d250 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e  pager_get_conten
1d260 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
1d270 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52 65   if( pPg->needRe
1d280 61 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ad ){.    int rc
1d290 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50   = readDbPage(pP
1d2a0 67 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c 20  g->pPager, pPg, 
1d2b0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1d2c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d2d0 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  K ){.      pPg->
1d2e0 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20  needRead = 0;.  
1d2f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1d300 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1d310 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1d320 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1d330 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e   Acquire a page.
1d340 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f  .**.** A read lo
1d350 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  ck on the disk f
1d360 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ile is obtained 
1d370 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70  when the first p
1d380 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e  age is acquired.
1d390 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c   .** This read l
1d3a0 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77  ock is dropped w
1d3b0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67  hen the last pag
1d3c0 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a  e is released..*
1d3d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1d3e0 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  e works for any 
1d3f0 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61  page number grea
1d400 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20  ter than 0.  If 
1d410 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1d420 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  file is smaller 
1d430 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
1d440 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f  ed page, then no
1d450 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20   actual disk.** 
1d460 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20  read occurs and 
1d470 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
1d480 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20   of the page is 
1d490 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a  initialized to.*
1d4a0 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68  * all zeros.  Th
1d4b0 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
1d4c0 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
1d4d0 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
1d4e0 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f  lized.** to zero
1d4f0 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  s the first time
1d500 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65   a page is loade
1d510 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  d into memory..*
1d520 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
1d530 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
1d540 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
1d550 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
1d560 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
1d570 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
1d580 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1d590 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
1d5a0 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
1d5b0 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
1d5c0 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42  agerLookup().  B
1d5d0 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
1d5e0 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74   and Lookup() at
1d5f0 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64  tempt.** to find
1d600 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69   a page in the i
1d610 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66  n-memory cache f
1d620 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61  irst.  If the pa
1d630 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
1d640 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  y.** in memory, 
1d650 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65  this routine goe
1d660 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61  s to disk to rea
1d670 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20  d it in whereas 
1d680 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  Lookup().** just
1d690 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
1d6a0 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
1d6b0 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
1d6c0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
1d6d0 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
1d6e0 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
1d6f0 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
1d700 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
1d710 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
1d720 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65  ince Lookup() ne
1d730 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
1d740 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
1d750 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
1d760 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
1d770 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
1d780 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c  noContent is fal
1d790 73 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e  se, the page con
1d7a0 74 65 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c  tents are actual
1d7b0 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  ly read from dis
1d7c0 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  k..** If noConte
1d7d0 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d  nt is true, it m
1d7e0 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
1d7f0 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74  not care about t
1d800 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  he contents.** o
1d810 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68  f the page at th
1d820 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e  is time, so do n
1d830 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65 61  ot do a disk rea
1d840 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  d.  Just fill in
1d850 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e   the.** page con
1d860 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 2e  tent with zeros.
1d870 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20 66    But mark the f
1d880 61 63 74 20 74 68 61 74 20 77 65 20 68 61 76 65  act that we have
1d890 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a 2a   not read the.**
1d8a0 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74 74   content by sett
1d8b0 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
1d8c0 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c 61  edRead flag.  La
1d8d0 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73  ter on, if .** s
1d8e0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1d8f0 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
1d900 74 68 69 73 20 70 61 67 65 20 6f 72 20 69 66 20  this page or if 
1d910 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  this routine is.
1d920 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20  ** called again 
1d930 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d  with noContent==
1d940 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  0, that means th
1d950 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69  at the content i
1d960 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20  s needed.** and 
1d970 74 68 65 20 64 69 73 6b 20 72 65 61 64 20 73 68  the disk read sh
1d980 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
1d990 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  at point..*/.sta
1d9a0 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 63 71  tic int pagerAcq
1d9b0 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70  uire(.  Pager *p
1d9c0 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
1d9d0 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
1d9e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d9f0 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
1da00 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
1da10 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
1da20 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
1da30 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
1da40 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
1da50 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
1da60 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74   */.  int noCont
1da70 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  ent       /* Do 
1da80 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69  not bother readi
1da90 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ng content from 
1daa0 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a  disk if true */.
1dab0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
1dac0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1dad0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1dae0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
1daf0 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65  K || pPager->nRe
1db00 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29  f>0 || pgno==1 )
1db10 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  ;..  /* The maxi
1db20 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20  mum page number 
1db30 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20  is 2^31. Return 
1db40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
1db50 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75  f a page.  ** nu
1db60 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
1db70 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c  n this, or zero,
1db80 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
1db90 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50   */.  if( pgno>P
1dba0 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c  AGER_MAX_PGNO ||
1dbb0 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
1dbc0 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
1dbd0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
1dbe0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1dbf0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
1dc00 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
1dc10 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61  e have not hit a
1dc20 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f  ny critical erro
1dc30 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65  rs..  */ .  asse
1dc40 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
1dc50 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
1dc60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1dc70 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
1dc80 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
1dc90 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74  _FULL ){.    ret
1dca0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
1dcb0 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ode;.  }..  /* I
1dcc0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1dcd0 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65  rst page accesse
1dce0 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48  d, then get a SH
1dcf0 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  ARED lock.  ** o
1dd00 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1dd10 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65 64  ile. pagerShared
1dd20 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  Lock() is a no-o
1dd30 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74  p if .  ** a dat
1dd40 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c  abase lock is al
1dd50 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f  ready held..  */
1dd60 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53 68 61  .  rc = pagerSha
1dd70 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b  redLock(pPager);
1dd80 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1dd90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
1dda0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
1ddb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1ddc0 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
1ddd0 20 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67   );..  pPg = pag
1dde0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
1ddf0 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
1de00 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
1de10 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
1de20 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ge is not in the
1de30 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a   page cache. */.
1de40 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20      int nMax;.  
1de50 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 50 41 47    int h;.    PAG
1de60 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1de70 6e 4d 69 73 73 29 3b 0a 20 20 20 20 72 63 20 3d  nMiss);.    rc =
1de80 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61   pagerAllocatePa
1de90 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 67 29  ge(pPager, &pPg)
1dea0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1deb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1dec0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ded0 7d 0a 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f  }..    pPg->pgno
1dee0 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73   = pgno;.    ass
1def0 65 72 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70  ert( !MEMDB || p
1df00 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 73 74 6d 74  gno>pPager->stmt
1df10 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20  Size );.    if( 
1df20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1df30 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c  al && (int)pgno<
1df40 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
1df50 69 7a 65 20 29 7b 0a 23 69 66 20 30 0a 20 20 20  ize ){.#if 0.   
1df60 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d     sqlite3CheckM
1df70 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49  emory(pPager->aI
1df80 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38  nJournal, pgno/8
1df90 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1dfa0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1dfb0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
1dfc0 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
1dfd0 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61  nal = (pPager->a
1dfe0 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38  InJournal[pgno/8
1dff0 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
1e000 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67  ))!=0;.      pPg
1e010 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
1e020 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e030 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1e040 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
1e050 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
1e060 20 20 7d 0a 0a 20 20 20 20 6d 61 6b 65 43 6c 65    }..    makeCle
1e070 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67  an(pPg);.    pPg
1e080 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
1e090 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20  REFINFO(pPg);.. 
1e0a0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b     pPager->nRef+
1e0b0 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  +;.    if( pPage
1e0c0 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20  r->nExtra>0 ){. 
1e0d0 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
1e0e0 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
1e0f0 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67  pPager), 0, pPag
1e100 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
1e110 20 7d 0a 20 20 20 20 6e 4d 61 78 20 3d 20 73 71   }.    nMax = sq
1e120 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1e130 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
1e140 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1e150 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Code ){.      sq
1e160 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1e170 70 50 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pPg);.      rc =
1e180 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1e190 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1e1a0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
1e1b0 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70 61   Populate the pa
1e1c0 67 65 20 77 69 74 68 20 64 61 74 61 2c 20 65 69  ge with data, ei
1e1d0 74 68 65 72 20 62 79 20 72 65 61 64 69 6e 67 20  ther by reading 
1e1e0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1e1f0 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f  e.    ** file, o
1e200 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  r by setting the
1e210 20 65 6e 74 69 72 65 20 70 61 67 65 20 74 6f 20   entire page to 
1e220 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  zero..    */.   
1e230 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70   if( nMax<(int)p
1e240 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20  gno || MEMDB || 
1e250 28 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70  (noContent && !p
1e260 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
1e270 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  lback) ){.      
1e280 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
1e290 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  >mxPgno ){.     
1e2a0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1e2b0 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
1e2c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e2d0 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20  _FULL;.      }. 
1e2e0 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
1e2f0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1e300 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
1e310 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  ize);.      pPg-
1e320 3e 6e 65 65 64 52 65 61 64 20 3d 20 6e 6f 43 6f  >needRead = noCo
1e330 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67 65 72  ntent && !pPager
1e340 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1e350 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
1e360 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c  ("ZERO %p %d\n",
1e370 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
1e380 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e390 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
1e3a0 65 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70  e(pPager, pPg, p
1e3b0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
1e3c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1e3d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
1e3e0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1e3f0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e          pPg->pgn
1e400 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  o = 0;.        s
1e410 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1e420 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
1e430 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1e440 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  }.      pPg->nee
1e450 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d  dRead = 0;.    }
1e460 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68  ..    /* Link th
1e470 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
1e480 70 61 67 65 20 68 61 73 68 20 74 61 62 6c 65 20  page hash table 
1e490 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f 20  */.    h = pgno 
1e4a0 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
1e4b0 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1);.    assert(
1e4c0 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20   pgno!=0 );.    
1e4d0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
1e4e0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
1e4f0 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  ];.    pPager->a
1e500 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
1e510 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
1e520 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61  tHash ){.      a
1e530 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
1e540 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
1e550 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67  ==0 );.      pPg
1e560 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
1e570 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
1e580 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
1e590 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1e5a0 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
1e5b0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
1e5c0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
1e5d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
1e5e0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
1e5f0 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65  e is in the page
1e600 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 61   cache. */.    a
1e610 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 52  ssert(pPager->nR
1e620 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29  ef>0 || pgno==1)
1e630 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ;.    PAGER_INCR
1e640 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a  (pPager->nHit);.
1e650 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65      if( !noConte
1e660 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nt ){.      rc =
1e670 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
1e680 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  nt(pPg);.      i
1e690 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1e6a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e6b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61    }.    }.    pa
1e6c0 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d  ge_ref(pPg);.  }
1e6d0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67  .  *ppPage = pPg
1e6e0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1e6f0 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
1e700 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
1e710 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1e720 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
1e730 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
1e740 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1e750 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
1e760 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
1e770 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
1e780 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
1e790 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
1e7a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1e7b0 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
1e7c0 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
1e7d0 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
1e7e0 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f  other reading co
1e7f0 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20  ntent from disk 
1e800 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
1e810 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45  int rc;.  pagerE
1e820 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
1e830 72 63 20 3d 20 70 61 67 65 72 41 63 71 75 69 72  rc = pagerAcquir
1e840 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  e(pPager, pgno, 
1e850 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  ppPage, noConten
1e860 74 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65  t);.  pagerLeave
1e870 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
1e880 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1e890 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
1e8a0 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
1e8b0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
1e8c0 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
1e8d0 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
1e8e0 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
1e8f0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1e900 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
1e910 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
1e920 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
1e930 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
1e940 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1e950 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
1e960 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
1e970 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
1e980 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
1e990 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
1e9a0 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
1e9b0 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
1e9c0 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
1e9d0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
1e9e0 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
1e9f0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1ea00 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
1ea10 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
1ea20 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
1ea30 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
1ea40 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
1ea50 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
1ea60 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
1ea70 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
1ea80 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
1ea90 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
1eaa0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
1eab0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
1eac0 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
1ead0 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ..  pagerEnter(p
1eae0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
1eaf0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
1eb00 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
1eb10 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1eb20 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50 61 67 65 72  ->pAll || pPager
1eb30 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
1eb40 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
1eb50 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
1eb60 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
1eb70 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
1eb80 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  {.    /* Do noth
1eb90 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ing */.  }else i
1eba0 66 28 20 28 70 50 67 20 3d 20 70 61 67 65 72 5f  f( (pPg = pager_
1ebb0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
1ebc0 67 6e 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gno))!=0 ){.    
1ebd0 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
1ebe0 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28   }.  pagerLeave(
1ebf0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
1ec00 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n pPg;.}../*.** 
1ec10 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a  Release a page..
1ec20 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
1ec30 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
1ec40 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
1ec50 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
1ec60 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
1ec70 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
1ec80 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
1ec90 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
1eca0 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
1ecb0 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
1ecc0 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
1ecd0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
1ece0 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
1ecf0 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  emoved..*/.int s
1ed00 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1ed10 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 0a  (DbPage *pPg){..
1ed20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
1ed30 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
1ed40 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  nt for this page
1ed50 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1ed60 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pPg->nRef>0 );. 
1ed70 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 67 2d   pagerEnter(pPg-
1ed80 3e 70 50 61 67 65 72 29 3b 0a 20 20 70 50 67 2d  >pPager);.  pPg-
1ed90 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e  >nRef--;.  REFIN
1eda0 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43 48 45 43  FO(pPg);..  CHEC
1edb0 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20  K_PAGE(pPg);..  
1edc0 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
1edd0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
1ede0 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68   to a page reach
1edf0 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a   0, call the.  *
1ee00 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64  * destructor and
1ee10 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f   add the page to
1ee20 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20   the freelist.. 
1ee30 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e   */.  if( pPg->n
1ee40 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61  Ref==0 ){.    Pa
1ee50 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1ee60 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 20 20  g->pPager;..    
1ee70 6c 72 75 4c 69 73 74 41 64 64 28 70 50 67 29 3b  lruListAdd(pPg);
1ee80 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1ee90 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a  >xDestructor ){.
1eea0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44        pPager->xD
1eeb0 65 73 74 72 75 63 74 6f 72 28 70 50 67 2c 20 70  estructor(pPg, p
1eec0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1eed0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
1eee0 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  * When all pages
1eef0 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c   reach the freel
1ef00 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65  ist, drop the re
1ef10 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20  ad lock from.   
1ef20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
1ef30 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
1ef40 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d    pPager->nRef--
1ef50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1ef60 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b  ager->nRef>=0 );
1ef70 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1ef80 3e 6e 52 65 66 3d 3d 30 20 26 26 20 28 21 70 50  >nRef==0 && (!pP
1ef90 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
1efa0 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  ode || pPager->j
1efb0 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a  ournalOff>0) ){.
1efc0 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63        pagerUnloc
1efd0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
1efe0 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
1eff0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 67    pagerLeave(pPg
1f000 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  ->pPager);.  ret
1f010 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f020 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
1f030 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1f040 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65  r pPager.  There
1f050 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
1f060 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  be a RESERVED.**
1f070 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
1f080 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1f090 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  se file when thi
1f0a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1f0b0 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  led..**.** Retur
1f0c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
1f0d0 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75  verything.  Retu
1f0e0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
1f0f0 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
1f100 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69  .** write lock i
1f110 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
1f120 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
1f130 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
1f140 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
1f150 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
1f160 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
1f170 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
1f180 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
1f190 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1f1a0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43  |SQLITE_OPEN_EXC
1f1b0 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50  LUSIVE|SQLITE_OP
1f1c0 45 4e 5f 43 52 45 41 54 45 29 3b 0a 0a 20 20 69  EN_CREATE);..  i
1f1d0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
1f1e0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
1f1f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1f200 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
1f210 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
1f220 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1f230 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  pen==0 );.  asse
1f240 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
1f250 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
1f260 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
1f270 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73  ournal==0 );.  s
1f280 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1f290 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
1f2a0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
1f2b0 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49  r);.  pPager->aI
1f2c0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
1f2d0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 50  e3MallocZero( pP
1f2e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
1f2f0 20 31 20 29 3b 0a 20 20 70 61 67 65 72 45 6e 74   1 );.  pagerEnt
1f300 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  er(pPager);.  if
1f310 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
1f320 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rnal==0 ){.    r
1f330 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1f340 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  ;.    goto faile
1f350 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
1f360 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  l;.  }..  if( pP
1f370 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1f380 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28  {.    flags |= (
1f390 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
1f3a0 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45  TEONCLOSE|SQLITE
1f3b0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
1f3c0 41 4c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  AL);.  }else{.  
1f3d0 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49    flags |= (SQLI
1f3e0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
1f3f0 52 4e 41 4c 29 3b 0a 20 20 7d 0a 23 69 66 64 65  RNAL);.  }.#ifde
1f400 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1f410 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 72  ATOMIC_WRITE.  r
1f420 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
1f430 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 70 56  alOpen(.      pV
1f440 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
1f450 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
1f460 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75  d, flags, jrnlBu
1f470 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
1f480 0a 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 72 63  .  );.#else.  rc
1f490 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
1f4a0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
1f4b0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
1f4c0 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b  >jfd, flags, 0);
1f4d0 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
1f4e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f4f0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e  || pPager->jfd->
1f500 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 70 50  pMethods );.  pP
1f510 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1f520 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
1f530 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
1f540 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1f550 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  Hdr = 0;.  if( r
1f560 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1f570 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f580 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
1f590 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
1f5a0 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
1f5b0 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
1f5c0 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 66 61 69    }.    goto fai
1f5d0 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
1f5e0 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  nal;.  }.  pPage
1f5f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
1f600 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   1;.  pPager->jo
1f610 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
1f620 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
1f630 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
1f640 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
1f650 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ck = 0;.  pPager
1f660 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66  ->nRec = 0;.  if
1f670 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1f680 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  e ){.    rc = pP
1f690 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1f6a0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
1f6b0 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
1f6c0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72    }.  pPager->or
1f6d0 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
1f6e0 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63  r->dbSize;..  rc
1f6f0 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
1f700 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  dr(pPager);..  i
1f710 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  f( pPager->stmtA
1f720 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53  utoopen && rc==S
1f730 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f740 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f750 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65  rStmtBegin(pPage
1f760 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  r);.  }.  if( rc
1f770 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
1f780 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
1f790 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
1f7a0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
1f7b0 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  n(pPager);.    i
1f7c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f7d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1f7e0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
1f7f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1f800 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  c;..failed_to_op
1f810 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71  en_journal:.  sq
1f820 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
1f830 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->aInJournal);.
1f840 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
1f850 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75  rnal = 0;.  retu
1f860 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f870 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Acquire a write-
1f880 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1f890 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20  base.  The lock 
1f8a0 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a  is removed when.
1f8b0 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68  ** the any of th
1f8c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70  e following happ
1f8d0 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73  en:.**.**   *  s
1f8e0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1f8f0 74 50 68 61 73 65 54 77 6f 28 29 20 69 73 20 63  tPhaseTwo() is c
1f900 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
1f910 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1f920 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ack() is called.
1f930 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
1f940 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20  PagerClose() is 
1f950 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
1f960 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1f970 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  f() is called to
1f980 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61   on every outsta
1f990 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nding page..**.*
1f9a0 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61  * The first para
1f9b0 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f  meter to this ro
1f9c0 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74  utine is a point
1f9d0 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70  er to any open p
1f9e0 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  age of the.** da
1f9f0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
1fa00 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62  thing changes ab
1fa10 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69  out the page - i
1fa20 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79  t is used merely
1fa30 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61   to.** acquire a
1fa40 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1fa50 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
1fa60 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61  and as proof tha
1fa70 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c  t there is.** al
1fa80 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
1fa90 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1faa0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  e..**.** The sec
1fab0 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e  ond parameter in
1fac0 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68  dicates how much
1fad0 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
1fae0 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61  to reserve for a
1faf0 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
1fb00 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20  al file-name at 
1fb10 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1fb20 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74   journal when it
1fb30 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a   is created..**.
1fb40 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** A journal fil
1fb50 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74  e is opened if t
1fb60 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  his is not a tem
1fb70 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f  porary file.  Fo
1fb80 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66  r temporary.** f
1fb90 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e  iles, the openin
1fba0 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g of the journal
1fbb0 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65   file is deferre
1fbc0 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73  d until there is
1fbd0 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65   an.** actual ne
1fbe0 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
1fbf0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
1fc00 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
1fc10 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73  e is already res
1fc20 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e  erved for writin
1fc30 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  g, this routine 
1fc40 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
1fc50 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74  * If exFlag is t
1fc60 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  rue, go ahead an
1fc70 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49  d get an EXCLUSI
1fc80 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  VE lock on the f
1fc90 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  ile.** immediate
1fca0 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61  ly instead of wa
1fcb0 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74  iting until we t
1fcc0 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20  ry to flush the 
1fcd0 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65  cache.  The.** e
1fce0 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64  xFlag is ignored
1fcf0 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
1fd00 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  n is already act
1fd10 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
1fd20 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 44 62  te3PagerBegin(Db
1fd30 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65  Page *pPg, int e
1fd40 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20  xFlag){.  Pager 
1fd50 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1fd60 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
1fd70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  = SQLITE_OK;.  p
1fd80 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
1fd90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
1fda0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73  ->nRef>0 );.  as
1fdb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1fdc0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
1fdd0 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
1fde0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1fdf0 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73  SHARED ){.    as
1fe00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
1fe10 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
1fe20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
1fe30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
1fe40 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
1fe50 55 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61  USIVE;.      pPa
1fe60 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1fe70 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
1fe80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1fe90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1fea0 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
1feb0 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
1fec0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1fed0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fee0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
1fef0 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52  te = PAGER_RESER
1ff00 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  VED;.        if(
1ff10 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
1ff20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1ff30 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
1ff40 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
1ff50 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OCK);.        }.
1ff60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1ff70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ff80 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
1ff90 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
1ffa0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1ffb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ffc0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1ffd0 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41  he = 0;.      PA
1ffe0 47 45 52 54 52 41 43 45 32 28 22 54 52 41 4e 53  GERTRACE2("TRANS
1fff0 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41  ACTION %d\n", PA
20000 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
20010 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
20020 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20  ->useJournal && 
20030 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
20040 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
20050 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
20060 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
20070 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
20080 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
20090 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70  journalOpen && p
200a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
200b0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
200c0 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
200d0 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
200e0 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
200f0 73 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20  ss mode last.   
20100 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64   ** time a (read
20110 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73   or write) trans
20120 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65  action was succe
20130 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65  ssfully conclude
20140 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73  d.    ** by this
20150 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73   connection. Ins
20160 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67  tead of deleting
20170 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
20180 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a  e it was .    **
20190 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 74   kept open and t
201a0 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79  runcated to 0 by
201b0 74 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tes..    */.    
201c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
201d0 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  nRec==0 );.    a
201e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f  ssert( pPager->o
201f0 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a  rigDbSize==0 );.
20200 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
20210 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
20220 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
20230 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
20240 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65  Pager);.    page
20250 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
20260 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
20270 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
20280 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 50 61 67  MallocZero( pPag
20290 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31  er->dbSize/8 + 1
202a0 20 29 3b 0a 20 20 20 20 70 61 67 65 72 45 6e 74   );.    pagerEnt
202b0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  er(pPager);.    
202c0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e  if( !pPager->aIn
202d0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
202e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
202f0 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
20300 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69       pPager->ori
20310 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
20320 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  ->dbSize;.      
20330 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
20340 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
20350 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
20360 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
20370 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72  alOpen || pPager
20380 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c  ->journalOff>0 |
20390 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc!=SQLITE_OK 
203a0 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
203b0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
203c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
203d0 61 6b 65 20 61 20 70 61 67 65 20 64 69 72 74 79  ake a page dirty
203e0 2e 20 20 53 65 74 20 69 74 73 20 64 69 72 74 79  .  Set its dirty
203f0 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69 74   flag and add it
20400 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a 2a   to the dirty.**
20410 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73   page list..*/.s
20420 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 44  tatic void makeD
20430 69 72 74 79 28 50 67 48 64 72 20 2a 70 50 67 29  irty(PgHdr *pPg)
20440 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  {.  if( pPg->dir
20450 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67  ty==0 ){.    Pag
20460 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
20470 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50  ->pPager;.    pP
20480 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20  g->dirty = 1;.  
20490 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
204a0 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a  pPager->pDirty;.
204b0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
204c0 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  pDirty ){.      
204d0 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e  pPager->pDirty->
204e0 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67  pPrevDirty = pPg
204f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
20500 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 30 3b  >pPrevDirty = 0;
20510 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
20520 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d  rty = pPg;.  }.}
20530 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70  ../*.** Make a p
20540 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61  age clean.  Clea
20550 72 20 69 74 73 20 64 69 72 74 79 20 62 69 74 20  r its dirty bit 
20560 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66 72  and remove it fr
20570 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20  om the.** dirty 
20580 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  page list..*/.st
20590 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c  atic void makeCl
205a0 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ean(PgHdr *pPg){
205b0 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
205c0 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69  y ){.    pPg->di
205d0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rty = 0;.    if(
205e0 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a   pPg->pDirty ){.
205f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
20600 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76  g->pDirty->pPrev
20610 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20  Dirty==pPg );.  
20620 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 2d      pPg->pDirty-
20630 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50  >pPrevDirty = pP
20640 67 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a 20  g->pPrevDirty;. 
20650 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
20660 2d 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b 0a  ->pPrevDirty ){.
20670 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
20680 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70  g->pPrevDirty->p
20690 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20  Dirty==pPg );.  
206a0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69      pPg->pPrevDi
206b0 72 74 79 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  rty->pDirty = pP
206c0 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  g->pDirty;.    }
206d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
206e0 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d  rt( pPg->pPager-
206f0 3e 70 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a  >pDirty==pPg );.
20700 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
20710 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d  r->pDirty = pPg-
20720 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  >pDirty;.    }. 
20730 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   }.}.../*.** Mar
20740 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73  k a data page as
20750 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65   writeable.  The
20760 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
20770 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
20780 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e  l .** if it is n
20790 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
207a0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
207b0 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
207c0 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20  efore making.** 
207d0 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
207e0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
207f0 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
20800 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
20810 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65  the pager create
20820 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e  s a new.** journ
20830 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  al and acquires 
20840 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
20850 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
20860 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56 45    If the RESERVE
20870 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20  D.** lock could 
20880 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c  not be acquired,
20890 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
208a0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53  turns SQLITE_BUS
208b0 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  Y.  The.** calli
208c0 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  ng routine must 
208d0 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72  check for that r
208e0 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20  eturn value and 
208f0 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  be careful not t
20900 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20  o.** change any 
20910 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20  page data until 
20920 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
20930 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
20940 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
20950 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20  rnal file could 
20960 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
20970 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20  ecause the disk 
20980 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e  is full,.** then
20990 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
209a0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c  turns SQLITE_FUL
209b0 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d  L and does an im
209c0 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b  mediate rollback
209d0 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75  ..** All subsequ
209e0 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70  ent write attemp
209f0 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53  ts also return S
20a00 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c  QLITE_FULL until
20a10 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63   there.** is a c
20a20 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
20a30 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73  gerCommit() or s
20a40 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
20a50 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65  ack() to.** rese
20a60 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20a70 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48   pager_write(PgH
20a80 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64  dr *pPg){.  void
20a90 20 2a 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f   *pData = PGHDR_
20aa0 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
20ab0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
20ac0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
20ad0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20ae0 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  K;..  /* Check f
20af0 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20  or errors.  */. 
20b00 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
20b10 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74  Code ){ .    ret
20b20 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
20b30 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
20b40 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
20b50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
20b60 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a  LITE_PERM;.  }..
20b70 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
20b80 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a  r->setMaster );.
20b90 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
20ba0 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  g);..  /* If thi
20bb0 73 20 70 61 67 65 20 77 61 73 20 70 72 65 76 69  s page was previ
20bc0 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77  ously acquired w
20bd0 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31  ith noContent==1
20be0 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a  , that means.  *
20bf0 2a 20 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c  * we didn't real
20c00 6c 79 20 72 65 61 64 20 69 6e 20 74 68 65 20 63  ly read in the c
20c10 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
20c20 67 65 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61  ge.  This can ha
20c30 70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65  ppen.  ** (for e
20c40 78 61 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65  xample) when the
20c50 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d   page is being m
20c60 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
20c70 6c 69 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20  list.  But.  ** 
20c80 6e 6f 77 20 77 65 20 61 72 65 20 28 70 65 72 68  now we are (perh
20c90 61 70 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20  aps) moving the 
20ca0 70 61 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20  page off of the 
20cb0 66 72 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a  freelist for.  *
20cc0 2a 20 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e  * reuse and we n
20cd0 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20  eed to know its 
20ce0 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74  original content
20cf0 20 73 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74   so that content
20d00 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f  .  ** can be sto
20d10 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  red in the rollb
20d20 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f  ack journal.  So
20d30 20 64 6f 20 74 68 65 20 72 65 61 64 20 61 74 20   do the read at 
20d40 74 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a  this.  ** time..
20d50 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
20d60 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50  r_get_content(pP
20d70 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  g);.  if( rc ){.
20d80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
20d90 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
20da0 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e  e page as dirty.
20db0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61    If the page ha
20dc0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
20dd0 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
20de0 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20  he journal then 
20df0 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69  we can return ri
20e00 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
20e10 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b   makeDirty(pPg);
20e20 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f  .  if( pPg->inJo
20e30 75 72 6e 61 6c 20 26 26 20 28 70 61 67 65 49 6e  urnal && (pageIn
20e40 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 7c  Statement(pPg) |
20e50 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  | pPager->stmtIn
20e60 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70  Use==0) ){.    p
20e70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
20e80 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 1;.  }else{.
20e90 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65  .    /* If we ge
20ea0 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
20eb0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
20ec0 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  ge needs to be. 
20ed0 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f     ** written to
20ee0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
20ef0 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
20f00 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  ckeckpoint journ
20f10 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  al.    ** or bot
20f20 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  h..    **.    **
20f30 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
20f40 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61  see that the tra
20f50 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
20f60 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20   exists and.    
20f70 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20  ** create it if 
20f80 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20  it does not..   
20f90 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
20fa0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
20fb0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
20fc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
20fd0 61 67 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30  agerBegin(pPg, 0
20fe0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
20ff0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21000 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
21010 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
21020 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
21030 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
21040 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
21050 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20  >journalOpen && 
21060 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
21070 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
21080 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
21090 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
210a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
210b0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
210c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
210d0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
210e0 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67  nalOpen || !pPag
210f0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
21100 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  ;.    pPager->di
21110 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
21120 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e  .    /* The tran
21130 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
21140 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77  now exists and w
21150 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45  e have a RESERVE
21160 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D or an.    ** E
21170 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
21180 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
21190 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  se file.  Write 
211a0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
211b0 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74   to.    ** the t
211c0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
211d0 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  al if it is not 
211e0 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
211f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
21200 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
21210 20 28 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75   (pPager->useJou
21220 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29  rnal || MEMDB) )
21230 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 74  {.      if( (int
21240 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
21250 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
21260 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
21270 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
21280 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
21290 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
212a0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
212b0 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  ;.          PAGE
212c0 52 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c  RTRACE3("JOURNAL
212d0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
212e0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
212f0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
21300 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
21310 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29  Hist->pOrig==0 )
21320 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73  ;.          pHis
21330 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74  t->pOrig = sqlit
21340 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65  e3_malloc( pPage
21350 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  r->pageSize );. 
21360 20 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69           if( pHi
21370 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20  st->pOrig ){.   
21380 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
21390 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47  pHist->pOrig, PG
213a0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
213b0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
213c0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ze);.          }
213d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
213e0 20 20 20 20 20 20 20 20 20 20 75 33 32 20 63 6b            u32 ck
213f0 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 63  sum;.          c
21400 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20  har *pData2;..  
21410 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68          /* We sh
21420 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65  ould never write
21430 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
21440 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68  file the page th
21450 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  at.          ** 
21460 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
21470 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68  abase locks.  Th
21480 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
21490 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20  rt verifies.    
214a0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
214b0 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20   do not. */.    
214c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
214d0 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  g->pgno!=PAGER_M
214e0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
214f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 61 74  ;.          pDat
21500 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67  a2 = CODEC2(pPag
21510 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
21520 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
21530 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65      cksum = page
21540 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
21550 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20  (u8*)pData2);.  
21560 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
21570 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
21580 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
21590 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70  urnalOff, pPg->p
215a0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
215b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
215c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
215d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
215e0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
215f0 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
21600 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
21610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21620 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
21630 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
21640 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   4);.           
21650 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21660 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  Off += pPager->p
21670 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20  ageSize+4;.     
21680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
21690 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
216a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
216b0 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
216c0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
216d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
216e0 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20  ff, cksum);.    
216f0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
21700 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b  journalOff += 4;
21710 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21720 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
21730 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64  "JOUT %p %d %lld
21740 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
21750 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
21760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
21770 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21780 66 2c 20 73 7a 50 67 29 29 3b 0a 20 20 20 20 20  f, szPg));.     
21790 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
217a0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
217b0 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  itej_count);.   
217c0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
217d0 45 35 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E5("JOURNAL %d p
217e0 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
217f0 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
21800 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21810 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
21820 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  , pPg->pgno, pPg
21830 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 61 67 65  ->needSync, page
21840 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
21850 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
21860 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  An error has occ
21870 75 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20  ured writing to 
21880 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
21890 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 20  . The .         
218a0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
218b0 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62  will be rolled b
218c0 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72  ack by the layer
218d0 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20   above..        
218e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
218f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21900 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21910 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
21920 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
21930 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
21940 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
21950 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
21960 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
21970 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
21980 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
21990 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
219a0 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
219b0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
219c0 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e  ync = !pPager->n
219d0 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20  oSync;.         
219e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
219f0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
21a00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
21a10 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
21a20 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
21a30 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20  gno&7);.        
21a40 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
21a50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21a60 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
21a70 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72   = !pPager->jour
21a80 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70  nalStarted && !p
21a90 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
21aa0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
21ab0 45 34 28 22 41 50 50 45 4e 44 20 25 64 20 70 61  E4("APPEND %d pa
21ac0 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
21ad0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
21ae0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
21af0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
21b00 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29  , pPg->needSync)
21b10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21b20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
21b30 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  c ){.        pPa
21b40 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
21b50 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
21b60 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
21b70 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  = 1;.    }.  .  
21b80 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
21b90 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
21ba0 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
21bb0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c  ge is not in it,
21bc0 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69  .    ** then wri
21bd0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
21be0 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  age to the state
21bf0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e  ment journal.  N
21c00 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ote that.    ** 
21c10 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
21c20 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66  urnal format dif
21c30 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74  fers from the st
21c40 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66  andard journal f
21c50 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20  ormat.    ** in 
21c60 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68  that it omits th
21c70 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20  e checksums and 
21c80 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20  the header..    
21c90 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
21ca0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20 20  r->stmtInUse .  
21cb0 20 20 20 26 26 20 21 70 61 67 65 49 6e 53 74 61     && !pageInSta
21cc0 74 65 6d 65 6e 74 28 70 50 67 29 20 0a 20 20 20  tement(pPg) .   
21cd0 20 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70    && (int)pPg->p
21ce0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
21cf0 74 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20  tSize .    ){.  
21d00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
21d10 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69  >inJournal || (i
21d20 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  nt)pPg->pgno>pPa
21d30 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
21d40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d  );.      if( MEM
21d50 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  DB ){.        Pg
21d60 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
21d70 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
21d80 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
21d90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69       assert( pHi
21da0 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a  st->pStmt==0 );.
21db0 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
21dc0 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Stmt = sqlite3_m
21dd0 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 70  alloc( pPager->p
21de0 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
21df0 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53     if( pHist->pS
21e00 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tmt ){.         
21e10 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70   memcpy(pHist->p
21e20 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44  Stmt, PGHDR_TO_D
21e30 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
21e40 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
21e50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50       }.        P
21e60 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54  AGERTRACE3("STMT
21e70 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
21e80 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
21e90 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
21ea0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67  no);.        pag
21eb0 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
21ec0 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  st(pPg);.      }
21ed0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36  else{.        i6
21ee0 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65  4 offset = pPage
21ef0 72 2d 3e 73 74 6d 74 4e 52 65 63 2a 28 34 2b 70  r->stmtNRec*(4+p
21f00 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
21f10 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
21f20 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28  pData2 = CODEC2(
21f30 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
21f40 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20  Pg->pgno, 7);.  
21f50 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
21f60 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73  32bits(pPager->s
21f70 74 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67  tfd, offset, pPg
21f80 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
21f90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21fa0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
21fb0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
21fc0 69 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64  ite(pPager->stfd
21fd0 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
21fe0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
21ff0 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  et+4);.        }
22000 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
22010 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE3("STMT-JOURN
22020 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
22030 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
22040 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
22050 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
22060 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22070 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
22080 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22090 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
220a0 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Rec++;.        a
220b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
220c0 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20  InStmt!=0 );.   
220d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
220e0 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
220f0 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
22100 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20  no&7);.      }. 
22110 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
22120 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
22130 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75  se size and retu
22140 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  rn..  */.  asser
22150 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
22160 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
22170 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
22180 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d  dbSize<(int)pPg-
22190 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
221a0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
221b0 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28  g->pgno;.    if(
221c0 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
221d0 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49  r->dbSize==PENDI
221e0 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e  NG_BYTE/pPager->
221f0 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
22200 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
22210 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
22220 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22230 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
22240 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 72  n is used to mar
22250 6b 20 61 20 64 61 74 61 2d 70 61 67 65 20 61 73  k a data-page as
22260 20 77 72 69 74 61 62 6c 65 2e 20 49 74 20 75 73   writable. It us
22270 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72 69  es .** pager_wri
22280 74 65 28 29 20 74 6f 20 6f 70 65 6e 20 61 20 6a  te() to open a j
22290 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20  ournal file (if 
222a0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
222b0 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20 77  y open).** and w
222c0 72 69 74 65 20 74 68 65 20 70 61 67 65 20 2a 70  rite the page *p
222d0 44 61 74 61 20 74 6f 20 74 68 65 20 6a 6f 75 72  Data to the jour
222e0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  nal..**.** The d
222f0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
22300 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
22310 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28  and pager_write(
22320 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
22330 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20  * function also 
22340 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73  deals with the s
22350 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
22360 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  e 2 or more page
22370 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69  s.** fit on a si
22380 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
22390 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
223a0 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70  ll co-resident p
223b0 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76  ages.** must hav
223c0 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
223d0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
223e0 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  le before return
223f0 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
22400 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62  te3PagerWrite(Db
22410 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a  Page *pDbPage){.
22420 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22430 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a  E_OK;..  PgHdr *
22440 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  pPg = pDbPage;. 
22450 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
22460 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
22470 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63  Pgno nPagePerSec
22480 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73  tor = (pPager->s
22490 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72  ectorSize/pPager
224a0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
224b0 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
224c0 72 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42  r);.  if( !MEMDB
224d0 20 26 26 20 6e 50 61 67 65 50 65 72 53 65 63 74   && nPagePerSect
224e0 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f  or>1 ){.    Pgno
224f0 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20   nPageCount;    
22500 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
22510 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
22520 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
22530 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b  */.    Pgno pg1;
22540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22550 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f   /* First page o
22560 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
22570 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20   is located on. 
22580 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
22590 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
225a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
225b0 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ges starting at 
225c0 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  pg1 to journal *
225d0 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
225e0 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
225f0 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   0;..    /* Set 
22600 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c  the doNotSync fl
22610 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73  ag to 1. This is
22620 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e   because we cann
22630 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e  ot allow a journ
22640 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72  al.    ** header
22650 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62   to be written b
22660 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73  etween the pages
22670 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68   journaled by th
22680 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  is function..   
22690 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
226a0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
226b0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  c==0 );.    pPag
226c0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20  er->doNotSync = 
226d0 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  1;..    /* This 
226e0 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68  trick assumes th
226f0 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65  at both the page
22700 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
22710 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a  -size are.    **
22720 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65   an integer powe
22730 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20  r of 2. It sets 
22740 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20  variable pg1 to 
22750 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20  the identifier. 
22760 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72     ** of the fir
22770 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
22780 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
22790 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ated on..    */.
227a0 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d      pg1 = ((pPg-
227b0 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61  >pgno-1) & ~(nPa
227c0 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20  gePerSector-1)) 
227d0 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43  + 1;..    nPageC
227e0 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65 33 50 61  ount = sqlite3Pa
227f0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
22800 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ger);.    if( pP
22810 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75  g->pgno>nPageCou
22820 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
22830 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d  e = (pPg->pgno -
22840 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c   pg1)+1;.    }el
22850 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67  se if( (pg1+nPag
22860 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50  ePerSector-1)>nP
22870 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
22880 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43    nPage = nPageC
22890 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20  ount+1-pg1;.    
228a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
228b0 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63  ge = nPagePerSec
228c0 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
228d0 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a  ssert(nPage>0);.
228e0 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d      assert(pg1<=
228f0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
22900 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67  assert((pg1+nPag
22910 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a  e)>pPg->pgno);..
22920 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
22930 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51  <nPage && rc==SQ
22940 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a  LITE_OK; ii++){.
22950 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20        Pgno pg = 
22960 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67  pg1+ii;.      Pg
22970 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  Hdr *pPage;.    
22980 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 61    if( !pPager->a
22990 49 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 67 3d  InJournal || pg=
229a0 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 0a 20  =pPg->pgno || . 
229b0 20 20 20 20 20 20 20 20 20 70 67 3e 70 50 61 67           pg>pPag
229c0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 7c  er->origDbSize |
229d0 7c 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  | !(pPager->aInJ
229e0 6f 75 72 6e 61 6c 5b 70 67 2f 38 5d 26 28 31 3c  ournal[pg/8]&(1<
229f0 3c 28 70 67 26 37 29 29 29 0a 20 20 20 20 20 20  <(pg&7))).      
22a00 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ) {.        if( 
22a10 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  pg!=PAGER_MJ_PGN
22a20 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
22a30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
22a40 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
22a50 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b  er, pg, &pPage);
22a60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
22a70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22a80 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
22a90 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61   pager_write(pPa
22aa0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
22ab0 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 65 65 64   if( pPage->need
22ac0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
22ad0 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
22ae0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
22af0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
22b00 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
22b10 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
22b20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
22b30 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
22b40 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  Page = pager_loo
22b50 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29 29  kup(pPager, pg))
22b60 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
22b70 70 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20  pPage->needSync 
22b80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65  ){.          nee
22b90 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
22ba0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22bb0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
22bc0 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
22bd0 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72   flag is set for
22be0 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67   any of the nPag
22bf0 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  e pages .    ** 
22c00 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c  starting at pg1,
22c10 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74   then it needs t
22c20 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c  o be set for all
22c30 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73   of them. Becaus
22c40 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67  e.    ** writing
22c50 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65   to any of these
22c60 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61 79   nPage pages may
22c70 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65   damage the othe
22c80 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a  rs, the.    ** j
22c90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
22ca0 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65   contain sync()e
22cb0 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20  d copies of all 
22cc0 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62  of them.    ** b
22cd0 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65  efore any of the
22ce0 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  m can be written
22cf0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
22d00 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
22d10 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79  /.    if( needSy
22d20 6e 63 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  nc ){.      for(
22d30 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26  ii=0; ii<nPage &
22d40 26 20 6e 65 65 64 53 79 6e 63 3b 20 69 69 2b 2b  & needSync; ii++
22d50 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72  ){.        PgHdr
22d60 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f   *pPage = pager_
22d70 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
22d80 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20  g1+ii);.        
22d90 69 66 28 20 70 50 61 67 65 20 29 20 70 50 61 67  if( pPage ) pPag
22da0 65 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  e->needSync = 1;
22db0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
22dc0 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65  ssert(pPager->ne
22dd0 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a  edSync);.    }..
22de0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
22df0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31  er->doNotSync==1
22e00 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
22e10 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20  doNotSync = 0;. 
22e20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
22e30 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62   pager_write(pDb
22e40 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 61 67  Page);.  }.  pag
22e50 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
22e60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22e70 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
22e80 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67  UE if the page g
22e90 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
22ea0 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75  ment was previou
22eb0 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f  sly passed.** to
22ec0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
22ed0 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20  te().  In other 
22ee0 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
22ef0 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a  UE if it is ok.*
22f00 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
22f10 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
22f20 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  age..*/.#ifndef 
22f30 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  NDEBUG.int sqlit
22f40 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
22f50 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  le(DbPage *pPg){
22f60 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64  .  return pPg->d
22f70 69 72 74 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  irty;.}.#endif..
22f80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22f90 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  MIT_VACUUM./*.**
22fa0 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e   Replace the con
22fb0 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65  tent of a single
22fc0 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20 69   page with the i
22fd0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
22fe0 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d  e third.** argum
22ff0 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
23000 74 65 33 50 61 67 65 72 4f 76 65 72 77 72 69 74  te3PagerOverwrit
23010 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
23020 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64   Pgno pgno, void
23030 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
23040 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
23050 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  ;..  pagerEnter(
23060 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20  pPager);.  rc = 
23070 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
23080 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
23090 50 67 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  Pg);.  if( rc==S
230a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
230b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
230c0 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20  rWrite(pPg);.   
230d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
230e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  OK ){.      memc
230f0 70 79 28 73 71 6c 69 74 65 33 50 61 67 65 72 47  py(sqlite3PagerG
23100 65 74 44 61 74 61 28 70 50 67 29 2c 20 70 44 61  etData(pPg), pDa
23110 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
23120 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
23130 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
23140 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  ef(pPg);.  }.  p
23150 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
23160 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
23170 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
23180 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
23190 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
231a0 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69   pager that it i
231b0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
231c0 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20  to.** write the 
231d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70  information on p
231e0 61 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20  age pPg back to 
231f0 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74  the disk, even t
23200 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61  hough.** that pa
23210 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b  ge might be mark
23220 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a  ed as dirty..**.
23230 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67  ** The overlying
23240 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20   software layer 
23250 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
23260 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74  ne when all of t
23270 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68  he data.** on th
23280 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20  e given page is 
23290 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61 67  unused.  The pag
232a0 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67  er marks the pag
232b0 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a  e as clean so.**
232c0 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f   that it does no
232d0 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f  t get written to
232e0 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73   disk..**.** Tes
232f0 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69  ts show that thi
23300 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  s optimization, 
23310 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74 68  together with th
23320 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  e.** sqlite3Page
23330 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
23340 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e  below, more than
23350 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65   double the spee
23360 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e  d.** of large IN
23370 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20  SERT operations 
23380 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68  and quadruple th
23390 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65  e speed of large
233a0 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20   DELETEs..**.** 
233b0 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
233c0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74  e is called, set
233d0 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62   the alwaysRollb
233e0 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65  ack flag to true
233f0 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20  ..** Subsequent 
23400 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
23410 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
23420 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65  k() for the same
23430 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68   page.** will th
23440 65 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f  ereafter be igno
23450 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65  red.  This is ne
23460 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64  cessary to avoid
23470 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68   a problem.** wh
23480 65 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20  ere a page with 
23490 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f  data is added to
234a0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
234b0 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66  ring one part of
234c0 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f  .** a transactio
234d0 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66  n then removed f
234e0 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
234f0 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20   during a later 
23500 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73  part.** of the s
23510 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ame transaction 
23520 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73  and reused for s
23530 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73  ome other purpos
23540 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69  e.  When it.** i
23550 73 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f  s first added to
23560 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74   the freelist, t
23570 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
23580 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75  alled.  When reu
23590 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73 71 6c 69  sed,.** the sqli
235a0 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
235b0 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69  back() routine i
235c0 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62  s called.  But b
235d0 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 70 61  ecause the.** pa
235e0 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 72 69 74  ge contains crit
235f0 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74  ical data, we st
23600 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ill need to be s
23610 75 72 65 20 69 74 20 67 65 74 73 0a 2a 2a 20 72  ure it gets.** r
23620 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70  olled back in sp
23630 69 74 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ite of the sqlit
23640 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
23650 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76  ack() call..*/.v
23660 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
23670 44 6f 6e 74 57 72 69 74 65 28 44 62 50 61 67 65  DontWrite(DbPage
23680 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 50 67   *pDbPage){.  Pg
23690 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61  Hdr *pPg = pDbPa
236a0 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge;.  Pager *pPa
236b0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
236c0 72 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  r;..  if( MEMDB 
236d0 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 61 67 65  ) return;.  page
236e0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
236f0 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c    pPg->alwaysRol
23700 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28  lback = 1;.  if(
23710 20 70 50 67 2d 3e 64 69 72 74 79 20 26 26 20 21   pPg->dirty && !
23720 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
23730 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
23740 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
23750 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
23760 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
23770 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67  dbSize==(int)pPg
23780 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72  ->pgno && pPager
23790 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61  ->origDbSize<pPa
237a0 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
237b0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
237c0 70 61 67 65 73 20 69 73 20 74 68 65 20 6c 61 73  pages is the las
237d0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69  t page in the fi
237e0 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
237f0 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20  has grown.      
23800 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  ** during the cu
23810 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
23820 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d  n, then do NOT m
23830 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
23840 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20  clean..      ** 
23850 57 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  When the databas
23860 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65  e file grows, we
23870 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20   must make sure 
23880 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
23890 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73  ge.      ** gets
238a0 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73   written at leas
238b0 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74  t once so that t
238c0 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c  he disk file wil
238d0 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65 63 74  l be the correct
238e0 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20  .      ** size. 
238f0 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72  If you do not wr
23900 69 74 65 20 74 68 69 73 20 70 61 67 65 20 61 6e  ite this page an
23910 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
23920 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
23930 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73  on the disk ends
23940 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d   up being too sm
23950 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65  all, that can le
23960 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20  ad to database. 
23970 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69       ** corrupti
23980 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65  on during the ne
23990 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  xt transaction..
239a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c        */.    }el
239b0 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
239c0 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54  RACE3("DONT_WRIT
239d0 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  E page %d of %d\
239e0 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50  n", pPg->pgno, P
239f0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
23a00 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
23a10 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c  "CLEAN %p %d\n",
23a20 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
23a30 6e 6f 29 29 0a 20 20 20 20 20 20 6d 61 6b 65 43  no)).      makeC
23a40 6c 65 61 6e 28 70 50 67 29 3b 0a 23 69 66 64 65  lean(pPg);.#ifde
23a50 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
23a60 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e  AGES.      pPg->
23a70 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
23a80 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
23a90 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
23aa0 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
23ab0 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
23ac0 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
23ad0 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
23ae0 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61   pager that if a
23af0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
23b00 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e  ,.** it is not n
23b10 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74  ecessary to rest
23b20 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20  ore the data on 
23b30 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20  the given page. 
23b40 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74   This.** means t
23b50 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f  hat the pager do
23b60 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72  es not have to r
23b70 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20  ecord the given 
23b80 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72  page in the.** r
23b90 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
23ba0 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 68 61 76  .**.** If we hav
23bb0 65 20 6e 6f 74 20 79 65 74 20 61 63 74 75 61 6c  e not yet actual
23bc0 6c 79 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74  ly read the cont
23bd0 65 6e 74 20 6f 66 20 74 68 69 73 20 70 61 67 65  ent of this page
23be0 20 28 69 66 0a 2a 2a 20 74 68 65 20 50 67 48 64   (if.** the PgHd
23bf0 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20  r.needRead flag 
23c00 69 73 20 73 65 74 29 20 74 68 65 6e 20 74 68 69  is set) then thi
23c10 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61  s routine acts a
23c20 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a 2a 20 74  s a promise.** t
23c30 68 61 74 20 77 65 20 77 69 6c 6c 20 6e 65 76 65  hat we will neve
23c40 72 20 6e 65 65 64 20 74 6f 20 72 65 61 64 20 74  r need to read t
23c50 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
23c60 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a  in the future..*
23c70 2a 20 73 6f 20 74 68 65 20 6e 65 65 64 52 65 61  * so the needRea
23c80 64 20 66 6c 61 67 20 63 61 6e 20 62 65 20 63 6c  d flag can be cl
23c90 65 61 72 65 64 20 61 74 20 74 68 69 73 20 70 6f  eared at this po
23ca0 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  int..*/.void sql
23cb0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
23cc0 6c 62 61 63 6b 28 44 62 50 61 67 65 20 2a 70 50  lback(DbPage *pP
23cd0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
23ce0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
23cf0 72 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72  r;..  pagerEnter
23d00 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
23d10 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
23d20 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
23d30 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  D );.  if( pPage
23d40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
23d50 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
23d60 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c  ( pPg->alwaysRol
23d70 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d  lback || pPager-
23d80 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
23d90 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72  || MEMDB ) retur
23da0 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69  n;.  if( !pPg->i
23db0 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74  nJournal && (int
23dc0 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
23dd0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
23de0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
23df0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
23e00 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  al!=0 );.    pPa
23e10 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
23e20 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
23e30 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
23e40 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75  ;.    pPg->inJou
23e50 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 70 50  rnal = 1;.    pP
23e60 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b  g->needRead = 0;
23e70 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
23e80 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
23e90 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
23ea0 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
23eb0 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
23ec0 6f 26 37 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  o&7);.    }.    
23ed0 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e  PAGERTRACE3("DON
23ee0 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20  T_ROLLBACK page 
23ef0 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
23f00 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
23f10 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 49 4f  pPager));.    IO
23f20 54 52 41 43 45 28 28 22 47 41 52 42 41 47 45 20  TRACE(("GARBAGE 
23f30 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
23f40 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20  , pPg->pgno)).  
23f50 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
23f60 73 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 26 26  stmtInUse .   &&
23f70 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e   !pageInStatemen
23f80 74 28 70 50 67 29 20 0a 20 20 20 26 26 20 28 69  t(pPg) .   && (i
23f90 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  nt)pPg->pgno<=pP
23fa0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a  ager->stmtSize .
23fb0 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28    ){.    assert(
23fc0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
23fd0 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
23fe0 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
23ff0 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
24000 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  rt( pPager->aInS
24010 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  tmt!=0 );.    pP
24020 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
24030 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
24040 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
24050 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65    }.  pagerLeave
24060 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a  (pPager);.}.../*
24070 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
24080 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e   is called to in
24090 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74 61  crement the data
240a0 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
240b0 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f  -counter,.** sto
240c0 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20 6f  red at byte 24 o
240d0 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  f the pager file
240e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
240f0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
24100 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a  ecounter(Pager *
24110 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69  pPager, int isDi
24120 72 65 63 74 29 7b 0a 20 20 50 67 48 64 72 20 2a  rect){.  PgHdr *
24130 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68  pPgHdr;.  u32 ch
24140 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20  ange_counter;.  
24150 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
24160 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67  OK;..  if( !pPag
24170 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
24180 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  one ){.    /* Op
24190 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  en page 1 of the
241a0 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e   file for writin
241b0 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
241c0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
241d0 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64  Pager, 1, &pPgHd
241e0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
241f0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
24200 72 6e 20 72 63 3b 0a 0a 20 20 20 20 69 66 28 20  rn rc;..    if( 
24210 21 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20 20  !isDirect ){.   
24220 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
24230 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72  agerWrite(pPgHdr
24240 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
24250 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
24260 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
24270 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
24280 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72  the value just r
24290 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74  ead and write it
242a0 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34   back to byte 24
242b0 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f  . */.    change_
242c0 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  counter = sqlite
242d0 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70  3Get4byte((u8*)p
242e0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
242f0 73 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 5f 63  s);.    change_c
24300 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75  ounter++;.    pu
24310 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
24320 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
24330 67 48 64 72 29 29 2b 32 34 2c 20 63 68 61 6e 67  gHdr))+24, chang
24340 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20  e_counter);..   
24350 20 69 66 28 20 69 73 44 69 72 65 63 74 20 26 26   if( isDirect &&
24360 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
24370 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 63  thods ){.      c
24380 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20  onst void *zBuf 
24390 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  = PGHDR_TO_DATA(
243a0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 72  pPgHdr);.      r
243b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
243c0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a  te(pPager->fd, z
243d0 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Buf, pPager->pag
243e0 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 7d  eSize, 0);.    }
243f0 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
24400 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65   the page refere
24410 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  nce. */.    sqli
24420 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
24430 67 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67 65  gHdr);.    pPage
24440 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
24450 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ne = 1;.  }.  re
24460 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24470 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
24480 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
24490 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a   pager pPager. z
244a0 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
244b0 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
244c0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
244d0 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
244e0 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
244f0 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  o the individual
24500 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
24510 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65  . zMaster may be
24520 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20   NULL, which is 
24530 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e  interpreted as n
24540 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  o master.** jour
24550 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61  nal (a single da
24560 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
24570 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  on)..**.** This 
24580 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
24590 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
245a0 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20   is synced, all 
245b0 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74  dirty pages writ
245c0 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61  ten.** to the da
245d0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
245e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
245f0 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e  e synced. The on
24600 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a  ly thing that.**
24610 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d   remains to comm
24620 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
24630 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  on is to delete 
24640 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
24650 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a   (or.** master j
24660 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
24670 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
24680 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
24690 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
246a0 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
246b0 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
246c0 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
246d0 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67  to an sqlite3Pag
246e0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
246f0 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
24700 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75  f parameter nTru
24710 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nc is non-zero, 
24720 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  then the pager f
24730 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
24740 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61   to.** nTrunc pa
24750 67 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65  ges (this is use
24760 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
24770 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a   databases)..*/.
24780 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
24790 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 50  CommitPhaseOne(P
247a0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
247b0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
247c0 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b  r, Pgno nTrunc){
247d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
247e0 54 45 5f 4f 4b 3b 0a 0a 20 20 50 41 47 45 52 54  TE_OK;..  PAGERT
247f0 52 41 43 45 34 28 22 44 41 54 41 42 41 53 45 20  RACE4("DATABASE 
24800 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d  SYNC: File=%s zM
24810 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d  aster=%s nTrunc=
24820 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50  %d\n", .      pP
24830 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
24840 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63   zMaster, nTrunc
24850 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  );.  pagerEnter(
24860 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 49  pPager);..  /* I
24870 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
24880 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f  memory db, or no
24890 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
248a0 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20   written to, or 
248b0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
248c0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
248d0 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  een called, it i
248e0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
248f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
24900 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate!=PAGER_SYNCE
24910 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70  D && !MEMDB && p
24920 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
24930 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
24940 70 50 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  pPg;..#ifdef SQL
24950 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
24960 43 5f 57 52 49 54 45 0a 20 20 20 20 2f 2a 20 54  C_WRITE.    /* T
24970 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
24980 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
24990 20 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20   be used if all 
249a0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f  of the.    ** fo
249b0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
249c0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
249d0 20 20 20 2b 20 54 68 65 20 66 69 6c 65 2d 73 79     + The file-sy
249e0 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68  stem supports th
249f0 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70  e atomic-write p
24a00 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20  roperty for.    
24a10 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f  **      blocks o
24a20 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65  f size page-size
24a30 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20  , and.    **    
24a40 2b 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73  + This commit is
24a50 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d   not part of a m
24a60 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61  ulti-file transa
24a70 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a  ction, and.    *
24a80 2a 20 20 20 20 2b 20 45 78 61 63 74 6c 79 20 6f  *    + Exactly o
24a90 6e 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  ne page has been
24aa0 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74   modified and st
24ab0 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ore in the journ
24ac0 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  al file..    **.
24ad0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70      ** If the op
24ae0 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
24af0 65 20 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65  e used, then the
24b00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
24b10 6c 6c 20 6e 65 76 65 72 0a 20 20 20 20 2a 2a 20  ll never.    ** 
24b20 62 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 74  be created for t
24b30 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
24b40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
24b50 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 3d  useAtomicWrite =
24b60 20 28 0a 20 20 20 20 20 20 20 20 21 7a 4d 61 73   (.        !zMas
24b70 74 65 72 20 26 26 20 0a 20 20 20 20 20 20 20 20  ter && .        
24b80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
24b90 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69  ff==jrnlBufferSi
24ba0 7a 65 28 70 50 61 67 65 72 29 20 26 26 20 0a 20  ze(pPager) && . 
24bb0 20 20 20 20 20 20 20 6e 54 72 75 6e 63 3d 3d 30         nTrunc==0
24bc0 20 26 26 20 0a 20 20 20 20 20 20 20 20 28 30 3d   && .        (0=
24bd0 3d 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20  =pPager->pDirty 
24be0 7c 7c 20 30 3d 3d 70 50 61 67 65 72 2d 3e 70 44  || 0==pPager->pD
24bf0 69 72 74 79 2d 3e 70 44 69 72 74 79 29 0a 20 20  irty->pDirty).  
24c00 20 20 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65    );.    if( use
24c10 41 74 6f 6d 69 63 57 72 69 74 65 20 29 7b 0a 20  AtomicWrite ){. 
24c20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
24c30 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e  he nRec field in
24c40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
24c50 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  e. */.      int 
24c60 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  offset = pPager-
24c70 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69  >journalHdr + si
24c80 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
24c90 69 63 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ic);.      asser
24ca0 74 28 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d  t(pPager->nRec==
24cb0 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  1);.      rc = w
24cc0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
24cd0 72 2d 3e 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  r->jfd, offset, 
24ce0 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a  pPager->nRec);..
24cf0 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
24d00 74 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e  the db file chan
24d10 67 65 20 63 6f 75 6e 74 65 72 2e 20 54 68 65 20  ge counter. The 
24d20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77  following call w
24d30 69 6c 6c 20 6d 6f 64 69 66 79 0a 20 20 20 20 20  ill modify.     
24d40 20 2a 2a 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   ** the in-memor
24d50 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
24d60 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20 69 6e   of page 1 to in
24d70 63 6c 75 64 65 20 74 68 65 20 75 70 64 61 74 65  clude the update
24d80 64 0a 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67  d.      ** chang
24d90 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68  e counter and th
24da0 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20  en write page 1 
24db0 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
24dc0 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
24dd0 2a 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20  * file. Because 
24de0 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  of the atomic-wr
24df0 69 74 65 20 70 72 6f 70 65 72 74 79 20 6f 66 20  ite property of 
24e00 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79  the host file-sy
24e10 73 74 65 6d 2c 20 0a 20 20 20 20 20 20 2a 2a 20  stem, .      ** 
24e20 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20  this is safe..  
24e30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
24e40 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
24e50 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
24e60 72 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  r, 1);.    }else
24e70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
24e80 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74  ite3JournalCreat
24e90 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
24ea0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
24eb0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
24ec0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
24ed0 0a 20 20 20 20 69 66 28 20 21 75 73 65 41 74 6f  .    if( !useAto
24ee0 6d 69 63 57 72 69 74 65 20 29 0a 23 65 6e 64 69  micWrite ).#endi
24ef0 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d  f..    /* If a m
24f00 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
24f10 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65  le name has alre
24f20 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
24f30 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a   to the.    ** j
24f40 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
24f50 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71  n no sync is req
24f60 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70 70  uired. This happ
24f70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20  ens when it is. 
24f80 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74     ** written, t
24f90 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20  hen the process 
24fa0 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65  fails to upgrade
24fb0 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44   from a RESERVED
24fc0 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   to an.    ** EX
24fd0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
24fe0 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20  e next time the 
24ff0 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f  process tries to
25000 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20   commit the.    
25010 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ** transaction t
25020 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c  he m-j name will
25030 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
25040 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  en written..    
25050 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
25060 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b  er->setMaster ){
25070 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25080 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
25090 65 6e 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  en );.      rc =
250a0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
250b0 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
250c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
250d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
250e0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
250f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25100 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
25110 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21       if( nTrunc!
25120 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
25130 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   If this transac
25140 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68  tion has made th
25150 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c  e database small
25160 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  er, then all pag
25170 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65  es.        ** be
25180 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79  ing discarded by
25190 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20   the truncation 
251a0 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20  must be written 
251b0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
251c0 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a         ** file..
251d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
251e0 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20     Pgno i;.     
251f0 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50     int iSkip = P
25200 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
25210 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  ger);.        fo
25220 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69  r( i=nTrunc+1; i
25230 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
25240 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  Size; i++ ){.   
25250 20 20 20 20 20 20 20 69 66 28 20 21 28 70 50 61         if( !(pPa
25260 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
25270 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29  i/8] & (1<<(i&7)
25280 29 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29  )) && i!=iSkip )
25290 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
252a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
252b0 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70  et(pPager, i, &p
252c0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
252d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
252e0 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
252f0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xit;.           
25300 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
25310 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20  erWrite(pPg);.  
25320 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25330 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
25340 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
25350 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25360 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
25370 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
25380 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d        } .      }
25390 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
253a0 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f   = writeMasterJo
253b0 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d  urnal(pPager, zM
253c0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66  aster);.      if
253d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
253e0 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
253f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  ;.      rc = syn
25400 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
25410 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
25420 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
25430 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
25440 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25450 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
25460 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
25470 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
25480 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
25490 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72  cate(pPager, nTr
254a0 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  unc);.      if( 
254b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
254c0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
254d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
254e0 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64    /* Write all d
254f0 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68  irty pages to th
25500 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25510 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  */.    pPg = pag
25520 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
25530 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a  _pages(pPager);.
25540 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
25550 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
25560 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
25570 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25580 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 26 26     while( pPg &&
25590 20 21 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 20   !pPg->dirty ){ 
255a0 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  pPg = pPg->pDirt
255b0 79 3b 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65  y; }.      pPage
255c0 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b  r->pDirty = pPg;
255d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 79 6e 63  .      goto sync
255e0 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
255f0 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
25600 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e  = 0;..    /* Syn
25610 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
25620 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
25630 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
25640 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
25650 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
25660 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
25670 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20  sync_flags);.   
25680 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
25690 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  "DBSYNC %p\n", p
256a0 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61  Pager))..    pPa
256b0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
256c0 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c  ER_SYNCED;.  }el
256d0 73 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20  se if( MEMDB && 
256e0 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
256f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
25700 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  erTruncate(pPage
25710 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a  r, nTrunc);.  }.
25720 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 69 66  .sync_exit:.  if
25730 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
25740 52 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  RR_BLOCKED ){.  
25750 20 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    /* pager_incr_
25760 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
25770 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  may attempt to o
25780 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69  btain an exclusi
25790 76 65 0a 20 20 20 20 20 2a 20 6c 6f 63 6b 20 74  ve.     * lock t
257a0 6f 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68  o spill the cach
257b0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4f 45  e and return IOE
257c0 52 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20  RR_BLOCKED. But 
257d0 73 69 6e 63 65 20 0a 20 20 20 20 20 2a 20 74 68  since .     * th
257e0 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
257f0 20 74 68 65 20 63 61 63 68 65 20 69 73 20 69 6e   the cache is in
25800 63 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74 27 73  consistent, it's
25810 0a 20 20 20 20 20 2a 20 62 65 74 74 65 72 20 74  .     * better t
25820 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
25830 42 55 53 59 2e 0a 20 20 20 20 20 2a 2f 0a 20 20  BUSY..     */.  
25840 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
25850 53 59 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c  SY;.  }.  pagerL
25860 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
25870 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
25880 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20  *.** Commit all 
25890 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
258a0 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65  atabase and rele
258b0 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
258c0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
258d0 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f   commit fails fo
258e0 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20  r any reason, a 
258f0 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74  rollback attempt
25900 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20   is made.** and 
25910 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
25920 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74   returned.  If t
25930 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64  he commit worked
25940 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  , SQLITE_OK.** i
25950 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
25960 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
25970 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61  ommitPhaseTwo(Pa
25980 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
25990 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
259a0 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61  *pPg;..  if( pPa
259b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
259c0 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
259d0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
259e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
259f0 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
25a00 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
25a10 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
25a20 20 7d 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28   }.  pagerEnter(
25a30 70 50 61 67 65 72 29 3b 0a 20 20 50 41 47 45 52  pPager);.  PAGER
25a40 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25  TRACE2("COMMIT %
25a50 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
25a60 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45  ager));.  if( ME
25a70 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d  MDB ){.    pPg =
25a80 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64   pager_get_all_d
25a90 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65  irty_pages(pPage
25aa0 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  r);.    while( p
25ab0 50 67 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69  Pg ){.      PgHi
25ac0 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
25ad0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
25ae0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
25af0 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48   clearHistory(pH
25b00 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  ist);.      pPg-
25b10 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
25b20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
25b30 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
25b40 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
25b50 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
25b60 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48  nc = 0;.      pH
25b70 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  ist->pPrevStmt =
25b80 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d   pHist->pNextStm
25b90 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  t = 0;.      pPg
25ba0 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a   = pPg->pDirty;.
25bb0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
25bc0 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 23 69  ->pDirty = 0;.#i
25bd0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
25be0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
25bf0 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
25c00 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
25c10 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
25c20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
25c30 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
25c40 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
25c50 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52  t( !pPg->alwaysR
25c60 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  ollback );.     
25c70 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d   assert( !pHist-
25c80 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
25c90 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
25ca0 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23  pStmt );.    }.#
25cb0 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65 72  endif.    pPager
25cc0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
25cd0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
25ce0 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
25cf0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25d00 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
25d10 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
25d20 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65  alOpen || !pPage
25d30 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b  r->dirtyCache );
25d40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25d50 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
25d60 53 59 4e 43 45 44 20 7c 7c 20 21 70 50 61 67 65  SYNCED || !pPage
25d70 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b  r->dirtyCache );
25d80 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e  .  rc = pager_en
25d90 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
25da0 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61  ager);.  rc = pa
25db0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
25dc0 2c 20 72 63 29 3b 0a 20 20 70 61 67 65 72 4c 65  , rc);.  pagerLe
25dd0 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
25de0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
25df0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  ** Rollback all 
25e00 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61  changes.  The da
25e10 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63  tabase falls bac
25e20 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  k to PAGER_SHARE
25e30 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69  D mode..** All i
25e40 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70  n-memory cache p
25e50 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74  ages revert to t
25e60 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61  heir original da
25e70 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20  ta contents..** 
25e80 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  The journal is d
25e90 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
25ea0 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f  is routine canno
25eb0 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f  t fail unless so
25ec0 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
25ed0 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
25ee0 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  g.** the correct
25ef0 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f   locking protoco
25f00 6c 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65  l or unless some
25f10 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73   other.** proces
25f20 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61  s is writing tra
25f30 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  sh into the jour
25f40 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45  nal file (SQLITE
25f50 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20  _CORRUPT) or.** 
25f60 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d  unless a prior m
25f70 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28  alloc() failed (
25f80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20  SQLITE_NOMEM).  
25f90 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  Appropriate erro
25fa0 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72  r.** codes are r
25fb0 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20  eturned for all 
25fc0 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e  these occasions.
25fd0 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20    Otherwise,.** 
25fe0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
25ff0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
26000 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
26010 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
26020 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
26030 41 47 45 52 54 52 41 43 45 32 28 22 52 4f 4c 4c  AGERTRACE2("ROLL
26040 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
26050 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
26060 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
26070 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66   PgHdr *p;.    f
26080 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c  or(p=pPager->pAl
26090 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  l; p; p=p->pNext
260a0 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69  All){.      PgHi
260b0 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20  story *pHist;.  
260c0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e      assert( !p->
260d0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
260e0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e  ;.      if( !p->
260f0 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20  dirty ){.       
26100 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69   assert( !((PgHi
26110 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f  story *)PGHDR_TO
26120 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
26130 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20  )->pOrig );.    
26140 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50      assert( !((P
26150 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52  gHistory *)PGHDR
26160 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67  _TO_HIST(p, pPag
26170 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  er))->pStmt );. 
26180 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
26190 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
261a0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
261b0 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
261c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69 73  ;.      if( pHis
261d0 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20  t->pOrig ){.    
261e0 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52      memcpy(PGHDR
261f0 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69  _TO_DATA(p), pHi
26200 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65  st->pOrig, pPage
26210 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
26220 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
26230 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45  3("ROLLBACK-PAGE
26240 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d   %d of %d\n", p-
26250 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
26260 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d  Pager));.      }
26270 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50 41  else{.        PA
26280 47 45 52 54 52 41 43 45 33 28 22 50 41 47 45 20  GERTRACE3("PAGE 
26290 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25  %d is clean on %
262a0 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50  d\n", p->pgno, P
262b0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
262c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
262d0 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73  learHistory(pHis
262e0 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72  t);.      p->dir
262f0 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  ty = 0;.      p-
26300 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
26310 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53        pHist->inS
26320 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
26330 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Hist->pPrevStmt 
26340 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74  = pHist->pNextSt
26350 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  mt = 0;.      if
26360 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69  ( pPager->xReini
26370 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ter ){.        p
26380 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
26390 28 70 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  (p, pPager->page
263a0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
263b0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
263c0 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
263d0 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
263e0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
263f0 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
26400 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20  >origDbSize;.   
26410 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
26420 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
26430 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
26440 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
26450 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
26460 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
26470 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26480 3b 0a 20 20 7d 0a 0a 20 20 70 61 67 65 72 45 6e  ;.  }..  pagerEn
26490 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
264a0 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74  f( !pPager->dirt
264b0 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65  yCache || !pPage
264c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
264d0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
264e0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
264f0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61  (pPager);.    pa
26500 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
26510 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
26520 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
26530 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
26540 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
26550 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
26560 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
26570 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
26580 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70  USIVE ){.      p
26590 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
265a0 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
265b0 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
265c0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
265d0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
265e0 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
265f0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
26600 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
26610 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
26620 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
26630 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
26640 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f      rc2 = pager_
26650 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
26660 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
26670 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26680 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
26690 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
266a0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
266b0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
266c0 20 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 61   0);.  }.  /* pa
266d0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
266e0 29 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  ); */.  pPager->
266f0 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20  dbSize = -1;..  
26700 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
26710 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52  ccurs during a R
26720 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20  OLLBACK, we can 
26730 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20  no longer trust 
26740 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 63  the pager.  ** c
26750 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61  ache. So call pa
26760 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74  ger_error() on t
26770 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61  he way out to ma
26780 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20  ke any error .  
26790 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20  ** persistent.. 
267a0 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
267b0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
267c0 63 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65  c);.  pagerLeave
267d0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
267e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
267f0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
26800 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26810 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d   is opened read-
26820 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41  only.  Return FA
26830 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61  LSE.** if the da
26840 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68  tabase is (in th
26850 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a  eory) writable..
26860 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
26870 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61  gerIsreadonly(Pa
26880 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
26890 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72  return pPager->r
268a0 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  eadOnly;.}../*.*
268b0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
268c0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
268d0 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a  s to the pager..
268e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
268f0 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65  gerRefcount(Page
26900 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
26910 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 52 65  turn pPager->nRe
26920 66 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  f;.}..#ifdef SQL
26930 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54  ITE_TEST./*.** T
26940 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
26950 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
26960 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
26970 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74  y..*/.int *sqlit
26980 65 33 50 61 67 65 72 53 74 61 74 73 28 50 61 67  e3PagerStats(Pag
26990 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
269a0 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b  tatic int a[11];
269b0 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72  .  a[0] = pPager
269c0 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d  ->nRef;.  a[1] =
269d0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a   pPager->nPage;.
269e0 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d    a[2] = pPager-
269f0 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20  >mxPage;.  a[3] 
26a00 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
26a10 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65  ;.  a[4] = pPage
26a20 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d  r->state;.  a[5]
26a30 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
26a40 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61  de;.  a[6] = pPa
26a50 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37  ger->nHit;.  a[7
26a60 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73  ] = pPager->nMis
26a70 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20  s;.  a[8] = 0;  
26a80 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20 70 50  /* Used to be pP
26a90 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20  ager->nOvfl */. 
26aa0 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[9] = pPager->
26ab0 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d  nRead;.  a[10] =
26ac0 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b   pPager->nWrite;
26ad0 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23  .  return a;.}.#
26ae0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  endif../*.** Set
26af0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72   the statement r
26b00 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a  ollback point..*
26b10 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26b20 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  e should be call
26b30 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61 6e  ed with the tran
26b40 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
26b50 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e  already.** open.
26b60 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e    A new statemen
26b70 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65  t journal is cre
26b80 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62 65  ated that can be
26b90 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   used to rollbac
26ba0 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20  k.** changes of 
26bb0 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d  a single SQL com
26bc0 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61  mand within a la
26bd0 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  rger transaction
26be0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26bf0 70 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50  pagerStmtBegin(P
26c00 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
26c10 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
26c20 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  t( !pPager->stmt
26c30 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72  InUse );.  asser
26c40 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
26c50 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
26c60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
26c70 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b  er->dbSize>=0 );
26c80 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
26c90 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22  STMT-BEGIN %d\n"
26ca0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
26cb0 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
26cc0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
26cd0 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20  tmtInUse = 1;.  
26ce0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
26cf0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
26d00 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ize;.    return 
26d10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
26d20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
26d30 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
26d40 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
26d50 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72  oopen = 1;.    r
26d60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26d70 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
26d80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
26d90 65 6e 20 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  en );.  pagerLea
26da0 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  ve(pPager);.  pP
26db0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
26dc0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
26dd0 6f 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o( pPager->dbSiz
26de0 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 70 61 67  e/8 + 1 );.  pag
26df0 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
26e00 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
26e10 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  InStmt==0 ){.   
26e20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   /* sqlite3OsLoc
26e30 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
26e40 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20  ARED_LOCK); */. 
26e50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26e60 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e  _NOMEM;.  }.#ifn
26e70 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20  def NDEBUG.  rc 
26e80 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
26e90 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
26ea0 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53   &pPager->stmtJS
26eb0 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
26ec0 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e   goto stmt_begin
26ed0 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72  _failed;.  asser
26ee0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  t( pPager->stmtJ
26ef0 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e  Size == pPager->
26f00 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65  journalOff );.#e
26f10 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73  ndif.  pPager->s
26f20 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65  tmtJSize = pPage
26f30 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
26f40 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
26f50 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
26f60 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ze;.  pPager->st
26f70 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20  mtHdrOff = 0;.  
26f80 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75  pPager->stmtCksu
26f90 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
26fa0 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50  mInit;.  if( !pP
26fb0 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
26fc0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
26fd0 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
26fe0 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
26ff0 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 50 61 67  ager->stfd, pPag
27000 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 2c 0a 20  er->zStmtJrnl,. 
27010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27020 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
27030 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
27040 4e 41 4c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  NAL);.    if( rc
27050 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
27060 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
27070 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
27080 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31  er->stmtOpen = 1
27090 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
270a0 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a  mtNRec = 0;.  }.
270b0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
270c0 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  Use = 1;.  retur
270d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73  n SQLITE_OK;. .s
270e0 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
270f0 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  :.  if( pPager->
27100 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73  aInStmt ){.    s
27110 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
27120 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20  er->aInStmt);.  
27130 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
27140 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
27150 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
27160 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65  lite3PagerStmtBe
27170 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
27180 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
27190 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
271a0 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  r);.  rc = pager
271b0 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72  StmtBegin(pPager
271c0 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
271d0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
271e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
271f0 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e  ommit a statemen
27200 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
27210 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74  3PagerStmtCommit
27220 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
27230 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
27240 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
27250 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
27260 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
27270 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 50 41  , *pNext;.    PA
27280 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d  GERTRACE2("STMT-
27290 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41  COMMIT %d\n", PA
272a0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
272b0 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
272c0 7b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  {.      /* sqlit
272d0 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
272e0 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a  ger->stfd, 0); *
272f0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
27300 66 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  free( pPager->aI
27310 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70  nStmt );.      p
27320 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
27330 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
27340 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61       for(pPg=pPa
27350 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b  ger->pStmt; pPg;
27360 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20   pPg=pNext){.   
27370 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
27380 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
27390 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
273a0 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 78  r);.        pNex
273b0 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74  t = pHist->pNext
273c0 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 61 73  Stmt;.        as
273d0 73 65 72 74 28 20 70 48 69 73 74 2d 3e 69 6e 53  sert( pHist->inS
273e0 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  tmt );.        p
273f0 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30  Hist->inStmt = 0
27400 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d  ;.        pHist-
27410 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69  >pPrevStmt = pHi
27420 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  st->pNextStmt = 
27430 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
27440 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70  e3_free(pHist->p
27450 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Stmt);.        p
27460 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
27470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27480 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
27490 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Rec = 0;.    pPa
274a0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
274b0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
274c0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  pStmt = 0;.  }. 
274d0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
274e0 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 61 67  oopen = 0;.  pag
274f0 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
27500 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27510 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
27520 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65  llback a stateme
27530 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
27540 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62  e3PagerStmtRollb
27550 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
27560 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
27570 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
27580 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
27590 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
275a0 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
275b0 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64  STMT-ROLLBACK %d
275c0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
275d0 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 4d  ger));.    if( M
275e0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67  EMDB ){.      Pg
275f0 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  Hdr *pPg;.      
27600 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
27610 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d  ;.      for(pPg=
27620 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70  pPager->pStmt; p
27630 50 67 3b 20 70 50 67 3d 70 48 69 73 74 2d 3e 70  Pg; pPg=pHist->p
27640 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20  NextStmt){.     
27650 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44 52     pHist = PGHDR
27660 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
27670 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
27680 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  f( pHist->pStmt 
27690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
276a0 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
276b0 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70  A(pPg), pHist->p
276c0 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61  Stmt, pPager->pa
276d0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
276e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
276f0 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
27700 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e           pHist->
27710 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
27720 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
27730 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
27740 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  e = pPager->stmt
27750 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 61 67 65  Size;.      page
27760 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
27770 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
27780 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27790 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
277a0 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74   rc = pager_stmt
277b0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
277c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
277d0 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
277e0 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
277f0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
27800 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
27810 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
27820 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 61 67 65  open = 0;.  page
27830 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
27840 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27850 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
27860 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
27870 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
27880 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
27890 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
278a0 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a  Filename(Pager *
278b0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
278c0 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  n pPager->zFilen
278d0 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ame;.}../*.** Re
278e0 74 75 72 6e 20 74 68 65 20 56 46 53 20 73 74 72  turn the VFS str
278f0 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 70  ucture for the p
27900 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73  ager..*/.const s
27910 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69  qlite3_vfs *sqli
27920 74 65 33 50 61 67 65 72 56 66 73 28 50 61 67 65  te3PagerVfs(Page
27930 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
27940 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66  turn pPager->pVf
27950 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  s;.}../*.** Retu
27960 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  rn the file hand
27970 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  le for the datab
27980 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61  ase file associa
27990 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
279a0 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67  pager.  This mig
279b0 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ht return NULL i
279c0 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a  f the file has.*
279d0 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  * not yet been o
279e0 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65  pened..*/.sqlite
279f0 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50  3_file *sqlite3P
27a00 61 67 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a  agerFile(Pager *
27a10 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
27a20 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a  n pPager->fd;.}.
27a30 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
27a40 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74  e directory of t
27a50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27a60 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
27a70 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72  *sqlite3PagerDir
27a80 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
27a90 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
27aa0 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
27ab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
27ac0 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
27ad0 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
27ae0 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  al file..*/.cons
27af0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
27b00 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  agerJournalname(
27b10 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
27b20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
27b30 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a  >zJournal;.}../*
27b40 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
27b50 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73  if fsync() calls
27b60 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f   are disabled fo
27b70 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52  r this pager.  R
27b80 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
27b90 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65  f fsync()s are e
27ba0 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79  xecuted normally
27bb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27bc0 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65  PagerNosync(Page
27bd0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
27be0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53  turn pPager->noS
27bf0 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  ync;.}..#ifdef S
27c00 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
27c10 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
27c20 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67  dec for this pag
27c30 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  er.*/.void sqlit
27c40 65 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28  e3PagerSetCodec(
27c50 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
27c60 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64  ,.  void *(*xCod
27c70 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
27c80 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  Pgno,int),.  voi
27c90 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a  d *pCodecArg.){.
27ca0 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
27cb0 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61   = xCodec;.  pPa
27cc0 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d  ger->pCodecArg =
27cd0 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65   pCodecArg;.}.#e
27ce0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
27cf0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
27d00 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  CUUM./*.** Move 
27d10 74 68 65 20 70 61 67 65 20 70 50 67 20 74 6f 20  the page pPg to 
27d20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e  location pgno in
27d30 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a   the file. .**.*
27d40 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
27d50 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  no references to
27d60 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f   the page previo
27d70 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a  usly located at.
27d80 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77  ** pgno (which w
27d90 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74  e call pPgOld) t
27da0 68 6f 75 67 68 20 74 68 61 74 20 70 61 67 65 20  hough that page 
27db0 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  is allowed to be
27dc0 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49  .** in cache.  I
27dd0 66 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69  f the page previ
27de0 6f 75 73 20 6c 6f 63 61 74 65 64 20 61 74 20 70  ous located at p
27df0 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  gno is not alrea
27e00 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c  dy.** in the rol
27e10 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69  lback journal, i
27e20 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65  t is not put the
27e30 72 65 20 62 79 20 62 79 20 74 68 69 73 20 72 6f  re by by this ro
27e40 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  utine..**.** Ref
27e50 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
27e60 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76  age pPg remain v
27e70 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61  alid. Updating a
27e80 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20  ny.** meta-data 
27e90 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
27ea0 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73  pPg (i.e. data s
27eb0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78  tored in the nEx
27ec0 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c  tra bytes.** all
27ed0 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
27ee0 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74  h the page) is t
27ef0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
27f00 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e  y of the caller.
27f10 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63  .**.** A transac
27f20 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74  tion must be act
27f30 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ive when this ro
27f40 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
27f50 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a   It used to be.*
27f60 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20  * required that 
27f70 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
27f80 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  saction was not 
27f90 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73  active, but this
27fa0 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20   restriction.** 
27fb0 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  has been removed
27fc0 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e   (CREATE INDEX n
27fd0 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70  eeds to move a p
27fe0 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65  age when a state
27ff0 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
28000 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a  ion is active)..
28010 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
28020 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65  gerMovepage(Page
28030 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67  r *pPager, DbPag
28040 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e  e *pPg, Pgno pgn
28050 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
28060 4f 6c 64 3b 20 20 2f 2a 20 54 68 65 20 70 61 67  Old;  /* The pag
28070 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  e being overwrit
28080 74 65 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  ten. */.  int h;
28090 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63  .  Pgno needSync
280a0 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 70 61 67  Pgno = 0;..  pag
280b0 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
280c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
280d0 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47  nRef>0 );..  PAG
280e0 45 52 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25  ERTRACE5("MOVE %
280f0 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53  d page %d (needS
28100 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f  ync=%d) moves to
28110 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50   %d\n", .      P
28120 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
28130 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
28140 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b  needSync, pgno);
28150 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56  .  IOTRACE(("MOV
28160 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70  E %p %d %d\n", p
28170 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
28180 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65  , pgno))..  page
28190 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50  r_get_content(pP
281a0 67 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e  g);.  if( pPg->n
281b0 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e  eedSync ){.    n
281c0 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50  eedSyncPgno = pP
281d0 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73  g->pgno;.    ass
281e0 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
281f0 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 67 6e 6f  nal || (int)pgno
28200 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
28210 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
28220 74 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 3b  t( pPg->dirty );
28230 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
28240 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
28250 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  .  }..  /* Unlin
28260 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20  k pPg from it's 
28270 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20  hash-chain */.  
28280 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
28290 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20  pPager, pPg);.. 
282a0 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65   /* If the cache
282b0 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65   contains a page
282c0 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
282d0 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69  r pgno, remove i
282e0 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73  t.  ** from it's
282f0 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73   hash chain. Als
28300 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64 72 2e  o, if the PgHdr.
28310 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73 65 74  needSync was set
28320 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20   for .  ** page 
28330 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20  pgno before the 
28340 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e  'move' operation
28350 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  , it needs to be
28360 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20   retained .  ** 
28370 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76  for the page mov
28380 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  ed there..  */. 
28390 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
283a0 20 30 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70   0;.  pPgOld = p
283b0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
283c0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
283d0 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61   pPgOld ){.    a
283e0 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e  ssert( pPgOld->n
283f0 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e  Ref==0 );.    un
28400 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
28410 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20  ager, pPgOld);. 
28420 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
28430 4f 6c 64 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e  Old);.    pPg->n
28440 65 65 64 53 79 6e 63 20 3d 20 70 50 67 4f 6c 64  eedSync = pPgOld
28450 2d 3e 6e 65 65 64 53 79 6e 63 3b 0a 20 20 7d 65  ->needSync;.  }e
28460 6c 73 65 7b 0a 20 20 20 20 70 50 67 2d 3e 6e 65  lse{.    pPg->ne
28470 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a  edSync = 0;.  }.
28480 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
28490 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74  nJournal && (int
284a0 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f  )pgno<=pPager->o
284b0 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
284c0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
284d0 3d 20 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  =  (pPager->aInJ
284e0 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26  ournal[pgno/8] &
284f0 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21   (1<<(pgno&7)))!
28500 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  =0;.  }else{.   
28510 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
28520 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
28530 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
28540 30 20 7c 7c 20 28 69 6e 74 29 70 67 6e 6f 3e 70  0 || (int)pgno>p
28550 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
28560 65 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  e );.  }..  /* C
28570 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e  hange the page n
28580 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e  umber for pPg an
28590 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f  d insert it into
285a0 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68   the new hash-ch
285b0 61 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ain. */.  assert
285c0 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70  ( pgno!=0 );.  p
285d0 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
285e0 0a 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70  .  h = pgno & (p
285f0 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b  Pager->nHash-1);
28600 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
28610 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61  Hash[h] ){.    a
28620 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
28630 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
28640 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  sh==0 );.    pPa
28650 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70  ger->aHash[h]->p
28660 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
28670 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
28680 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
28690 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65  Hash[h];.  pPage
286a0 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
286b0 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48  g;.  pPg->pPrevH
286c0 61 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65  ash = 0;..  make
286d0 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50  Dirty(pPg);.  pP
286e0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
286f0 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65   = 1;..  if( nee
28700 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20  dSyncPgno ){.   
28710 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50   /* If needSyncP
28720 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  gno is non-zero,
28730 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
28740 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20  l file needs to 
28750 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28  be .    ** sync(
28760 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64  )ed before any d
28770 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
28780 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
28790 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e  page needSyncPgn
287a0 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e  o..    ** Curren
287b0 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67  tly, no such pag
287c0 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
287d0 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74  page-cache and t
287e0 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  he .    ** Pager
287f0 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20  .aInJournal bit 
28800 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68  has been set. Th
28810 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  is needs to be r
28820 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69  emedied by loadi
28830 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  ng.    ** the pa
28840 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
28850 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74  r-cache and sett
28860 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
28870 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20  edSync flag..   
28880 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
28890 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
288a0 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20   call may cause 
288b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
288c0 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20  ync. So make.   
288d0 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67   ** sure the Pag
288e0 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
288f0 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20   is set too..   
28900 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   */.    int rc;.
28910 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64      PgHdr *pPgHd
28920 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
28930 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
28940 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
28950 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
28960 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  er, needSyncPgno
28970 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
28980 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28990 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
289a0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
289b0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67  ync = 1;.    pPg
289c0 48 64 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  Hdr->needSync = 
289d0 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 69  1;.    pPgHdr->i
289e0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
289f0 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 48    makeDirty(pPgH
28a00 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dr);.    sqlite3
28a10 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
28a20 72 29 3b 0a 20 20 7d 0a 0a 20 20 70 61 67 65 72  r);.  }..  pager
28a30 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
28a40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28a50 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
28a60 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
28a70 74 65 72 20 74 6f 20 74 68 65 20 64 61 74 61 20  ter to the data 
28a80 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
28a90 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
28aa0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
28ab0 44 61 74 61 28 44 62 50 61 67 65 20 2a 70 50 67  Data(DbPage *pPg
28ac0 29 7b 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44  ){.  return PGHD
28ad0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
28ae0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
28af0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
28b00 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79   Pager.nExtra by
28b10 74 65 73 20 6f 66 20 22 65 78 74 72 61 22 20 73  tes of "extra" s
28b20 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74  pace .** allocat
28b30 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
28b40 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
28b50 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
28b60 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
28b70 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
28b80 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
28b90 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72  pPg->pPager;.  r
28ba0 65 74 75 72 6e 20 28 70 50 61 67 65 72 3f 50 47  eturn (pPager?PG
28bb0 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
28bc0 2c 20 70 50 61 67 65 72 29 3a 30 29 3b 0a 7d 0a  , pPager):0);.}.
28bd0 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74  ./*.** Get/set t
28be0 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
28bf0 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
28c00 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20  Parameter eMode 
28c10 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f  must be one.** o
28c20 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  f PAGER_LOCKINGM
28c30 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52  ODE_QUERY, PAGER
28c40 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
28c50 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52  MAL or .** PAGER
28c60 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
28c70 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65 20 70  LUSIVE. If the p
28c80 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
28c90 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20  _QUERY, then.** 
28ca0 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
28cb0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
28cc0 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a  alue specified..
28cd0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
28ce0 65 64 20 76 61 6c 75 65 20 69 73 20 65 69 74 68  ed value is eith
28cf0 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  er PAGER_LOCKING
28d00 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a  MODE_NORMAL or.*
28d10 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  * PAGER_LOCKINGM
28d20 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69  ODE_EXCLUSIVE, i
28d30 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20 63 75  ndicating the cu
28d40 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20  rrent (possibly 
28d50 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b  updated).** lock
28d60 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  ing-mode..*/.int
28d70 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63   sqlite3PagerLoc
28d80 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a  kingMode(Pager *
28d90 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64  pPager, int eMod
28da0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d  e){.  assert( eM
28db0 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
28dc0 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20  NGMODE_QUERY.   
28dd0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
28de0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
28df0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  MODE_NORMAL.    
28e00 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
28e10 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
28e20 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
28e30 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
28e40 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
28e50 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74  RY<0 );.  assert
28e60 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
28e70 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26  ODE_NORMAL>=0 &&
28e80 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
28e90 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20  DE_EXCLUSIVE>=0 
28ea0 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d  );.  if( eMode>=
28eb0 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  0 && !pPager->te
28ec0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50  mpFile ){.    pP
28ed0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
28ee0 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d  ode = eMode;.  }
28ef0 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70  .  return (int)p
28f00 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
28f10 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  Mode;.}..#ifdef 
28f20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
28f30 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69  ** Print a listi
28f40 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65  ng of all refere
28f50 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74  nced pages and t
28f60 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a  heir ref count..
28f70 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
28f80 61 67 65 72 52 65 66 64 75 6d 70 28 50 61 67 65  agerRefdump(Page
28f90 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
28fa0 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28  Hdr *pPg;.  for(
28fb0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
28fc0 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
28fd0 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
28fe0 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20  f( pPg->nRef<=0 
28ff0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
29000 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
29010 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64  tf("PAGE %3d add
29020 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c  r=%p nRef=%d\n",
29030 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67   .       pPg->pg
29040 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  no, PGHDR_TO_DAT
29050 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65  A(pPg), pPg->nRe
29060 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  f);.  }.}.#endif
29070 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
29080 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a  TE_OMIT_DISKIO *
29090 2f 0a                                            /.