/ Hex Artifact Content
Login

Artifact 0ce52a22ebfae0c085b68e00e30e9bf9ea462d0d:


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: 35 20 32 30 30 37 2f 30 39 2f 30 33 20 31 35 3a  5 2007/09/03 15:
0360: 31 39 3a 33 35 20 64 72 68 20 45 78 70 20 24 0a  19:35 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  t.h".#include <a
03b0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03c0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03d0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03e0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03f0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0400: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0410: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62  efine sqlite3Deb
0420: 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a  ugPrintf printf.
0430: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0440: 43 45 31 28 58 29 20 20 20 20 20 20 20 73 71 6c  CE1(X)       sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
0460: 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  X).#define PAGER
0470: 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20  TRACE2(X,Y)     
0480: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0490: 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  tf(X,Y).#define 
04a0: 50 41 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c  PAGERTRACE3(X,Y,
04b0: 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  Z)   sqlite3Debu
04c0: 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23  gPrintf(X,Y,Z).#
04d0: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
04e0: 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69  E4(X,Y,Z,W) sqli
04f0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0500: 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20  ,Y,Z,W).#define 
0510: 50 41 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c  PAGERTRACE5(X,Y,
0520: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0530: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0540: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0550: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0560: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0570: 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69  RACE2(X,Y).#defi
0580: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
0590: 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Y,Z).#define PA
05a0: 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c  GERTRACE4(X,Y,Z,
05b0: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
05c0: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
05d0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
05e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
05f0: 6f 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65  o macros are use
0600: 64 20 77 69 74 68 69 6e 20 74 68 65 20 50 41 47  d within the PAG
0610: 45 52 54 52 41 43 45 58 28 29 20 6d 61 63 72 6f  ERTRACEX() macro
0620: 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 70 72  s above.** to pr
0630: 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64 65 73  int out file-des
0640: 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a  criptors. .**.**
0650: 20 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73   PAGERID() takes
0660: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
0670: 50 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20  Pager struct as 
0680: 69 74 27 73 20 61 72 67 75 6d 65 6e 74 2e 20 54  it's argument. T
0690: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
06a0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
06b0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49   is returned. FI
06c0: 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b  LEHANDLEID() tak
06d0: 65 73 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69  es an sqlite3_fi
06e0: 6c 65 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20  le.** struct as 
06f0: 69 74 27 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  it's argument..*
0700: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 49  /.#define PAGERI
0710: 44 28 70 29 20 28 28 69 6e 74 29 28 70 2d 3e 66  D(p) ((int)(p->f
0720: 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45  d)).#define FILE
0730: 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69  HANDLEID(fd) ((i
0740: 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  nt)fd)../*.** Th
0750: 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73 20  e page cache as 
0760: 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79  a whole is alway
0770: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
0780: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
0790: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  tes:.**.**   PAG
07a0: 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20  ER_UNLOCK       
07b0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
07c0: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
07d0: 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20   reading or .** 
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74 68        writing th
0800: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0810: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a    There is no.**
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c 64         data held
0840: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
0850: 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
0860: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0870: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 2e            state.
0880: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53  .**.**   PAGER_S
0890: 48 41 52 45 44 20 20 20 20 20 20 20 20 54 68 65  HARED        The
08a0: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 72   page cache is r
08b0: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
08c0: 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ase..**         
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72                Wr
08e0: 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72  iting is not per
08f0: 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20 63  mitted.  There c
0900: 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  an be.**        
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
0920: 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
0930: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
0940: 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  me database.**  
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68 65       file at the
0970: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   same time..**.*
0980: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
0990: 45 44 20 20 20 20 20 20 54 68 69 73 20 70 72 6f  ED      This pro
09a0: 63 65 73 73 20 68 61 73 20 72 65 73 65 72 76 65  cess has reserve
09b0: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
09c0: 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20  or writing.**   
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20      but has not 
09f0: 79 65 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61  yet made any cha
0a00: 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20  nges.  Only one 
0a10: 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20  process.**      
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a30: 20 61 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72   at a time can r
0a40: 65 73 65 72 76 65 20 74 68 65 20 64 61 74 61 62  eserve the datab
0a50: 61 73 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e  ase.  The origin
0a60: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0a80: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f  base file has no
0a90: 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  t been modified 
0aa0: 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20  so other.**     
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 20 20 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20    processes may 
0ad0: 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
0ae0: 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20   the on-disk.** 
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
0b10: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ile..**.**   PAG
0b20: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20  ER_EXCLUSIVE    
0b30: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0b40: 69 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  is writing the d
0b50: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20  atabase..**     
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 20 20 41 63 63 65 73 73 20 69 73 20 65 78 63 6c    Access is excl
0b80: 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72  usive.  No other
0b90: 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a   processes or.**
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20 63         threads c
0bc0: 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72  an be reading or
0bd0: 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f   writing while o
0be0: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ne.**           
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63              proc
0c00: 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a  ess is writing..
0c10: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59  **.**   PAGER_SY
0c20: 4e 43 45 44 20 20 20 20 20 20 20 20 54 68 65 20  NCED        The 
0c30: 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74  pager moves to t
0c40: 68 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50  his state from P
0c50: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a  AGER_EXCLUSIVE.*
0c60: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0c70: 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61 6c          after al
0c80: 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68 61  l dirty pages ha
0c90: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
0ca0: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
0cd0: 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 62  d the file has b
0ce0: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a  een synced to.**
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c         disk. All
0d10: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f   that remains to
0d20: 20 64 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65   do is to remove
0d30: 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   or.**          
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 75               tru
0d50: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
0d60: 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 74  l file and the t
0d70: 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20  ransaction .**  
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d       will be com
0da0: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
0db0: 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d  e page cache com
0dc0: 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55  es up in PAGER_U
0dd0: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0de0: 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69  t time a.** sqli
0df0: 74 65 33 50 61 67 65 72 47 65 74 28 29 20 6f 63  te3PagerGet() oc
0e00: 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65 20  curs, the state 
0e10: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50  transitions to P
0e20: 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20  AGER_SHARED..** 
0e30: 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20  After all pages 
0e40: 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73  have been releas
0e50: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f  ed using sqlite_
0e60: 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a  page_unref(),.**
0e70: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0e80: 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50  itions back to P
0e90: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0ea0: 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20  e first time.** 
0eb0: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
0ec0: 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
0ed0: 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  ed, the state tr
0ee0: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20  ansitions to.** 
0ef0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20  PAGER_RESERVED. 
0f00: 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69   (Note that sqli
0f10: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
0f20: 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63  can only be.** c
0f30: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73  alled on an outs
0f40: 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69  tanding page whi
0f50: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ch means that th
0f60: 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20  e pager must.** 
0f70: 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52  be in PAGER_SHAR
0f80: 45 44 20 62 65 66 6f 72 65 20 69 74 20 74 72 61  ED before it tra
0f90: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45  nsitions to PAGE
0fa0: 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20  R_RESERVED.).** 
0fb0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 6d  PAGER_RESERVED m
0fc0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20  eans that there 
0fd0: 69 73 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62  is an open rollb
0fe0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  ack journal..** 
0ff0: 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74  The transition t
1000: 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  o PAGER_EXCLUSIV
1010: 45 20 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20  E occurs before 
1020: 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61  any changes.** a
1030: 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
1040: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
1050: 6f 75 67 68 20 77 72 69 74 65 73 20 74 6f 20 74  ough writes to t
1060: 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a  he rollback.** j
1070: 6f 75 72 6e 61 6c 20 6f 63 63 75 72 73 20 77 69  ournal occurs wi
1080: 74 68 20 6a 75 73 74 20 50 41 47 45 52 5f 52 45  th just PAGER_RE
1090: 53 45 52 56 45 44 2e 20 20 41 66 74 65 72 20 61  SERVED.  After a
10a0: 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  n sqlite3PagerRo
10b0: 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73  llback().** or s
10c0: 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
10d0: 74 50 68 61 73 65 54 77 6f 28 29 2c 20 74 68 65  tPhaseTwo(), the
10e0: 20 73 74 61 74 65 20 63 61 6e 20 67 6f 20 62 61   state can go ba
10f0: 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
1100: 45 44 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e  ED,.** or it can
1110: 20 73 74 61 79 20 61 74 20 50 41 47 45 52 5f 45   stay at PAGER_E
1120: 58 43 4c 55 53 49 56 45 20 69 66 20 77 65 20 61  XCLUSIVE if we a
1130: 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  re in exclusive 
1140: 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a  access mode..*/.
1150: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e  #define PAGER_UN
1160: 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66  LOCK      0.#def
1170: 69 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45 44  ine PAGER_SHARED
1180: 20 20 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d        1   /* sam
1190: 65 20 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b  e as SHARED_LOCK
11a0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
11b0: 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 32 20  R_RESERVED    2 
11c0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53    /* same as RES
11d0: 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64  ERVED_LOCK */.#d
11e0: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c  efine PAGER_EXCL
11f0: 55 53 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73  USIVE   4   /* s
1200: 61 6d 65 20 61 73 20 45 58 43 4c 55 53 49 56 45  ame as EXCLUSIVE
1210: 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65  _LOCK */.#define
1220: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
1230: 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74     5../*.** If t
1240: 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  he SQLITE_BUSY_R
1250: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63  ESERVED_LOCK mac
1260: 72 6f 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ro is set to tru
1270: 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  e at compile-tim
1280: 65 2c 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65  e,.** then faile
1290: 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65  d attempts to ge
12a0: 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  t a reserved loc
12b0: 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68  k will invoke th
12c0: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e  e busy callback.
12d0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20  .** This is off 
12e0: 62 79 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20  by default.  To 
12f0: 73 65 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65  see why, conside
1300: 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
1310: 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a  scenario:.** .**
1320: 20 53 75 70 70 6f 73 65 20 74 68 72 65 61 64 20   Suppose thread 
1330: 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
1340: 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20  shared lock and 
1350: 77 61 6e 74 73 20 61 20 72 65 73 65 72 76 65 64  wants a reserved
1360: 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64   lock..** Thread
1370: 20 42 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   B already has a
1380: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61   reserved lock a
1390: 6e 64 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c  nd wants an excl
13a0: 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a  usive lock.  If.
13b0: 2a 2a 20 62 6f 74 68 20 74 68 72 65 61 64 73 20  ** both threads 
13c0: 61 72 65 20 75 73 69 6e 67 20 74 68 65 69 72 20  are using their 
13d0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20  busy callbacks, 
13e0: 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f  it might be a lo
13f0: 6e 67 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f  ng time.** be fo
1400: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72  r one of the thr
1410: 65 61 64 73 20 67 69 76 65 20 75 70 20 61 6e 64  eads give up and
1420: 20 61 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65   allows the othe
1430: 72 20 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a  r to proceed..**
1440: 20 42 75 74 20 69 66 20 74 68 65 20 74 68 72 65   But if the thre
1450: 61 64 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74  ad trying to get
1460: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f   the reserved lo
1470: 63 6b 20 67 69 76 65 73 20 75 70 20 71 75 69 63  ck gives up quic
1480: 6b 6c 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65  kly.** (if it ne
1490: 76 65 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20  ver invokes its 
14a0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74  busy callback) t
14b0: 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69  hen the contenti
14c0: 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65  on will be.** re
14d0: 73 6f 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a  solved quickly..
14e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
14f0: 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
1500: 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51  LOCK.# define SQ
1510: 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56  LITE_BUSY_RESERV
1520: 45 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66  ED_LOCK 0.#endif
1530: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63  ../*.** This mac
1540: 72 6f 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73  ro rounds values
1550: 20 75 70 20 73 6f 20 74 68 61 74 20 69 66 20 74   up so that if t
1560: 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61  he value is an a
1570: 64 64 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20  ddress it.** is 
1580: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1590: 20 61 6e 20 61 64 64 72 65 73 73 20 74 68 61 74   an address that
15a0: 20 69 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61   is aligned to a
15b0: 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72  n 8-byte boundar
15c0: 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f  y..*/.#define FO
15d0: 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29  RCE_ALIGNMENT(X)
15e0: 20 20 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a     (((X)+7)&~7).
15f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1600: 50 67 48 64 72 20 50 67 48 64 72 3b 0a 0a 2f 2a  PgHdr PgHdr;../*
1610: 0a 2a 2a 20 45 61 63 68 20 70 61 67 65 72 20 73  .** Each pager s
1620: 74 6f 72 65 73 20 61 6c 6c 20 63 75 72 72 65 6e  tores all curren
1630: 74 6c 79 20 75 6e 72 65 66 65 72 65 6e 63 65 64  tly unreferenced
1640: 20 70 61 67 65 73 20 69 6e 20 61 20 6c 69 73 74   pages in a list
1650: 20 73 6f 72 74 65 64 0a 2a 2a 20 69 6e 20 6c 65   sorted.** in le
1660: 61 73 74 2d 72 65 63 65 6e 74 6c 79 2d 75 73 65  ast-recently-use
1670: 64 20 28 4c 52 55 29 20 6f 72 64 65 72 20 28 69  d (LRU) order (i
1680: 2e 65 2e 20 74 68 65 20 66 69 72 73 74 20 69 74  .e. the first it
1690: 65 6d 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 68  em on the list h
16a0: 61 73 20 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20  as .** not been 
16b0: 72 65 66 65 72 65 6e 63 65 64 20 69 6e 20 61 20  referenced in a 
16c0: 6c 6f 6e 67 20 74 69 6d 65 2c 20 74 68 65 20 6c  long time, the l
16d0: 61 73 74 20 69 74 65 6d 20 68 61 73 20 62 65 65  ast item has bee
16e0: 6e 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 75 73  n recently.** us
16f0: 65 64 29 2e 20 41 6e 20 69 6e 73 74 61 6e 63 65  ed). An instance
1700: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
1710: 72 65 20 69 73 20 69 6e 63 6c 75 64 65 64 20 61  re is included a
1720: 73 20 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a  s part of each.*
1730: 2a 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  * pager structur
1740: 65 20 66 6f 72 20 74 68 69 73 20 70 75 72 70 6f  e for this purpo
1750: 73 65 20 28 76 61 72 69 61 62 6c 65 20 50 61 67  se (variable Pag
1760: 65 72 2e 6c 72 75 29 2e 0a 2a 2a 0a 2a 2a 20 41  er.lru)..**.** A
1770: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20  dditionally, if 
1780: 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e  memory-managemen
1790: 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c  t is enabled, al
17a0: 6c 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70  l unreferenced p
17b0: 61 67 65 73 20 0a 2a 2a 20 61 72 65 20 73 74 6f  ages .** are sto
17c0: 72 65 64 20 69 6e 20 61 20 67 6c 6f 62 61 6c 20  red in a global 
17d0: 4c 52 55 20 6c 69 73 74 20 28 67 6c 6f 62 61 6c  LRU list (global
17e0: 20 76 61 72 69 61 62 6c 65 20 73 71 6c 69 74 65   variable sqlite
17f0: 33 4c 72 75 50 61 67 65 4c 69 73 74 29 2e 0a 2a  3LruPageList)..*
1800: 2a 0a 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73  *.** In both cas
1810: 65 73 2c 20 74 68 65 20 50 61 67 65 72 4c 72 75  es, the PagerLru
1820: 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65  List.pFirstSynce
1830: 64 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74  d variable point
1840: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 66 69 72 73  s to.** the firs
1850: 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 6f  t page in the co
1860: 72 72 65 73 70 6f 6e 64 69 6e 67 20 6c 69 73 74  rresponding list
1870: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
1880: 65 71 75 69 72 65 20 61 6e 0a 2a 2a 20 66 73 79  equire an.** fsy
1890: 6e 63 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 62  nc() operation b
18a0: 65 66 6f 72 65 20 69 74 27 73 20 6d 65 6d 6f 72  efore it's memor
18b0: 79 20 63 61 6e 20 62 65 20 72 65 63 6c 61 69 6d  y can be reclaim
18c0: 65 64 2e 20 49 66 20 6e 6f 20 73 75 63 68 0a 2a  ed. If no such.*
18d0: 2a 20 70 61 67 65 20 65 78 69 73 74 73 2c 20 50  * page exists, P
18e0: 61 67 65 72 4c 72 75 4c 69 73 74 2e 70 46 69 72  agerLruList.pFir
18f0: 73 74 53 79 6e 63 65 64 20 69 73 20 73 65 74 20  stSynced is set 
1900: 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 74 79 70 65  to NULL..*/.type
1910: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
1920: 4c 72 75 4c 69 73 74 20 50 61 67 65 72 4c 72 75  LruList PagerLru
1930: 4c 69 73 74 3b 0a 73 74 72 75 63 74 20 50 61 67  List;.struct Pag
1940: 65 72 4c 72 75 4c 69 73 74 20 7b 0a 20 20 50 67  erLruList {.  Pg
1950: 48 64 72 20 2a 70 46 69 72 73 74 3b 20 20 20 20  Hdr *pFirst;    
1960: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
1970: 67 65 20 69 6e 20 4c 52 55 20 6c 69 73 74 20 2a  ge in LRU list *
1980: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 61 73 74  /.  PgHdr *pLast
1990: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  ;          /* La
19a0: 73 74 20 70 61 67 65 20 69 6e 20 4c 52 55 20 6c  st page in LRU l
19b0: 69 73 74 20 28 74 68 65 20 6d 6f 73 74 20 72 65  ist (the most re
19c0: 63 65 6e 74 6c 79 20 75 73 65 64 29 20 2a 2f 0a  cently used) */.
19d0: 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 53    PgHdr *pFirstS
19e0: 79 6e 63 65 64 3b 20 20 20 2f 2a 20 46 69 72 73  ynced;   /* Firs
19f0: 74 20 70 61 67 65 20 69 6e 20 6c 69 73 74 20 77  t page in list w
1a00: 69 74 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79  ith PgHdr.needSy
1a10: 6e 63 3d 3d 30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  nc==0 */.};../*.
1a20: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1a30: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
1a40: 69 6e 73 20 74 68 65 20 6e 65 78 74 20 61 6e 64  ins the next and
1a50: 20 70 72 65 76 69 6f 75 73 20 70 6f 69 6e 74 65   previous pointe
1a60: 72 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 69  rs used.** to li
1a70: 6e 6b 20 61 20 50 67 48 64 72 20 73 74 72 75 63  nk a PgHdr struc
1a80: 74 75 72 65 20 69 6e 74 6f 20 61 20 50 61 67 65  ture into a Page
1a90: 72 4c 72 75 4c 69 73 74 20 6c 69 6e 6b 65 64 20  rLruList linked 
1aa0: 6c 69 73 74 2e 20 0a 2a 2f 0a 74 79 70 65 64 65  list. .*/.typede
1ab0: 66 20 73 74 72 75 63 74 20 50 61 67 65 72 4c 72  f struct PagerLr
1ac0: 75 4c 69 6e 6b 20 50 61 67 65 72 4c 72 75 4c 69  uLink PagerLruLi
1ad0: 6e 6b 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72  nk;.struct Pager
1ae0: 4c 72 75 4c 69 6e 6b 20 7b 0a 20 20 50 67 48 64  LruLink {.  PgHd
1af0: 72 20 2a 70 4e 65 78 74 3b 0a 20 20 50 67 48 64  r *pNext;.  PgHd
1b00: 72 20 2a 70 50 72 65 76 3b 0a 7d 3b 0a 0a 2f 2a  r *pPrev;.};../*
1b10: 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f  .** Each in-memo
1b20: 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61  ry image of a pa
1b30: 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  ge begins with t
1b40: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61  he following hea
1b50: 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61  der..** This hea
1b60: 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69  der is only visi
1b70: 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  ble to this page
1b80: 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63  r module.  The c
1b90: 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68  lient.** code th
1ba0: 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73  at calls pager s
1bb0: 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74  ees only the dat
1bc0: 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74  a that follows t
1bd0: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
1be0: 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f   Client code sho
1bf0: 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  uld call sqlite3
1c00: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
1c10: 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  a page prior to 
1c20: 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f  making.** any mo
1c30: 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74  difications to t
1c40: 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66  hat page.  The f
1c50: 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65  irst time sqlite
1c60: 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
1c70: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1c80: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
1c90: 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69 74 74  ntents are writt
1ca0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c  en into the roll
1cb0: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
1cc0: 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72  and PgHdr.inJour
1cd0: 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65  nal and PgHdr.ne
1ce0: 65 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20  edSync are set. 
1cf0: 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20   Later, once.** 
1d00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  the journal page
1d10: 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74   has made it ont
1d20: 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
1d30: 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79  ce, PgHdr.needSy
1d40: 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64  nc.** is cleared
1d50: 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20  .  The modified 
1d60: 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77  page cannot be w
1d70: 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
1d80: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1d90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
1da0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
1db0: 20 70 61 67 65 73 20 68 61 73 20 62 65 65 6e 20   pages has been 
1dc0: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61  synced to disk a
1dd0: 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e  nd the.** PgHdr.
1de0: 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62 65 65  needSync has bee
1df0: 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  n cleared..**.**
1e00: 20 54 68 65 20 50 67 48 64 72 2e 64 69 72 74 79   The PgHdr.dirty
1e10: 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65   flag is set whe
1e20: 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
1e30: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1e40: 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  and.** is cleare
1e50: 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65  d again when the
1e60: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
1e70: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
1e80: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1ea0: 2a 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66  **.** Details of
1eb0: 20 69 6d 70 6f 72 74 61 6e 74 20 73 74 72 75 63   important struc
1ec0: 74 75 72 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a  ture elements:.*
1ed0: 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a  *.** needSync.**
1ee0: 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 69 73 20  .**     If this 
1ef0: 69 73 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65  is true, this me
1f00: 61 6e 73 20 74 68 61 74 20 69 74 20 69 73 20 6e  ans that it is n
1f10: 6f 74 20 73 61 66 65 20 74 6f 20 77 72 69 74 65  ot safe to write
1f20: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20   the page.**    
1f30: 20 63 6f 6e 74 65 6e 74 20 74 6f 20 74 68 65 20   content to the 
1f40: 64 61 74 61 62 61 73 65 20 62 65 63 61 75 73 65  database because
1f50: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f   the original co
1f60: 6e 74 65 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20  ntent needed.** 
1f70: 20 20 20 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b      for rollback
1f80: 20 68 61 73 20 6e 6f 74 20 62 79 20 73 79 6e 63   has not by sync
1f90: 65 64 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 72  ed to the main r
1fa0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
1fb0: 0a 2a 2a 20 20 20 20 20 54 68 65 20 6f 72 69 67  .**     The orig
1fc0: 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79  inal content may
1fd0: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
1fe0: 65 6e 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61  en to the rollba
1ff0: 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  ck journal.**   
2000: 20 20 62 75 74 20 69 74 20 68 61 73 20 6e 6f 74    but it has not
2010: 20 79 65 74 20 62 65 65 6e 20 73 79 6e 63 65 64   yet been synced
2020: 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20  .  So we cannot 
2030: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74  write to the dat
2040: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c  abase.**     fil
2050: 65 20 62 65 63 61 75 73 65 20 70 6f 77 65 72 20  e because power 
2060: 66 61 69 6c 75 72 65 20 6d 69 67 68 74 20 63 61  failure might ca
2070: 75 73 65 20 74 68 65 20 70 61 67 65 20 69 6e 20  use the page in 
2080: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2090: 0a 2a 2a 20 20 20 20 20 74 6f 20 6e 65 76 65 72  .**     to never
20a0: 20 72 65 61 63 68 20 74 68 65 20 64 69 73 6b 2e   reach the disk.
20b0: 20 20 49 74 20 69 73 20 61 73 20 69 66 20 74 68    It is as if th
20c0: 65 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  e write to the j
20d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
20e0: 20 20 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75     does not occu
20f0: 72 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72  r until the jour
2100: 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
2110: 65 64 2e 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20  ed..**     .**  
2120: 20 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20     This flag is 
2130: 66 61 6c 73 65 20 69 66 20 74 68 65 20 70 61 67  false if the pag
2140: 65 20 63 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c  e content exactl
2150: 79 20 6d 61 74 63 68 65 73 20 77 68 61 74 0a 2a  y matches what.*
2160: 2a 20 20 20 20 20 63 75 72 72 65 6e 74 6c 79 20  *     currently 
2170: 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 64 61  exists in the da
2180: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
2190: 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
21a0: 69 73 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66  is also.**     f
21b0: 61 6c 73 65 20 69 66 20 74 68 65 20 6f 72 69 67  alse if the orig
21c0: 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  inal content has
21d0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
21e0: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
21f0: 63 6b 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  ck.**     journa
2200: 6c 20 61 6e 64 20 73 79 6e 63 65 64 2e 20 20 49  l and synced.  I
2210: 66 20 74 68 65 20 70 61 67 65 20 72 65 70 72 65  f the page repre
2220: 73 65 6e 74 73 20 61 20 6e 65 77 20 70 61 67 65  sents a new page
2230: 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 20 20 20   that has.**    
2240: 20 62 65 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f   been added onto
2250: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2260: 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
2270: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20  the current.**  
2280: 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20     transaction, 
2290: 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61  the needSync fla
22a0: 67 20 69 73 20 74 72 75 65 20 75 6e 74 69 6c 20  g is true until 
22b0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
22c0: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a  abase.**     siz
22d0: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
22e0: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
22f0: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
2300: 0a 2a 2a 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c  .**.** inJournal
2310: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20  .**.**     This 
2320: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
2330: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 68 61 73  riginal page has
2340: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e   been written in
2350: 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20  to the main.**  
2360: 20 20 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72     rollback jour
2370: 6e 61 6c 2e 20 20 54 68 69 73 20 69 73 20 61 6c  nal.  This is al
2380: 77 61 79 73 20 66 61 6c 73 65 20 66 6f 72 20 6e  ways false for n
2390: 65 77 20 70 61 67 65 73 20 61 64 64 65 64 20 74  ew pages added t
23a0: 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 65 6e 64  o.**     the end
23b0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
23c0: 20 66 69 6c 65 20 64 75 72 69 6e 67 20 74 68 65   file during the
23d0: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
23e0: 74 69 6f 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64  tion..**     And
23f0: 20 74 68 69 73 20 66 6c 61 67 20 73 61 79 73 20   this flag says 
2400: 6e 6f 74 68 69 6e 67 20 61 62 6f 75 74 20 77 68  nothing about wh
2410: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
2420: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
2430: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
2440: 74 6f 20 64 69 73 6b 2e 20 20 46 6f 72 20 70 61  to disk.  For pa
2450: 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20  ges that are in 
2460: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
2470: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
2480: 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
2490: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 68 6f 75   expression shou
24a0: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 72 75  ld always be tru
24b0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69  e:.**.**       i
24c0: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67  nJournal = (pPag
24d0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 28  er->aInJournal[(
24e0: 70 67 6e 6f 2d 31 29 2f 38 5d 20 26 20 28 31 3c  pgno-1)/8] & (1<
24f0: 3c 28 28 70 67 6e 6f 2d 31 29 25 38 29 29 21 3d  <((pgno-1)%8))!=
2500: 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65 20  0.**.**     The 
2510: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
2520: 61 6c 5b 5d 20 61 72 72 61 79 20 69 73 20 6f 6e  al[] array is on
2530: 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65  ly valid for the
2540: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   original.**    
2550: 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 64 61   pages of the da
2560: 74 61 62 61 73 65 2c 20 6e 6f 74 20 6e 65 77 20  tabase, not new 
2570: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
2580: 64 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64 0a  dded to the end.
2590: 2a 2a 20 20 20 20 20 6f 66 20 74 68 65 20 64 61  **     of the da
25a0: 74 61 62 61 73 65 2c 20 73 6f 20 6f 62 76 69 6f  tabase, so obvio
25b0: 75 73 6c 79 20 74 68 65 20 61 62 6f 76 65 20 65  usly the above e
25c0: 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 6e 6f 74  xpression cannot
25d0: 20 62 65 0a 2a 2a 20 20 20 20 20 76 61 6c 69 64   be.**     valid
25e0: 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73 2e 20   for new pages. 
25f0: 20 46 6f 72 20 6e 65 77 20 70 61 67 65 73 20 69   For new pages i
2600: 6e 4a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77 61  nJournal is alwa
2610: 79 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72 74  ys 0..**.** dirt
2620: 79 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 6e  y.**.**     When
2630: 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e   true, this mean
2640: 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  s that the conte
2650: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  nt of the page h
2660: 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20 6d  as been.**     m
2670: 6f 64 69 66 69 65 64 20 61 6e 64 20 6e 65 65 64  odified and need
2680: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
2690: 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61  back to the data
26a0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
26b0: 20 20 49 66 20 66 61 6c 73 65 2c 20 69 74 20 6d    If false, it m
26c0: 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72  eans that either
26d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
26e0: 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20 20  the page is.**  
26f0: 20 20 20 75 6e 63 68 61 6e 67 65 64 20 6f 72 20     unchanged or 
2700: 65 6c 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  else the content
2710: 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74 20   is unimportant 
2720: 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a  and we do not.**
2730: 20 20 20 20 20 63 61 72 65 20 77 68 65 74 68 65       care whethe
2740: 72 20 6f 72 20 6e 6f 74 20 69 74 20 69 73 20 70  r or not it is p
2750: 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  reserved..**.** 
2760: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 2a  alwaysRollback.*
2770: 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 6d 65  *.**     This me
2780: 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  ans that the sql
2790: 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
27a0: 6c 62 61 63 6b 28 29 20 41 50 49 20 73 68 6f 75  lback() API shou
27b0: 6c 64 20 62 65 0a 2a 2a 20 20 20 20 20 69 67 6e  ld be.**     ign
27c0: 6f 72 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  ored for this pa
27d0: 67 65 2e 20 20 54 68 65 20 44 6f 6e 74 52 6f 6c  ge.  The DontRol
27e0: 6c 62 61 63 6b 28 29 20 41 50 49 20 61 74 74 65  lback() API atte
27f0: 6d 70 74 73 20 74 6f 20 73 61 79 0a 2a 2a 20 20  mpts to say.**  
2800: 20 20 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74     that the cont
2810: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
2820: 6f 6e 20 64 69 73 6b 20 69 73 20 75 6e 69 6d 70  on disk is unimp
2830: 6f 72 74 61 6e 74 20 28 69 74 20 69 73 20 61 6e  ortant (it is an
2840: 0a 2a 2a 20 20 20 20 20 75 6e 75 73 65 64 20 70  .**     unused p
2850: 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  age on the freel
2860: 69 73 74 29 20 73 6f 20 74 68 61 74 20 69 74 20  ist) so that it 
2870: 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 74  is unnecessary t
2880: 6f 20 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62 61  o .**     rollba
2890: 63 6b 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ck changes to th
28a0: 69 73 20 70 61 67 65 20 62 65 63 61 75 73 65 20  is page because 
28b0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
28c0: 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63  he page.**     c
28d0: 61 6e 20 63 68 61 6e 67 65 20 77 69 74 68 6f 75  an change withou
28e0: 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6d  t changing the m
28f0: 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  eaning of the da
2900: 74 61 62 61 73 65 2e 20 20 54 68 69 73 0a 2a 2a  tabase.  This.**
2910: 20 20 20 20 20 66 6c 61 67 20 6f 76 65 72 72 69       flag overri
2920: 64 65 73 20 61 6e 79 20 44 6f 6e 74 52 6f 6c 6c  des any DontRoll
2930: 62 61 63 6b 28 29 20 61 74 74 65 6d 70 74 2e 20  back() attempt. 
2940: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65   This flag is se
2950: 74 0a 2a 2a 20 20 20 20 20 77 68 65 6e 20 61 20  t.**     when a 
2960: 70 61 67 65 20 74 68 61 74 20 6f 72 69 67 69 6e  page that origin
2970: 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 76  ally contained v
2980: 61 6c 69 64 20 64 61 74 61 20 69 73 20 61 64 64  alid data is add
2990: 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  ed to.**     the
29a0: 20 66 72 65 65 6c 69 73 74 2e 20 20 4c 61 74 65   freelist.  Late
29b0: 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74 72  r in the same tr
29c0: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20  ansaction, this 
29d0: 70 61 67 65 20 6d 69 67 68 74 0a 2a 2a 20 20 20  page might.**   
29e0: 20 20 62 65 20 70 75 6c 6c 65 64 20 66 72 6f 6d    be pulled from
29f0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e   the freelist an
2a00: 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d  d reused for som
2a10: 65 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ething different
2a20: 0a 2a 2a 20 20 20 20 20 61 6e 64 20 61 74 20 74  .**     and at t
2a30: 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20 44 6f  hat point the Do
2a40: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50 49  ntRollback() API
2a50: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
2a60: 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20 70  because.**     p
2a70: 61 67 65 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  ages taken from 
2a80: 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 6f 20  the freelist do 
2a90: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70  not need to be p
2aa0: 72 6f 74 65 63 74 65 64 20 62 79 0a 2a 2a 20 20  rotected by.**  
2ab0: 20 20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20     the rollback 
2ac0: 6a 6f 75 72 6e 61 6c 2e 20 20 42 75 74 20 74 68  journal.  But th
2ad0: 69 73 20 66 6c 61 67 20 73 61 79 73 20 74 68 61  is flag says tha
2ae0: 74 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a  t the page was.*
2af0: 2a 20 20 20 20 20 6e 6f 74 20 6f 72 69 67 69 6e  *     not origin
2b00: 61 6c 6c 79 20 70 61 72 74 20 6f 66 20 74 68 65  ally part of the
2b10: 20 66 72 65 65 6c 69 73 74 20 73 6f 20 74 68 61   freelist so tha
2b20: 74 20 69 74 20 73 74 69 6c 6c 20 6e 65 65 64 73  t it still needs
2b30: 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65 20 72 6f   to.**     be ro
2b40: 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69  lled back in spi
2b50: 74 65 20 6f 66 20 61 6e 79 20 73 75 62 73 65 71  te of any subseq
2b60: 75 65 6e 74 20 44 6f 6e 74 52 6f 6c 6c 62 61 63  uent DontRollbac
2b70: 6b 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  k() calls..**.**
2b80: 20 6e 65 65 64 52 65 61 64 20 0a 2a 2a 0a 2a 2a   needRead .**.**
2b90: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 6d       This flag m
2ba0: 65 61 6e 73 20 28 77 68 65 6e 20 74 72 75 65 29  eans (when true)
2bb0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
2bc0: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 61  t of the page ha
2bd0: 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 79 65 74  s.**     not yet
2be0: 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 66 72 6f   been loaded fro
2bf0: 6d 20 64 69 73 6b 2e 20 20 54 68 65 20 69 6e 2d  m disk.  The in-
2c00: 6d 65 6d 6f 72 79 20 63 6f 6e 74 65 6e 74 20 69  memory content i
2c10: 73 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 67 61  s just.**     ga
2c20: 72 62 61 67 65 2e 20 20 28 41 63 74 75 61 6c 6c  rbage.  (Actuall
2c30: 79 2c 20 77 65 20 7a 65 72 6f 20 74 68 65 20 63  y, we zero the c
2c40: 6f 6e 74 65 6e 74 2c 20 62 75 74 20 79 6f 75 20  ontent, but you 
2c50: 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20  should not.**   
2c60: 20 20 6d 61 6b 65 20 61 6e 79 20 61 73 73 75 6d    make any assum
2c70: 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 74 68 65  ptions about the
2c80: 20 63 6f 6e 74 65 6e 74 20 6e 65 76 65 72 74 68   content neverth
2c90: 65 6c 65 73 73 2e 29 20 20 49 66 20 74 68 65 0a  eless.)  If the.
2ca0: 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 69  **     content i
2cb0: 73 20 6e 65 65 64 65 64 20 69 6e 20 74 68 65 20  s needed in the 
2cc0: 66 75 74 75 72 65 2c 20 69 74 20 73 68 6f 75 6c  future, it shoul
2cd0: 64 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  d be read from t
2ce0: 68 65 0a 2a 2a 20 20 20 20 20 6f 72 69 67 69 6e  he.**     origin
2cf0: 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
2d00: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 67 48 64  ..*/.struct PgHd
2d10: 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  r {.  Pager *pPa
2d20: 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ger;            
2d30: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
2d40: 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20  r to which this 
2d50: 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a  page belongs */.
2d60: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d80: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
2d90: 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  ber for this pag
2da0: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  e */.  PgHdr *pN
2db0: 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76 48  extHash, *pPrevH
2dc0: 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f  ash;  /* Hash co
2dd0: 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f  llision chain fo
2de0: 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a  r PgHdr.pgno */.
2df0: 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 66    PagerLruLink f
2e00: 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ree;            
2e10: 20 2f 2a 20 4e 65 78 74 20 61 6e 64 20 70 72 65   /* Next and pre
2e20: 76 69 6f 75 73 20 66 72 65 65 20 70 61 67 65 73  vious free pages
2e30: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
2e40: 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  xtAll;          
2e50: 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f       /* A list o
2e60: 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20  f all pages */. 
2e70: 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20   u8 inJournal;  
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62  /* TRUE if has b
2ea0: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
2eb0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
2ec0: 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  irty;           
2ed0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
2ee0: 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  UE if we need to
2ef0: 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e   write back chan
2f00: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64  ges */.  u8 need
2f10: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
2f20: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20          /* Sync 
2f30: 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77  journal before w
2f40: 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67 65  riting this page
2f50: 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52   */.  u8 alwaysR
2f60: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  ollback;        
2f70: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
2f80: 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66  DontRollback() f
2f90: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
2fa0: 20 20 75 38 20 6e 65 65 64 52 65 61 64 3b 20 20    u8 needRead;  
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 20 2f 2a 20 52 65 61 64 20 63 6f 6e 74 65 6e 74   /* Read content
2fd0: 20 69 66 20 50 61 67 65 72 57 72 69 74 65 28 29   if PagerWrite()
2fe0: 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20   is called */.  
2ff0: 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b 20  short int nRef; 
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3010: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72  * Number of user
3020: 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a  s of this page *
3030: 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74  /.  PgHdr *pDirt
3040: 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79 3b 20  y, *pPrevDirty; 
3050: 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65     /* Dirty page
3060: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
3070: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
3080: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61  _MANAGEMENT.  Pa
3090: 67 65 72 4c 72 75 4c 69 6e 6b 20 67 66 72 65 65  gerLruLink gfree
30a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
30b0: 47 6c 6f 62 61 6c 20 6c 69 73 74 20 6f 66 20 6e  Global list of n
30c0: 52 65 66 3d 3d 30 20 70 61 67 65 73 20 2a 2f 0a  Ref==0 pages */.
30d0: 23 65 6e 64 69 66 0a 20 20 75 33 32 20 6e 6f 74  #endif.  u32 not
30e0: 55 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  Used;           
30f0: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
3100: 72 20 73 70 61 63 65 20 2a 2f 0a 23 69 66 64 65  r space */.#ifde
3110: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
3120: 41 47 45 53 0a 20 20 75 33 32 20 70 61 67 65 48  AGES.  u32 pageH
3130: 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  ash;.#endif.  /*
3140: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
3150: 65 20 62 79 74 65 73 20 6f 66 20 70 61 67 65 20  e bytes of page 
3160: 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73  data follow this
3170: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20   header */.  /* 
3180: 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74  Pager.nExtra byt
3190: 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61  es of local data
31a0: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67 65   follow the page
31b0: 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   data */.};../*.
31c0: 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ** For an in-mem
31d0: 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62 61 73  ory only databas
31e0: 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20 69 6e  e, some extra in
31f0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 63  formation is rec
3200: 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65  orded about.** e
3210: 61 63 68 20 70 61 67 65 20 73 6f 20 74 68 61 74  ach page so that
3220: 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20   changes can be 
3230: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a  rolled back.  (J
3240: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65  ournal files are
3250: 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72   not.** used for
3260: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
3270: 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c  ases.)  The foll
3280: 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  owing informatio
3290: 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a  n is added to.**
32a0: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
32b0: 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f  y EXTRA block fo
32c0: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
32d0: 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bases..**.** Thi
32e0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f  s information co
32f0: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 61 64  uld have been ad
3300: 64 65 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ded directly to 
3310: 74 68 65 20 50 67 48 64 72 20 73 74 72 75 63 74  the PgHdr struct
3320: 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e  ure..** But then
3330: 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 75   it would take u
3340: 70 20 61 6e 20 65 78 74 72 61 20 38 20 62 79 74  p an extra 8 byt
3350: 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e  es of storage on
3360: 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a 2a 20   every PgHdr.** 
3370: 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61  even for disk-ba
3380: 73 65 64 20 64 61 74 61 62 61 73 65 73 2e 20 20  sed databases.  
3390: 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f 75 74  Splitting it out
33a0: 20 73 61 76 65 73 20 38 20 62 79 74 65 73 2e 20   saves 8 bytes. 
33b0: 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79   This.** is only
33c0: 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20 30 2e   a savings of 0.
33d0: 38 25 20 62 75 74 20 74 68 6f 73 65 20 70 65 72  8% but those per
33e0: 63 65 6e 74 61 67 65 73 20 61 64 64 20 75 70 2e  centages add up.
33f0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
3400: 63 74 20 50 67 48 69 73 74 6f 72 79 20 50 67 48  ct PgHistory PgH
3410: 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74 20 50  istory;.struct P
3420: 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75 38 20  gHistory {.  u8 
3430: 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f  *pOrig;     /* O
3440: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74 65 78  riginal page tex
3450: 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f 20 74  t.  Restore to t
3460: 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f  his on a full ro
3470: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a  llback */.  u8 *
3480: 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65  pStmt;     /* Te
3490: 78 74 20 61 73 20 69 74 20 77 61 73 20 61 74 20  xt as it was at 
34a0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
34b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
34c0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 50 67 48 64  tement */.  PgHd
34d0: 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70  r *pNextStmt, *p
34e0: 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69  PrevStmt;  /* Li
34f0: 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  st of pages in t
3500: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
3510: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53  rnal */.  u8 inS
3520: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
3530: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
3540: 20 69 66 20 69 6e 20 74 68 65 20 73 74 61 74 65   if in the state
3550: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  ment subjournal 
3560: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d  */.};../*.** A m
3570: 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e  acro used for in
3580: 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63  voking the codec
3590: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
35a0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
35b0: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65  E_HAS_CODEC.# de
35c0: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
35d0: 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64  N,X) if( P->xCod
35e0: 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64  ec!=0 ){ P->xCod
35f0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
3600: 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69  D,N,X); }.# defi
3610: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
3620: 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d 3e 78  X) ((char*)(P->x
3630: 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64  Codec!=0?P->xCod
3640: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
3650: 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65  D,N,X):D)).#else
3660: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
3670: 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d  (P,D,N,X) /* NO-
3680: 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43  OP */.# define C
3690: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28  ODEC2(P,D,N,X) (
36a0: 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64 69 66  (char*)D).#endif
36b0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
36c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50  a pointer to a P
36d0: 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e  gHdr into a poin
36e0: 74 65 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a  ter to its data.
36f0: 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69  ** and back agai
3700: 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47  n..*/.#define PG
3710: 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20  HDR_TO_DATA(P)  
3720: 28 28 76 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d  ((void*)(&(P)[1]
3730: 29 29 0a 23 64 65 66 69 6e 65 20 44 41 54 41 5f  )).#define DATA_
3740: 54 4f 5f 50 47 48 44 52 28 44 29 20 20 28 26 28  TO_PGHDR(D)  (&(
3750: 28 50 67 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d  (PgHdr*)(D))[-1]
3760: 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f  ).#define PGHDR_
3770: 54 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28  TO_EXTRA(G,P) ((
3780: 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29 28  void*)&((char*)(
3790: 26 28 47 29 5b 31 5d 29 29 5b 28 50 29 2d 3e 70  &(G)[1]))[(P)->p
37a0: 61 67 65 53 69 7a 65 5d 29 0a 23 64 65 66 69 6e  ageSize]).#defin
37b0: 65 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  e PGHDR_TO_HIST(
37c0: 50 2c 50 47 52 29 20 20 5c 0a 20 20 20 20 20 20  P,PGR)  \.      
37d0: 20 20 20 20 20 20 28 28 50 67 48 69 73 74 6f 72        ((PgHistor
37e0: 79 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50  y*)&((char*)(&(P
37f0: 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e 70 61  )[1]))[(PGR)->pa
3800: 67 65 53 69 7a 65 2b 28 50 47 52 29 2d 3e 6e 45  geSize+(PGR)->nE
3810: 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  xtra])../*.** A 
3820: 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20  open page cache 
3830: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
3840: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
3850: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
3860: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 6d   Pager.errCode m
3870: 61 79 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c  ay be set to SQL
3880: 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
3890: 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a  E_CORRUPT, or.**
38a0: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e   or SQLITE_FULL.
38b0: 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65   Once one of the
38c0: 20 66 69 72 73 74 20 74 68 72 65 65 20 65 72 72   first three err
38d0: 6f 72 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70  ors occurs, it p
38e0: 65 72 73 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69  ersists.** and i
38f0: 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 74 68  s returned as th
3900: 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76 65 72  e result of ever
3910: 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20 41 50  y major pager AP
3920: 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20  I call.  The.** 
3930: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72 65 74 75  SQLITE_FULL retu
3940: 72 6e 20 63 6f 64 65 20 69 73 20 73 6c 69 67 68  rn code is sligh
3950: 74 6c 79 20 64 69 66 66 65 72 65 6e 74 2e 20 49  tly different. I
3960: 74 20 70 65 72 73 69 73 74 73 20 6f 6e 6c 79 20  t persists only 
3970: 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78  until the.** nex
3980: 74 20 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c  t successful rol
3990: 6c 62 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d  lback is perform
39a0: 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ed on the pager 
39b0: 63 61 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20  cache. Also,.** 
39c0: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73  SQLITE_FULL does
39d0: 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20   not affect the 
39e0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
39f0: 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  ) and sqlite3Pag
3a00: 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50  erLookup().** AP
3a10: 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69  Is, they may sti
3a20: 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65  ll be used succe
3a30: 73 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75  ssfully..*/.stru
3a40: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
3a50: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
3a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
3a70: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
3a80: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 6a  for IO */.  u8 j
3a90: 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20  ournalOpen;     
3aa0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3ab0: 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  if journal file 
3ac0: 64 65 73 63 72 69 70 74 6f 72 73 20 69 73 20 76  descriptors is v
3ad0: 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  alid */.  u8 jou
3ae0: 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20  rnalStarted;    
3af0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3b00: 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e   header of journ
3b10: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a  al is synced */.
3b20: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b40: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
3b50: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
3b60: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52  file */.  u8 noR
3b70: 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20  eadlock;        
3b80: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
3b90: 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e  bother to obtain
3ba0: 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20   readlocks */.  
3bb0: 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20  u8 stmtOpen;    
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3bd0: 72 75 65 20 69 66 20 74 68 65 20 73 74 61 74 65  rue if the state
3be0: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  ment subjournal 
3bf0: 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20  is open */.  u8 
3c00: 73 74 6d 74 49 6e 55 73 65 3b 20 20 20 20 20 20  stmtInUse;      
3c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3c20: 20 77 65 20 61 72 65 20 69 6e 20 61 20 73 74 61   we are in a sta
3c30: 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
3c40: 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74  ction */.  u8 st
3c50: 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20  mtAutoopen;     
3c60: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73         /* Open s
3c70: 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  tmt journal when
3c80: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73   main journal is
3c90: 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e   opened*/.  u8 n
3ca0: 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  oSync;          
3cb0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
3cc0: 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  t sync the journ
3cd0: 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  al if true */.  
3ce0: 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20  u8 fullSync;    
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3d00: 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66  o extra syncs of
3d10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
3d20: 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20   robustness */. 
3d30: 20 75 38 20 73 79 6e 63 5f 66 6c 61 67 73 3b 20   u8 sync_flags; 
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3d50: 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e 4f 52 4d  One of SYNC_NORM
3d60: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
3d70: 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20  */.  u8 state;  
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d90: 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   /* PAGER_UNLOCK
3da0: 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45  , _SHARED, _RESE
3db0: 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20  RVED, etc. */.  
3dc0: 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20  u8 tempFile;    
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
3de0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65  Filename is a te
3df0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mporary file */.
3e00: 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20    u8 readOnly;  
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3e20: 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
3e30: 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
3e40: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e60: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66 73  /* True if an fs
3e70: 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64 20  ync() is needed 
3e80: 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  on the journal *
3e90: 2f 0a 20 20 75 38 20 64 69 72 74 79 43 61 63 68  /.  u8 dirtyCach
3ea0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3eb0: 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65  /* True if cache
3ec0: 64 20 70 61 67 65 73 20 68 61 76 65 20 63 68 61  d pages have cha
3ed0: 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77  nged */.  u8 alw
3ee0: 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20  aysRollback;    
3ef0: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
3f00: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
3f10: 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f  for all pages */
3f20: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3f40: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
3f50: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
3f60: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
3f70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3f80: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
3f90: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
3fa0: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
3fb0: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63  /.  u8 doNotSync
3fc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3fd0: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c  /* Boolean. Whil
3fe0: 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73  e true, do not s
3ff0: 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a  pill the cache *
4000: 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65  /.  u8 exclusive
4010: 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Mode;           
4020: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65  /* Boolean. True
4030: 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   if locking_mode
4040: 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20  ==EXCLUSIVE */. 
4050: 20 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44   u8 changeCountD
4060: 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  one;         /* 
4070: 53 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d  Set after increm
4080: 65 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67  enting the chang
4090: 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  e-counter */.  u
40a0: 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20  32 vfsFlags;    
40b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
40c0: 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f  ags for sqlite3_
40d0: 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20  vfs.xOpen() */. 
40e0: 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20   int errCode;   
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4100: 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b  One of several k
4110: 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a  inds of errors *
4120: 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20  /.  int dbSize; 
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4140: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
4150: 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a  es in the file *
4160: 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69  /.  int origDbSi
4170: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
4180: 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65  /* dbSize before
4190: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61   the current cha
41a0: 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d  nge */.  int stm
41b0: 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  tSize;          
41c0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
41d0: 64 61 74 61 62 61 73 65 20 28 69 6e 20 70 61 67  database (in pag
41e0: 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69  es) at stmt_begi
41f0: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  n() */.  int nRe
4200: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
4210: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4220: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
4230: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  to the journal *
4240: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69  /.  u32 cksumIni
4250: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4260: 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20  /* Quasi-random 
4270: 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65  value added to e
4280: 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f  very checksum */
4290: 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b  .  int stmtNRec;
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
42b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  * Number of reco
42c0: 72 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a  rds in stmt subj
42d0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
42e0: 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20  nExtra;         
42f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
4300: 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74  his many bytes t
4310: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
4320: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70   page */.  int p
4330: 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
4340: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4350: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70   of bytes in a p
4360: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  age */.  int nPa
4370: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
4380: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
4390: 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
43a0: 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  y pages */.  int
43b0: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
43c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
43d0: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
43e0: 70 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72  pages with PgHdr
43f0: 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74  .nRef>0 */.  int
4400: 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20   mxPage;        
4410: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
4420: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  mum number of pa
4430: 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63  ges to hold in c
4440: 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  ache */.  Pgno m
4450: 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  xPgno;          
4460: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
4470: 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66   allowed size of
4480: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
4490: 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61  .  u8 *aInJourna
44a0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
44b0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
44c0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
44d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
44e0: 20 20 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20    u8 *aInStmt;  
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4500: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
4510: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
4520: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72  tabase */.  char
4530: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
4540: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
4550: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
4560: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
4570: 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
4580: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
4590: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
45a0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69  e */.  char *zDi
45b0: 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20  rectory;        
45c0: 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20     /* Directory 
45d0: 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e  hold database an
45e0: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  d journal files 
45f0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
4600: 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20 20 20  e *fd, *jfd;    
4610: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
4620: 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61 73  tors for databas
4630: 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f  e and journal */
4640: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
4650: 2a 73 74 66 64 3b 20 20 20 20 20 20 20 20 20 2f  *stfd;         /
4660: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
4670: 72 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d  r for the statem
4680: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f  ent subjournal*/
4690: 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  .  BusyHandler *
46a0: 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f  pBusyHandler;  /
46b0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
46c0: 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20  ite.busyHandler 
46d0: 2a 2f 0a 20 20 50 61 67 65 72 4c 72 75 4c 69 73  */.  PagerLruLis
46e0: 74 20 6c 72 75 3b 20 20 20 20 20 20 20 20 20 20  t lru;          
46f0: 20 2f 2a 20 4c 52 55 20 6c 69 73 74 20 6f 66 20   /* LRU list of 
4700: 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20  free pages */.  
4710: 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20  PgHdr *pAll;    
4720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
4730: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
4740: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 53 74   */.  PgHdr *pSt
4750: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
4760: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67    /* List of pag
4770: 65 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  es in the statem
4780: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a  ent subjournal *
4790: 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74  /.  PgHdr *pDirt
47a0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
47b0: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64  /* List of all d
47c0: 69 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20  irty pages */.  
47d0: 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20  i64 journalOff; 
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
47f0: 75 72 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73  urrent byte offs
4800: 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  et in the journa
4810: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
4820: 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20  journalHdr;     
4830: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
4840: 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f  offset to previo
4850: 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  us journal heade
4860: 72 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48  r */.  i64 stmtH
4870: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
4880: 20 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72     /* First jour
4890: 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74  nal header writt
48a0: 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  en this statemen
48b0: 74 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43  t */.  i64 stmtC
48c0: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
48d0: 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20     /* cksumInit 
48e0: 77 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77  when statement w
48f0: 61 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20  as started */.  
4900: 69 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20  i64 stmtJSize;  
4910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4920: 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ize of journal a
4930: 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a  t stmt_begin() *
4940: 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69  /.  int sectorSi
4950: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
4960: 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f  /* Assumed secto
4970: 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f  r size during ro
4980: 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66  llback */.#ifdef
4990: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
49a0: 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20  nt nHit, nMiss; 
49b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61             /* Ca
49c0: 63 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73  che hits and mis
49d0: 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  sing */.  int nR
49e0: 65 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20  ead, nWrite;    
49f0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
4a00: 65 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69  e pages read/wri
4a10: 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  tten */.#endif. 
4a20: 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63   void (*xDestruc
4a30: 74 6f 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74  tor)(DbPage*,int
4a40: 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20  ); /* Call this 
4a50: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65  routine when fre
4a60: 65 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  eing pages */.  
4a70: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
4a80: 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20  )(DbPage*,int); 
4a90: 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72    /* Call this r
4aa0: 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f  outine when relo
4ab0: 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23  ading pages */.#
4ac0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
4ad0: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
4ae0: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
4af0: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
4b00: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
4b10: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
4b20: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
4b30: 63 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  cArg;           
4b40: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
4b50: 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a  nt to xCodec() *
4b60: 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e  /.#endif.  int n
4b70: 48 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20  Hash;           
4b80: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
4b90: 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 68  f the pager hash
4ba0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 48 64   table */.  PgHd
4bb0: 72 20 2a 2a 61 48 61 73 68 3b 20 20 20 20 20 20  r **aHash;      
4bc0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20          /* Hash 
4bd0: 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67  table to map pag
4be0: 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64  e number to PgHd
4bf0: 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  r */.#ifdef SQLI
4c00: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
4c10: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61  _MANAGEMENT.  Pa
4c20: 67 65 72 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ger *pNext;     
4c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 75            /* Dou
4c40: 62 6c 79 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  bly linked list 
4c50: 6f 66 20 70 61 67 65 72 73 20 6f 6e 20 77 68 69  of pagers on whi
4c60: 63 68 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70  ch */.  Pager *p
4c70: 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  Prev;           
4c80: 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 72      /* sqlite3_r
4c90: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20  elease_memory() 
4ca0: 77 69 6c 6c 20 77 6f 72 6b 20 2a 2f 0a 20 20 69  will work */.  i
4cb0: 6e 74 20 69 49 6e 55 73 65 4d 4d 3b 20 20 20 20  nt iInUseMM;    
4cc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
4cd0: 6e 2d 7a 65 72 6f 20 69 66 20 75 6e 61 76 61 69  n-zero if unavai
4ce0: 6c 61 62 6c 65 20 74 6f 20 4d 4d 20 2a 2f 0a 20  lable to MM */. 
4cf0: 20 69 6e 74 20 69 49 6e 55 73 65 44 42 3b 20 20   int iInUseDB;  
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4d10: 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 69 6e 20 73  Non-zero if in s
4d20: 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d  qlite3_release_m
4d30: 65 6d 6f 72 79 28 29 20 2a 2f 0a 23 65 6e 64 69  emory() */.#endi
4d40: 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70  f.  char *pTmpSp
4d50: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
4d60: 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  /* Pager.pageSiz
4d70: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
4d80: 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a   for tmp use */.
4d90: 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72    char dbFileVer
4da0: 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a  s[16];        /*
4db0: 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65   Changes wheneve
4dc0: 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  r database file 
4dd0: 63 68 61 6e 67 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f  changes */.};../
4de0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
4df0: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
4e00: 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72  les hold counter
4e10: 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
4e20: 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f  sting purposes o
4e30: 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72 69  nly.  These vari
4e40: 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69  ables do not exi
4e50: 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74  st in.** a non-t
4e60: 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54  esting build.  T
4e70: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 61  hese variables a
4e80: 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61  re not thread-sa
4e90: 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  fe..*/.#ifdef SQ
4ea0: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
4eb0: 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
4ec0: 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  db_count = 0;   
4ed0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
4ee0: 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20 66 72  ll pages read fr
4ef0: 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c  om DB */.int sql
4f00: 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
4f10: 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  db_count = 0;   
4f20: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c  /* Number of ful
4f30: 6c 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  l pages written 
4f40: 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c  to DB */.int sql
4f50: 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
4f60: 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20  j_count = 0;    
4f70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
4f80: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f  es written to jo
4f90: 75 72 6e 61 6c 20 2a 2f 0a 69 6e 74 20 73 71 6c  urnal */.int sql
4fa0: 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65  ite3_pager_pgfre
4fb0: 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20  e_count = 0;    
4fc0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 61 63  /* Number of cac
4fd0: 68 65 20 70 61 67 65 73 20 66 72 65 65 64 20 2a  he pages freed *
4fe0: 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  /.# define PAGER
4ff0: 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65  _INCR(v)  v++.#e
5000: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47  lse.# define PAG
5010: 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69  ER_INCR(v).#endi
5020: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
5030: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20  lowing variable 
5040: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 68 65  points to the he
5050: 61 64 20 6f 66 20 61 20 64 6f 75 62 6c 65 2d 6c  ad of a double-l
5060: 69 6e 6b 65 64 20 6c 69 73 74 0a 2a 2a 20 6f 66  inked list.** of
5070: 20 61 6c 6c 20 70 61 67 65 72 73 20 74 68 61 74   all pagers that
5080: 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66 6f   are eligible fo
5090: 72 20 70 61 67 65 20 73 74 65 61 6c 69 6e 67 20  r page stealing 
50a0: 62 79 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  by the.** sqlite
50b0: 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  3_release_memory
50c0: 28 29 20 69 6e 74 65 72 66 61 63 65 2e 20 20 41  () interface.  A
50d0: 63 63 65 73 73 20 74 6f 20 74 68 69 73 20 6c 69  ccess to this li
50e0: 73 74 20 69 73 0a 2a 2a 20 70 72 6f 74 65 63 74  st is.** protect
50f0: 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  ed by the SQLITE
5100: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
5110: 4d 32 20 6d 75 74 65 78 2e 0a 2a 2f 0a 23 69 66  M2 mutex..*/.#if
5120: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
5130: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
5140: 45 4e 54 0a 73 74 61 74 69 63 20 50 61 67 65 72  ENT.static Pager
5150: 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69   *sqlite3PagerLi
5160: 73 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 50  st = 0;.static P
5170: 61 67 65 72 4c 72 75 4c 69 73 74 20 73 71 6c 69  agerLruList sqli
5180: 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 20 3d  te3LruPageList =
5190: 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 23 65 6e 64   {0, 0, 0};.#end
51a0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  if.../*.** Journ
51b0: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
51c0: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
51d0: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
51e0: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
51f0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
5200: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
5210: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
5220: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
5230: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
5240: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
5250: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
5260: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
5270: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
5280: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
5290: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
52a0: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
52b0: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e  journal is begin
52c0: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
52d0: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
52e0: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
52f0: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
5300: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
5310: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
5320: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
5330: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
5340: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
5350: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
5360: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
5370: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
5380: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
5390: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
53a0: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
53b0: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
53c0: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
53d0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
53e0: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
53f0: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
5400: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
5410: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
5420: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
5430: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
5440: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
5450: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
5460: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
5470: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
5480: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
5490: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
54a0: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
54b0: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
54c0: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
54d0: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
54e0: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
54f0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
5500: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
5510: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
5520: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
5530: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
5540: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
5550: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
5560: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
5570: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
5580: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
5590: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
55a0: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
55b0: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
55c0: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
55d0: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
55e0: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
55f0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
5600: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
5610: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
5620: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
5630: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
5640: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
5650: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
5660: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
5670: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
5680: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
5690: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
56a0: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
56b0: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
56c0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
56d0: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
56e0: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
56f0: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
5700: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
5710: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
5720: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
5730: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
5740: 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  of each page in 
5750: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  the journal is d
5760: 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20  etermined.** by 
5770: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
5780: 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  cros..*/.#define
5790: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
57a0: 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72  Pager)  ((pPager
57b0: 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29  ->pageSize) + 8)
57c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
57d0: 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  nal header size 
57e0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
57f0: 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  In the future, t
5800: 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
5810: 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75  set to some valu
5820: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
5830: 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e  disk controller.
5840: 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a   The important.*
5850: 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  * characteristic
5860: 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74   is that it is t
5870: 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20  he same size as 
5880: 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a  a disk sector..*
5890: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
58a0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
58b0: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
58c0: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
58d0: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
58e0: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
58f0: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
5900: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
5910: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
5920: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
5930: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
5940: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
5950: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
5960: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
5970: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
5980: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
5990: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
59a0: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
59b0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
59c0: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
59d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
59e0: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
59f0: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
5a00: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
5a10: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
5a20: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67  endif../*.** Pag
5a30: 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d  e number PAGER_M
5a40: 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20  J_PGNO is never 
5a50: 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74  used in an SQLit
5a60: 65 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69  e database (it i
5a70: 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f  s.** reserved fo
5a80: 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64  r working around
5a90: 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78   a windows/posix
5aa0: 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79   incompatibility
5ab0: 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64  ). It is.** used
5ac0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
5ad0: 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20  to signify that 
5ae0: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
5af0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5b00: 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64  e .** is devoted
5b10: 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61   to storing a ma
5b20: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
5b30: 65 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f  e - there are no
5b40: 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a   more pages to.*
5b50: 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65  * roll back. See
5b60: 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75   comments for fu
5b70: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74  nction writeMast
5b80: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
5b90: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23  details..*/./* #
5ba0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f  define PAGER_MJ_
5bb0: 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47  PGNO(x) (PENDING
5bc0: 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65  _BYTE/((x)->page
5bd0: 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e  Size)) */.#defin
5be0: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
5bf0: 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54  x) ((PENDING_BYT
5c00: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
5c10: 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ))+1)../*.** The
5c20: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
5c30: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
5c40: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
5c50: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
5c60: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
5c70: 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 45  /*.** The pagerE
5c80: 6e 74 65 72 28 29 20 61 6e 64 20 70 61 67 65 72  nter() and pager
5c90: 4c 65 61 76 65 28 29 20 72 6f 75 74 69 6e 65 73  Leave() routines
5ca0: 20 61 63 71 75 69 72 65 20 61 6e 64 20 72 65 6c   acquire and rel
5cb0: 65 61 73 65 0a 2a 2a 20 61 20 6d 75 74 65 78 20  ease.** a mutex 
5cc0: 6f 6e 20 65 61 63 68 20 70 61 67 65 72 2e 20 20  on each pager.  
5cd0: 54 68 65 20 6d 75 74 65 78 20 69 73 20 72 65 63  The mutex is rec
5ce0: 75 72 73 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ursive..**.** Th
5cf0: 69 73 20 69 73 20 61 20 73 70 65 63 69 61 6c 2d  is is a special-
5d00: 70 75 72 70 6f 73 65 20 6d 75 74 65 78 2e 20 20  purpose mutex.  
5d10: 49 74 20 6f 6e 6c 79 20 70 72 6f 76 69 64 65 73  It only provides
5d20: 20 6d 75 74 75 61 6c 20 65 78 63 6c 75 73 69 6f   mutual exclusio
5d30: 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65  n.** between the
5d40: 20 42 74 72 65 65 20 61 6e 64 20 74 68 65 20 4d   Btree and the M
5d50: 65 6d 6f 72 79 20 4d 61 6e 61 67 65 6d 65 6e 74  emory Management
5d60: 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65   sqlite3_release
5d70: 5f 6d 65 6d 6f 72 79 28 29 0a 2a 2a 20 66 75 6e  _memory().** fun
5d80: 63 74 69 6f 6e 2e 20 20 49 74 20 64 6f 65 73 20  ction.  It does 
5d90: 6e 6f 74 20 70 72 65 76 65 6e 74 2c 20 66 6f 72  not prevent, for
5da0: 20 65 78 61 6d 70 6c 65 2c 20 74 77 6f 20 42 74   example, two Bt
5db0: 72 65 65 73 20 66 72 6f 6d 20 61 63 63 65 73 73  rees from access
5dc0: 69 6e 67 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20  ing.** the same 
5dd0: 70 61 67 65 72 20 61 74 20 74 68 65 20 73 61 6d  pager at the sam
5de0: 65 20 74 69 6d 65 2e 20 20 4f 74 68 65 72 20 67  e time.  Other g
5df0: 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 6d  eneral-purpose m
5e00: 75 74 65 78 65 73 20 69 6e 0a 2a 2a 20 74 68 65  utexes in.** the
5e10: 20 62 74 72 65 65 20 6c 61 79 65 72 20 68 61 6e   btree layer han
5e20: 64 6c 65 20 74 68 61 74 20 63 68 6f 72 65 2e 0a  dle that chore..
5e30: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
5e40: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
5e50: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 73 74 61 74  ANAGEMENT.  stat
5e60: 69 63 20 76 6f 69 64 20 70 61 67 65 72 45 6e 74  ic void pagerEnt
5e70: 65 72 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  er(Pager *p){.  
5e80: 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 2b 2b 3b    p->iInUseDB++;
5e90: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e 55  .    if( p->iInU
5ea0: 73 65 4d 4d 20 26 26 20 70 2d 3e 69 49 6e 55 73  seMM && p->iInUs
5eb0: 65 44 42 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  eDB==1 ){.      
5ec0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
5ed0: 75 74 65 78 3b 0a 20 20 20 20 20 20 6d 75 74 65  utex;.      mute
5ee0: 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x = sqlite3_mute
5ef0: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
5f00: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32  UTEX_STATIC_MEM2
5f10: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 49 6e 55  );.      p->iInU
5f20: 73 65 44 42 20 3d 20 30 3b 0a 20 20 20 20 20 20  seDB = 0;.      
5f30: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
5f40: 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20  ter(mutex);.    
5f50: 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20    p->iInUseDB = 
5f60: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
5f70: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
5f80: 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ex);.    }.    a
5f90: 73 73 65 72 74 28 20 70 2d 3e 69 49 6e 55 73 65  ssert( p->iInUse
5fa0: 4d 4d 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73  MM==0 );.  }.  s
5fb0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
5fc0: 4c 65 61 76 65 28 50 61 67 65 72 20 2a 70 29 7b  Leave(Pager *p){
5fd0: 0a 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42  .    p->iInUseDB
5fe0: 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
5ff0: 70 2d 3e 69 49 6e 55 73 65 44 42 3e 3d 30 20 29  p->iInUseDB>=0 )
6000: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65  ;.  }.#else.# de
6010: 66 69 6e 65 20 70 61 67 65 72 45 6e 74 65 72 28  fine pagerEnter(
6020: 58 29 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  X).# define page
6030: 72 4c 65 61 76 65 28 58 29 0a 23 65 6e 64 69 66  rLeave(X).#endif
6040: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72  ../*.** Enable r
6050: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74  eference count t
6060: 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64 65 62  racking (for deb
6070: 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f  ugging) here:.*/
6080: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
6090: 45 42 55 47 0a 20 20 69 6e 74 20 70 61 67 65 72  EBUG.  int pager
60a0: 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  3_refinfo_enable
60b0: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76   = 0;.  static v
60c0: 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66  oid pager_refinf
60d0: 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20  o(PgHdr *p){.   
60e0: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20   static int cnt 
60f0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61  = 0;.    if( !pa
6100: 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61  ger3_refinfo_ena
6110: 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ble ) return;.  
6120: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
6130: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52 45  intf(.       "RE
6140: 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 25  FCNT: %4d addr=%
6150: 70 20 6e 52 65 66 3d 25 2d 33 64 20 74 6f 74 61  p nRef=%-3d tota
6160: 6c 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  l=%d\n",.       
6170: 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54  p->pgno, PGHDR_T
6180: 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52  O_DATA(p), p->nR
6190: 65 66 2c 20 70 2d 3e 70 50 61 67 65 72 2d 3e 6e  ef, p->pPager->n
61a0: 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63  Ref.    );.    c
61b0: 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74  nt++;   /* Somet
61c0: 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72  hing to set a br
61d0: 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20  eakpoint on */. 
61e0: 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49   }.# define REFI
61f0: 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65  NFO(X)  pager_re
6200: 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23  finfo(X).#else.#
6210: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
6220: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
6230: 20 41 64 64 20 70 61 67 65 20 70 50 67 20 74 6f   Add page pPg to
6240: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
6250: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6d 61 6e 61  linked list mana
6260: 67 65 64 20 62 79 20 73 74 72 75 63 74 75 72 65  ged by structure
6270: 0a 2a 2a 20 70 4c 69 73 74 20 28 70 50 67 20 62  .** pList (pPg b
6280: 65 63 6f 6d 65 73 20 74 68 65 20 6c 61 73 74 20  ecomes the last 
6290: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6c 69 73  entry in the lis
62a0: 74 20 2d 20 74 68 65 20 6d 6f 73 74 20 72 65 63  t - the most rec
62b0: 65 6e 74 6c 79 20 0a 2a 2a 20 75 73 65 64 29 2e  ently .** used).
62c0: 20 41 72 67 75 6d 65 6e 74 20 70 4c 69 6e 6b 20   Argument pLink 
62d0: 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20  should point to 
62e0: 65 69 74 68 65 72 20 70 50 67 2d 3e 66 72 65 65  either pPg->free
62f0: 20 6f 72 20 70 50 67 2d 3e 67 66 72 65 65 2c 0a   or pPg->gfree,.
6300: 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ** depending on 
6310: 77 68 65 74 68 65 72 20 70 50 67 20 69 73 20 62  whether pPg is b
6320: 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68  eing added to th
6330: 65 20 70 61 67 65 72 2d 73 70 65 63 69 66 69 63  e pager-specific
6340: 20 6f 72 0a 2a 2a 20 67 6c 6f 62 61 6c 20 4c 52   or.** global LR
6350: 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  U list..*/.stati
6360: 63 20 76 6f 69 64 20 6c 69 73 74 41 64 64 28 50  c void listAdd(P
6370: 61 67 65 72 4c 72 75 4c 69 73 74 20 2a 70 4c 69  agerLruList *pLi
6380: 73 74 2c 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b  st, PagerLruLink
6390: 20 2a 70 4c 69 6e 6b 2c 20 50 67 48 64 72 20 2a   *pLink, PgHdr *
63a0: 70 50 67 29 7b 0a 20 20 70 4c 69 6e 6b 2d 3e 70  pPg){.  pLink->p
63b0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4c 69 6e  Next = 0;.  pLin
63c0: 6b 2d 3e 70 50 72 65 76 20 3d 20 70 4c 69 73 74  k->pPrev = pList
63d0: 2d 3e 70 4c 61 73 74 3b 0a 0a 23 69 66 64 65 66  ->pLast;..#ifdef
63e0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
63f0: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
6400: 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d  .  assert(pLink=
6410: 3d 26 70 50 67 2d 3e 66 72 65 65 20 7c 7c 20 70  =&pPg->free || p
6420: 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65  Link==&pPg->gfre
6430: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69  e);.  assert(pLi
6440: 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 20  nk==&pPg->gfree 
6450: 7c 7c 20 70 4c 69 73 74 21 3d 26 73 71 6c 69 74  || pList!=&sqlit
6460: 65 33 4c 72 75 50 61 67 65 4c 69 73 74 29 3b 0a  e3LruPageList);.
6470: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 4c  #endif..  if( pL
6480: 69 73 74 2d 3e 70 4c 61 73 74 20 29 7b 0a 20 20  ist->pLast ){.  
6490: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 28 63 68    int iOff = (ch
64a0: 61 72 20 2a 29 70 4c 69 6e 6b 20 2d 20 28 63 68  ar *)pLink - (ch
64b0: 61 72 20 2a 29 70 50 67 3b 0a 20 20 20 20 50 61  ar *)pPg;.    Pa
64c0: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 61 73  gerLruLink *pLas
64d0: 74 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72  tLink = (PagerLr
64e0: 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a  uLink *)(&((u8 *
64f0: 29 70 4c 69 73 74 2d 3e 70 4c 61 73 74 29 5b 69  )pList->pLast)[i
6500: 4f 66 66 5d 29 3b 0a 20 20 20 20 70 4c 61 73 74  Off]);.    pLast
6510: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 50  Link->pNext = pP
6520: 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
6530: 61 73 73 65 72 74 28 21 70 4c 69 73 74 2d 3e 70  assert(!pList->p
6540: 46 69 72 73 74 29 3b 0a 20 20 20 20 70 4c 69 73  First);.    pLis
6550: 74 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b  t->pFirst = pPg;
6560: 0a 20 20 7d 0a 0a 20 20 70 4c 69 73 74 2d 3e 70  .  }..  pList->p
6570: 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 69 66  Last = pPg;.  if
6580: 28 20 21 70 4c 69 73 74 2d 3e 70 46 69 72 73 74  ( !pList->pFirst
6590: 53 79 6e 63 65 64 20 26 26 20 70 50 67 2d 3e 6e  Synced && pPg->n
65a0: 65 65 64 53 79 6e 63 3d 3d 30 20 29 7b 0a 20 20  eedSync==0 ){.  
65b0: 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53    pList->pFirstS
65c0: 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 7d  ynced = pPg;.  }
65d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
65e0: 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20 6c 69   pPg from the li
65f0: 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68  st managed by th
6600: 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
6610: 74 65 64 20 74 6f 20 62 79 20 70 4c 69 73 74 2e  ted to by pList.
6620: 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
6630: 70 4c 69 6e 6b 20 73 68 6f 75 6c 64 20 70 6f 69  pLink should poi
6640: 6e 74 20 74 6f 20 65 69 74 68 65 72 20 70 50 67  nt to either pPg
6650: 2d 3e 66 72 65 65 20 6f 72 20 70 50 67 2d 3e 67  ->free or pPg->g
6660: 66 72 65 65 2c 20 64 65 70 65 6e 64 69 6e 67 20  free, depending 
6670: 0a 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 70  .** on whether p
6680: 50 67 20 69 73 20 62 65 69 6e 67 20 61 64 64 65  Pg is being adde
6690: 64 20 74 6f 20 74 68 65 20 70 61 67 65 72 2d 73  d to the pager-s
66a0: 70 65 63 69 66 69 63 20 6f 72 20 67 6c 6f 62 61  pecific or globa
66b0: 6c 20 4c 52 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73  l LRU list..*/.s
66c0: 74 61 74 69 63 20 76 6f 69 64 20 6c 69 73 74 52  tatic void listR
66d0: 65 6d 6f 76 65 28 50 61 67 65 72 4c 72 75 4c 69  emove(PagerLruLi
66e0: 73 74 20 2a 70 4c 69 73 74 2c 20 50 61 67 65 72  st *pList, Pager
66f0: 4c 72 75 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20  LruLink *pLink, 
6700: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
6710: 6e 74 20 69 4f 66 66 20 3d 20 28 63 68 61 72 20  nt iOff = (char 
6720: 2a 29 70 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20  *)pLink - (char 
6730: 2a 29 70 50 67 3b 0a 0a 23 69 66 64 65 66 20 53  *)pPg;..#ifdef S
6740: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
6750: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
6760: 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26   assert(pLink==&
6770: 70 50 67 2d 3e 66 72 65 65 20 7c 7c 20 70 4c 69  pPg->free || pLi
6780: 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 29  nk==&pPg->gfree)
6790: 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b  ;.  assert(pLink
67a0: 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 20 7c 7c  ==&pPg->gfree ||
67b0: 20 70 4c 69 73 74 21 3d 26 73 71 6c 69 74 65 33   pList!=&sqlite3
67c0: 4c 72 75 50 61 67 65 4c 69 73 74 29 3b 0a 23 65  LruPageList);.#e
67d0: 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 67 3d  ndif..  if( pPg=
67e0: 3d 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 20 29  =pList->pFirst )
67f0: 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69  {.    pList->pFi
6800: 72 73 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65  rst = pLink->pNe
6810: 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  xt;.  }.  if( pP
6820: 67 3d 3d 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20  g==pList->pLast 
6830: 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 4c  ){.    pList->pL
6840: 61 73 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72  ast = pLink->pPr
6850: 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c  ev;.  }.  if( pL
6860: 69 6e 6b 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ink->pPrev ){.  
6870: 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a    PagerLruLink *
6880: 70 50 72 65 76 4c 69 6e 6b 20 3d 20 28 50 61 67  pPrevLink = (Pag
6890: 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28  erLruLink *)(&((
68a0: 75 38 20 2a 29 70 4c 69 6e 6b 2d 3e 70 50 72 65  u8 *)pLink->pPre
68b0: 76 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70  v)[iOff]);.    p
68c0: 50 72 65 76 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20  PrevLink->pNext 
68d0: 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLink->pNext;.
68e0: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 6e 6b 2d    }.  if( pLink-
68f0: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 50 61  >pNext ){.    Pa
6900: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4e 65 78  gerLruLink *pNex
6910: 74 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72  tLink = (PagerLr
6920: 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a  uLink *)(&((u8 *
6930: 29 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 29 5b 69  )pLink->pNext)[i
6940: 4f 66 66 5d 29 3b 0a 20 20 20 20 70 4e 65 78 74  Off]);.    pNext
6950: 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 70 4c  Link->pPrev = pL
6960: 69 6e 6b 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a  ink->pPrev;.  }.
6970: 20 20 69 66 28 20 70 50 67 3d 3d 70 4c 69 73 74    if( pPg==pList
6980: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
6990: 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d  {.    PgHdr *p =
69a0: 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLink->pNext;. 
69b0: 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70     while( p && p
69c0: 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
69d0: 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b      PagerLruLink
69e0: 20 2a 70 4c 20 3d 20 28 50 61 67 65 72 4c 72 75   *pL = (PagerLru
69f0: 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29  Link *)(&((u8 *)
6a00: 70 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20  p)[iOff]);.     
6a10: 20 70 20 3d 20 70 4c 2d 3e 70 4e 65 78 74 3b 0a   p = pL->pNext;.
6a20: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
6a30: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
6a40: 70 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 6e 6b 2d  p;.  }..  pLink-
6a50: 3e 70 4e 65 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e  >pNext = pLink->
6a60: 70 50 72 65 76 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  pPrev = 0;.}../*
6a70: 20 0a 2a 2a 20 41 64 64 20 70 61 67 65 20 70 50   .** Add page pP
6a80: 67 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  g to the list of
6a90: 20 66 72 65 65 20 70 61 67 65 73 20 66 6f 72 20   free pages for 
6aa0: 74 68 65 20 70 61 67 65 72 2e 20 49 66 20 0a 2a  the pager. If .*
6ab0: 2a 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d  * memory-managem
6ac0: 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ent is enabled, 
6ad0: 61 6c 73 6f 20 61 64 64 20 74 68 65 20 70 61 67  also add the pag
6ae0: 65 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20  e to the global 
6af0: 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 66 72 65 65  .** list of free
6b00: 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   pages..*/.stati
6b10: 63 20 76 6f 69 64 20 6c 72 75 4c 69 73 74 41 64  c void lruListAd
6b20: 64 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  d(PgHdr *pPg){. 
6b30: 20 6c 69 73 74 41 64 64 28 26 70 50 67 2d 3e 70   listAdd(&pPg->p
6b40: 50 61 67 65 72 2d 3e 6c 72 75 2c 20 26 70 50 67  Pager->lru, &pPg
6b50: 2d 3e 66 72 65 65 2c 20 70 50 67 29 3b 0a 23 69  ->free, pPg);.#i
6b60: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6b70: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
6b80: 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 67 2d  MENT.  if( !pPg-
6b90: 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  >pPager->memDb )
6ba0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  {.    sqlite3_mu
6bb0: 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65  tex_enter(sqlite
6bc0: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
6bd0: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
6be0: 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20 6c 69 73  C_LRU));.    lis
6bf0: 74 41 64 64 28 26 73 71 6c 69 74 65 33 4c 72 75  tAdd(&sqlite3Lru
6c00: 50 61 67 65 4c 69 73 74 2c 20 26 70 50 67 2d 3e  PageList, &pPg->
6c10: 67 66 72 65 65 2c 20 70 50 67 29 3b 0a 20 20 20  gfree, pPg);.   
6c20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
6c30: 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74  eave(sqlite3_mut
6c40: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
6c50: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55  MUTEX_STATIC_LRU
6c60: 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  ));.  }.#endif.}
6c70: 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 6d 6f 76 65 20  ../* .** Remove 
6c80: 70 61 67 65 20 70 50 67 20 66 72 6f 6d 20 74 68  page pPg from th
6c90: 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70  e list of free p
6ca0: 61 67 65 73 20 66 6f 72 20 74 68 65 20 61 73 73  ages for the ass
6cb0: 6f 63 69 61 74 65 64 20 70 61 67 65 72 2e 0a 2a  ociated pager..*
6cc0: 2a 20 49 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61  * If memory-mana
6cd0: 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65  gement is enable
6ce0: 64 2c 20 61 6c 73 6f 20 72 65 6d 6f 76 65 20 70  d, also remove p
6cf0: 50 67 20 66 72 6f 6d 20 74 68 65 20 67 6c 6f 62  Pg from the glob
6d00: 61 6c 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 66 72  al list.** of fr
6d10: 65 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  ee pages..*/.sta
6d20: 74 69 63 20 76 6f 69 64 20 6c 72 75 4c 69 73 74  tic void lruList
6d30: 52 65 6d 6f 76 65 28 50 67 48 64 72 20 2a 70 50  Remove(PgHdr *pP
6d40: 67 29 7b 0a 20 20 6c 69 73 74 52 65 6d 6f 76 65  g){.  listRemove
6d50: 28 26 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6c  (&pPg->pPager->l
6d60: 72 75 2c 20 26 70 50 67 2d 3e 66 72 65 65 2c 20  ru, &pPg->free, 
6d70: 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  pPg);.#ifdef SQL
6d80: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
6d90: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69  Y_MANAGEMENT.  i
6da0: 66 28 20 21 70 50 67 2d 3e 70 50 61 67 65 72 2d  f( !pPg->pPager-
6db0: 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 71  >memDb ){.    sq
6dc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6dd0: 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  r(sqlite3_mutex_
6de0: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
6df0: 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
6e00: 0a 20 20 20 20 6c 69 73 74 52 65 6d 6f 76 65 28  .    listRemove(
6e10: 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c  &sqlite3LruPageL
6e20: 69 73 74 2c 20 26 70 50 67 2d 3e 67 66 72 65 65  ist, &pPg->gfree
6e30: 2c 20 70 50 67 29 3b 0a 20 20 20 20 73 71 6c 69  , pPg);.    sqli
6e40: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
6e50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
6e60: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
6e70: 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20  _STATIC_LRU));. 
6e80: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20   }.#endif.}../* 
6e90: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
6ea0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74  n is called just
6eb0: 20 61 66 74 65 72 20 74 68 65 20 6e 65 65 64 53   after the needS
6ec0: 79 6e 63 20 66 6c 61 67 20 68 61 73 20 62 65 65  ync flag has bee
6ed0: 6e 20 63 6c 65 61 72 65 64 0a 2a 2a 20 66 72 6f  n cleared.** fro
6ee0: 6d 20 61 6c 6c 20 70 61 67 65 73 20 6d 61 6e 61  m all pages mana
6ef0: 67 65 64 20 62 79 20 70 50 61 67 65 72 20 28 75  ged by pPager (u
6f00: 73 75 61 6c 6c 79 20 62 65 63 61 75 73 65 20 74  sually because t
6f10: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
6f20: 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ** has just been
6f30: 20 73 79 6e 63 65 64 29 2e 20 49 74 20 75 70 64   synced). It upd
6f40: 61 74 65 73 20 74 68 65 20 70 50 61 67 65 72 2d  ates the pPager-
6f50: 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65  >lru.pFirstSynce
6f60: 64 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 61 6e  d variable.** an
6f70: 64 2c 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e  d, if memory-man
6f80: 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c  agement is enabl
6f90: 65 64 2c 20 74 68 65 20 73 71 6c 69 74 65 33 4c  ed, the sqlite3L
6fa0: 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73  ruPageList.pFirs
6fb0: 74 53 79 6e 63 65 64 0a 2a 2a 20 76 61 72 69 61  tSynced.** varia
6fc0: 62 6c 65 20 61 6c 73 6f 2e 0a 2a 2f 0a 73 74 61  ble also..*/.sta
6fd0: 74 69 63 20 76 6f 69 64 20 6c 72 75 4c 69 73 74  tic void lruList
6fe0: 53 65 74 46 69 72 73 74 53 79 6e 63 65 64 28 50  SetFirstSynced(P
6ff0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
7000: 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69   pPager->lru.pFi
7010: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67  rstSynced = pPag
7020: 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3b 0a  er->lru.pFirst;.
7030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
7040: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
7050: 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50  GEMENT.  if( !pP
7060: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
7070: 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20     PgHdr *p;.   
7080: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
7090: 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74  nter(sqlite3_mut
70a0: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
70b0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55  MUTEX_STATIC_LRU
70c0: 29 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71  ));.    for(p=sq
70d0: 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
70e0: 2e 70 46 69 72 73 74 3b 20 70 20 26 26 20 70 2d  .pFirst; p && p-
70f0: 3e 6e 65 65 64 53 79 6e 63 3b 20 70 3d 70 2d 3e  >needSync; p=p->
7100: 67 66 72 65 65 2e 70 4e 65 78 74 29 3b 0a 20 20  gfree.pNext);.  
7110: 20 20 61 73 73 65 72 74 28 70 3d 3d 70 50 61 67    assert(p==pPag
7120: 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79  er->lru.pFirstSy
7130: 6e 63 65 64 20 7c 7c 20 70 3d 3d 73 71 6c 69 74  nced || p==sqlit
7140: 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46  e3LruPageList.pF
7150: 69 72 73 74 53 79 6e 63 65 64 29 3b 0a 20 20 20  irstSynced);.   
7160: 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c   sqlite3LruPageL
7170: 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64  ist.pFirstSynced
7180: 20 3d 20 70 3b 0a 20 20 20 20 73 71 6c 69 74 65   = p;.    sqlite
7190: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
71a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
71b0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
71c0: 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d  TATIC_LRU));.  }
71d0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
71e0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
71f0: 70 61 67 65 20 2a 70 50 67 20 68 61 73 20 61 6c  page *pPg has al
7200: 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
7210: 65 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  en to the statem
7220: 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ent.** journal (
7230: 6f 72 20 73 74 61 74 65 6d 65 6e 74 20 73 6e 61  or statement sna
7240: 70 73 68 6f 74 20 68 61 73 20 62 65 65 6e 20 63  pshot has been c
7250: 72 65 61 74 65 64 2c 20 69 66 20 2a 70 50 67 20  reated, if *pPg 
7260: 69 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 6e  is part.** of an
7270: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
7280: 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
7290: 69 6e 74 20 70 61 67 65 49 6e 53 74 61 74 65 6d  int pageInStatem
72a0: 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ent(PgHdr *pPg){
72b0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
72c0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
72d0: 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
72e0: 20 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f     return PGHDR_
72f0: 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
7300: 67 65 72 29 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20  ger)->inStmt;.  
7310: 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
7320: 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
7330: 3b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 50  ;.    u8 *a = pP
7340: 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3b 0a 20  ager->aInStmt;. 
7350: 20 20 20 72 65 74 75 72 6e 20 28 61 20 26 26 20     return (a && 
7360: 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
7370: 72 2d 3e 73 74 6d 74 53 69 7a 65 20 26 26 20 28  r->stmtSize && (
7380: 61 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  a[pgno/8] & (1<<
7390: 28 70 67 6e 6f 26 37 29 29 29 29 3b 0a 20 20 7d  (pgno&7))));.  }
73a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
73b0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
73c0: 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62 6c   pager hash tabl
73d0: 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20  e to N.  N must 
73e0: 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66  be a power.** of
73f0: 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   two..*/.static 
7400: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a  void pager_resiz
7410: 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67  e_hash_table(Pag
7420: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
7430: 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48  N){.  PgHdr **aH
7440: 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73  ash, *pPg;.  ass
7450: 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28  ert( N>0 && (N&(
7460: 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 70 61  N-1))==0 );.  pa
7470: 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
7480: 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ;.  sqlite3Mallo
7490: 63 42 65 6e 69 67 6e 46 61 69 6c 75 72 65 28 28  cBenignFailure((
74a0: 69 6e 74 29 70 50 61 67 65 72 2d 3e 61 48 61 73  int)pPager->aHas
74b0: 68 29 3b 0a 20 20 61 48 61 73 68 20 3d 20 73 71  h);.  aHash = sq
74c0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
74d0: 20 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d   sizeof(aHash[0]
74e0: 29 2a 4e 20 29 3b 0a 20 20 70 61 67 65 72 45 6e  )*N );.  pagerEn
74f0: 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
7500: 66 28 20 61 48 61 73 68 3d 3d 30 20 29 7b 0a 20  f( aHash==0 ){. 
7510: 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f     /* Failure to
7520: 20 72 65 68 61 73 68 20 69 73 20 6e 6f 74 20 61   rehash is not a
7530: 6e 20 65 72 72 6f 72 2e 20 20 49 74 20 69 73 20  n error.  It is 
7540: 6f 6e 6c 79 20 61 20 70 65 72 66 6f 72 6d 61 6e  only a performan
7550: 63 65 20 68 69 74 2e 20 2a 2f 0a 20 20 20 20 72  ce hit. */.    r
7560: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
7570: 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
7580: 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67  ->aHash);.  pPag
7590: 65 72 2d 3e 6e 48 61 73 68 20 3d 20 4e 3b 0a 20  er->nHash = N;. 
75a0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d   pPager->aHash =
75b0: 20 61 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 50   aHash;.  for(pP
75c0: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
75d0: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
75e0: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 6e 74  extAll){.    int
75f0: 20 68 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d   h;.    if( pPg-
7600: 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  >pgno==0 ){.    
7610: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
7620: 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70  NextHash==0 && p
7630: 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  Pg->pPrevHash==0
7640: 20 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   );.      contin
7650: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 20  ue;.    }.    h 
7660: 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 4e  = pPg->pgno & (N
7670: 2d 31 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  -1);.    pPg->pN
7680: 65 78 74 48 61 73 68 20 3d 20 61 48 61 73 68 5b  extHash = aHash[
7690: 68 5d 3b 0a 20 20 20 20 69 66 28 20 61 48 61 73  h];.    if( aHas
76a0: 68 5b 68 5d 20 29 7b 0a 20 20 20 20 20 20 61 48  h[h] ){.      aH
76b0: 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
76c0: 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  h = pPg;.    }. 
76d0: 20 20 20 61 48 61 73 68 5b 68 5d 20 3d 20 70 50     aHash[h] = pP
76e0: 67 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  g;.    pPg->pPre
76f0: 76 48 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d  vHash = 0;.  }.}
7700: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
7710: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72  2-bit integer fr
7720: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  om the given fil
7730: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53  e descriptor.  S
7740: 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72  tore the integer
7750: 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64  .** that is read
7760: 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75   in *pRes.  Retu
7770: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
7780: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
7790: 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f  d, or an.** erro
77a0: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
77b0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
77c0: 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73  **.** All values
77d0: 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64   are stored on d
77e0: 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61  isk as big-endia
77f0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
7800: 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69   read32bits(sqli
7810: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
7820: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70  4 offset, u32 *p
7830: 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Res){.  unsigned
7840: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69   char ac[4];.  i
7850: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
7860: 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69  sRead(fd, ac, si
7870: 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74  zeof(ac), offset
7880: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
7890: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
78a0: 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Res = sqlite3Get
78b0: 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20  4byte(ac);.  }. 
78c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
78d0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
78e0: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
78f0: 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
7900: 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62   in big-endian b
7910: 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64  yte order..*/.#d
7920: 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28  efine put32bits(
7930: 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74  A,B)  sqlite3Put
7940: 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a  4byte((u8*)A,B).
7950: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
7960: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
7970: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
7980: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
7990: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
79a0: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
79b0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
79c0: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
79d0: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
79e0: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
79f0: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
7a00: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
7a10: 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72  u32 val){.  char
7a20: 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62   ac[4];.  put32b
7a30: 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20  its(ac, val);.  
7a40: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
7a50: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c  Write(fd, ac, 4,
7a60: 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a   offset);.}../*.
7a70: 2a 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20 69  ** If file pFd i
7a80: 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c  s open, call sql
7a90: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f  ite3OsUnlock() o
7aa0: 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  n it..*/.static 
7ab0: 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c  int osUnlock(sql
7ac0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20  ite3_file *pFd, 
7ad0: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66  int eLock){.  if
7ae0: 28 20 21 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73  ( !pFd->pMethods
7af0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
7b00: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
7b10: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
7b20: 55 6e 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63  Unlock(pFd, eLoc
7b30: 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  k);.}../*.** Thi
7b40: 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72  s function deter
7b50: 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72  mines whether or
7b60: 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d   not the atomic-
7b70: 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
7b80: 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  on.** can be use
7b90: 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  d with this page
7ba0: 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74  r. The optimizat
7bb0: 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
7bc0: 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74  if:.**.**  (a) t
7bd0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
7be0: 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 68 61  d by OsDeviceCha
7bf0: 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20 69  racteristics() i
7c00: 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a  ndicates that.**
7c10: 20 20 20 20 20 20 61 20 64 61 74 61 62 61 73 65        a database
7c20: 20 70 61 67 65 20 6d 61 79 20 62 65 20 77 72 69   page may be wri
7c30: 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c  tten atomically,
7c40: 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65   and.**  (b) the
7c50: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
7c60: 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  by OsSectorSize(
7c70: 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  ) is less than o
7c80: 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20  r equal.**      
7c90: 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  to the page size
7ca0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
7cb0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e  ptimization cann
7cc0: 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69 73  ot be used, 0 is
7cd0: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
7ce0: 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a   can be used,.**
7cf0: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
7d00: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
7d10: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
7d20: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74  nal file when it
7d30: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c  .** contains rol
7d40: 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65  lback data for e
7d50: 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e  xactly one page.
7d60: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
7d70: 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
7d80: 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74  WRITE.static int
7d90: 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
7da0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
7db0: 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20    int dc;       
7dc0: 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68      /* Device ch
7dd0: 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
7de0: 0a 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20  .  int nSector; 
7df0: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73       /* Sector s
7e00: 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ize */.  int nPa
7e10: 67 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ge;        /* Pa
7e20: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 73 71 6c  ge size */.  sql
7e30: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20  ite3_file *fd = 
7e40: 70 50 61 67 65 72 2d 3e 66 64 3b 0a 0a 20 20 69  pPager->fd;..  i
7e50: 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  f( fd->pMethods 
7e60: 29 7b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69  ){.    dc = sqli
7e70: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
7e80: 63 74 65 72 69 73 74 69 63 73 28 66 64 29 3b 0a  cteristics(fd);.
7e90: 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 73 71      nSector = sq
7ea0: 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
7eb0: 65 28 66 64 29 3b 0a 20 20 20 20 6e 50 61 67 65  e(fd);.    nPage
7ec0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
7ed0: 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ize;.  }..  asse
7ee0: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
7ef0: 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
7f00: 3e 38 29 29 3b 0a 20 20 61 73 73 65 72 74 28 53  >8));.  assert(S
7f10: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
7f20: 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
7f30: 29 29 3b 0a 0a 20 20 69 66 28 20 21 66 64 2d 3e  ));..  if( !fd->
7f40: 70 4d 65 74 68 6f 64 73 20 7c 7c 20 28 64 63 26  pMethods || (dc&
7f50: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
7f60: 4f 4d 49 43 7c 28 6e 50 61 67 65 3e 3e 38 29 29  OMIC|(nPage>>8))
7f70: 26 26 6e 53 65 63 74 6f 72 3c 3d 6e 50 61 67 65  &&nSector<=nPage
7f80: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
7f90: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
7fa0: 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c  Pager) + JOURNAL
7fb0: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
7fc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
7fd0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
7fe0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
7ff0: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77  ould be called w
8000: 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  hen an error occ
8010: 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  urs within the p
8020: 61 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68  ager.** code. Th
8030: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
8040: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
8050: 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63   the pager struc
8060: 74 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63  ture, the.** sec
8070: 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f  ond the error-co
8080: 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72  de about to be r
8090: 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67  eturned by a pag
80a0: 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  er API function.
80b0: 20 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72   .** The value r
80c0: 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70  eturned is a cop
80d0: 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  y of the second 
80e0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
80f0: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a   function. .**.*
8100: 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
8110: 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49  argument is SQLI
8120: 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45  TE_IOERR, SQLITE
8130: 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c  _CORRUPT, or SQL
8140: 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20  ITE_FULL.** the 
8150: 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65  error becomes pe
8160: 72 73 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75  rsistent. All su
8170: 62 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c  bsequent API cal
8180: 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72  ls on this Pager
8190: 0a 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61  .** will immedia
81a0: 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20  tely return the 
81b0: 73 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  same error code.
81c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
81d0: 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72  ager_error(Pager
81e0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63   *pPager, int rc
81f0: 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72  ){.  int rc2 = r
8200: 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65  c & 0xff;.  asse
8210: 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65  rt(.       pPage
8220: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
8230: 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
8240: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
8250: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  e==SQLITE_OK ||.
8260: 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
8270: 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d  errCode & 0xff)=
8280: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
8290: 29 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32  );.  if(.    rc2
82a0: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
82b0: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
82c0: 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63  _IOERR ||.    rc
82d0: 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  2==SQLITE_CORRUP
82e0: 54 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65  T.  ){.    pPage
82f0: 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
8300: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
8310: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  ;.}../*.** If SQ
8320: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
8330: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
8340: 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69   we do some sani
8350: 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f  ty checking.** o
8360: 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e  n the cache usin
8370: 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f  g a hash functio
8380: 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
8390: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
83a0: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
83b0: 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ly..*/.#ifdef SQ
83c0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
83d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
83e0: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
83f0: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
8400: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
8410: 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61  c u32 pager_data
8420: 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20  hash(int nByte, 
8430: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
8440: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73  Data){.  u32 has
8450: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
8460: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79    for(i=0; i<nBy
8470: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61  te; i++){.    ha
8480: 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29  sh = (hash*1039)
8490: 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d   + pData[i];.  }
84a0: 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a  .  return hash;.
84b0: 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  }.static u32 pag
84c0: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
84d0: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  r *pPage){.  ret
84e0: 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61  urn pager_dataha
84f0: 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72  sh(pPage->pPager
8500: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 0a 20 20 20  ->pageSize, .   
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8520: 20 20 20 20 20 28 75 6e 73 69 67 6e 65 64 20 63       (unsigned c
8530: 68 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44  har *)PGHDR_TO_D
8540: 41 54 41 28 70 50 61 67 65 29 29 3b 0a 7d 0a 0a  ATA(pPage));.}..
8550: 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f  /*.** The CHECK_
8560: 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73  PAGE macro takes
8570: 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20   a PgHdr* as an 
8580: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c  argument. If SQL
8590: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
85a0: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  ** is defined, a
85b0: 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  nd NDEBUG is not
85c0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
85d0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20  ert() statement 
85e0: 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74  checks.** that t
85f0: 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65  he page is eithe
8600: 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c  r dirty or still
8610: 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c   matches the cal
8620: 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73  culated page-has
8630: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48  h..*/.#define CH
8640: 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63  ECK_PAGE(x) chec
8650: 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20  kPage(x).static 
8660: 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50  void checkPage(P
8670: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
8680: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
8690: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73  g->pPager;.  ass
86a0: 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48  ert( !pPg->pageH
86b0: 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ash || pPager->e
86c0: 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42 20  rrCode || MEMDB 
86d0: 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 7c 7c  || pPg->dirty ||
86e0: 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67   .      pPg->pag
86f0: 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67  eHash==pager_pag
8700: 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a  ehash(pPg) );.}.
8710: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70  .#else.#define p
8720: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c  ager_datahash(X,
8730: 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  Y)  0.#define pa
8740: 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20  ger_pagehash(X) 
8750: 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b   0.#define CHECK
8760: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a  _PAGE(x).#endif.
8770: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
8780: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a   is called the j
8790: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
87a0: 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73  pager pPager mus
87b0: 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68  t be open..** Th
87c0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
87d0: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65   file name is re
87e0: 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  ad from the end 
87f0: 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  of the file and 
8800: 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  .** written into
8810: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
8820: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
8830: 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d  .**.** zMaster m
8840: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
8850: 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
8860: 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  t nMaster bytes 
8870: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
8880: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  the caller. This
8890: 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74   should be sqlit
88a0: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
88b0: 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74  e+1 (to ensure t
88c0: 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67  here is.** enoug
88d0: 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65  h space to write
88e0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
88f0: 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68  nal name). If th
8900: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8910: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
8920: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65  journal is longe
8930: 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62  r than nMaster b
8940: 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  ytes (including 
8950: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
8960: 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20  tor), then this 
8970: 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  is handled as if
8980: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
8990: 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20  al name.** were 
89a0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a  present in the j
89b0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
89c0: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
89d0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
89e0: 70 72 65 73 65 6e 74 20 7a 4d 61 73 74 65 72 5b  present zMaster[
89f0: 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  0] is set to 0 a
8a00: 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
8a10: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
8a20: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
8a30: 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65  erJournal(sqlite
8a40: 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  3_file *pJrnl, c
8a50: 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 69 6e  har *zMaster, in
8a60: 74 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  t nMaster){.  in
8a70: 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  t rc;.  u32 len;
8a80: 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33  .  i64 szJ;.  u3
8a90: 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69  2 cksum;.  int i
8aa0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
8ab0: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20  r aMagic[8]; /* 
8ac0: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
8ad0: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
8ae0: 72 20 2a 2f 0a 0a 20 20 7a 4d 61 73 74 65 72 5b  r */..  zMaster[
8af0: 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 72 63  0] = '\0';..  rc
8b00: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
8b10: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
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 7c 7c 20 73 7a 4a 3c 31 36  ITE_OK || szJ<16
8b40: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
8b50: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
8b60: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20  (pJrnl, szJ-16, 
8b70: 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  &len);.  if( rc!
8b80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
8b90: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6c  urn rc;..  if( l
8ba0: 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 29 7b 0a 20  en>=nMaster ){. 
8bb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8bc0: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
8bd0: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
8be0: 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75  l, szJ-12, &cksu
8bf0: 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  m);.  if( rc!=SQ
8c00: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
8c10: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
8c20: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
8c30: 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a  , aMagic, 8, szJ
8c40: 2d 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  -8);.  if( rc!=S
8c50: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63  QLITE_OK || memc
8c60: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
8c70: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72  nalMagic, 8) ) r
8c80: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
8c90: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
8ca0: 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20  pJrnl, zMaster, 
8cb0: 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29  len, szJ-16-len)
8cc0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
8cd0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
8ce0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 7a 4d  urn rc;.  }.  zM
8cf0: 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30  aster[len] = '\0
8d00: 27 3b 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20  ';..  /* See if 
8d10: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
8d20: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
8d30: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
8d40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e    for(i=0; i<len
8d50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; i++){.    cksu
8d60: 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b  m -= zMaster[i];
8d70: 0a 20 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75  .   }.  if( cksu
8d80: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  m ){.    /* If t
8d90: 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  he checksum does
8da0: 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e  n't add up, then
8db0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
8dc0: 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  the disk sectors
8dd0: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  .    ** containi
8de0: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
8df0: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
8e00: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  s corrupted. Thi
8e10: 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64  s means.    ** d
8e20: 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62  efinitely roll b
8e30: 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ack, so just ret
8e40: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
8e50: 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29  d report a (nul)
8e60: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  .    ** master-j
8e70: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  ournal filename.
8e80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
8e90: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20  ter[0] = '\0';. 
8ea0: 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20   }.   .  return 
8eb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
8ec0: 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  .** Seek the jou
8ed0: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
8ee0: 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ptor to the next
8ef0: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
8f00: 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72   where a.** jour
8f10: 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62  nal header may b
8f20: 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
8f30: 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  n. Pager.journal
8f40: 4f 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77  Off is updated w
8f50: 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73  ith.** the new s
8f60: 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  eek offset..**.*
8f70: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
8f80: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
8f90: 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73  **.** Input Offs
8fa0: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
8fb0: 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a  Output Offset.**
8fc0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
8fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fe0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20  --------.** 0   
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9000: 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20        0.** 512  
9010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9020: 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20       512.** 100 
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9040: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30        512.** 200
9050: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
9060: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
9070: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
9080: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eekJournalHdr(Pa
9090: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
90a0: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
90b0: 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72    i64 c = pPager
90c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
90d0: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66  if( c ){.    off
90e0: 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55  set = ((c-1)/JOU
90f0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
9100: 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e  er) + 1) * JOURN
9110: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9120: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
9130: 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f   offset%JOURNAL_
9140: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
9150: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  0 );.  assert( o
9160: 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73  ffset>=c );.  as
9170: 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29  sert( (offset-c)
9180: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
9190: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61  pPager) );.  pPa
91a0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
91b0: 3d 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a  = offset;.}../*.
91c0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
91d0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
91e0: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
91f0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
9200: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
9210: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
9220: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
9230: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
9240: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
9250: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
9260: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
9270: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
9280: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
9290: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
92a0: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
92b0: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
92c0: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
92d0: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
92e0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
92f0: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
9300: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
9310: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
9320: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
9330: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
9340: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
9350: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
9360: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
9370: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
9380: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
9390: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
93a0: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
93b0: 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  nal..** .** Foll
93c0: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
93d0: 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79  _HDR_SZ - 24) by
93e0: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
93f0: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
9400: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
9410: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
9420: 29 7b 0a 20 20 63 68 61 72 20 7a 48 65 61 64 65  ){.  char zHeade
9430: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
9440: 6c 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 20 20 69  lMagic)+16];.  i
9450: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50  nt rc;..  if( pP
9460: 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
9470: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ==0 ){.    pPage
9480: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20  r->stmtHdrOff = 
9490: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
94a0: 66 66 3b 0a 20 20 7d 0a 0a 20 20 73 65 65 6b 4a  ff;.  }..  seekJ
94b0: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
94c0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
94d0: 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
94e0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
94f0: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
9500: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
9510: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
9520: 61 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20  agic));..  /* . 
9530: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
9540: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
9550: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
9560: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
9570: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
9580: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
9590: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
95a0: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
95b0: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
95c0: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
95d0: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
95e0: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
95f0: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
9600: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
9610: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
9620: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
9630: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
9640: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
9650: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
9660: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
9670: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
9680: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
9690: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
96a0: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
96b0: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
96c0: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
96d0: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
96e0: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
96f0: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
9700: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
9710: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
9720: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
9730: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
9740: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
9750: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
9760: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
9770: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65  a failure occure
9780: 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
9790: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
97a0: 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79    ** file it may
97b0: 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61   contain some ga
97c0: 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72  rbage data. Ther
97d0: 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72  e are two scenar
97e0: 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74  ios.  ** where t
97f0: 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20  his risk can be 
9800: 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20  ignored:.  **.  
9810: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
9820: 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73  pager is in no-s
9830: 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70  ync mode. Corrup
9840: 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  tion can follow 
9850: 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72  a.  **     power
9860: 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73   failure in this
9870: 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20   case anyway..  
9880: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
9890: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
98a0: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c  P_SAFE_APPEND fl
98b0: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
98c0: 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20  guarantees.  ** 
98d0: 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65      that garbage
98e0: 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61   data is never a
98f0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a  ppended to the j
9900: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a  ournal file..  *
9910: 2f 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  /.  assert(pPage
9920: 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
9930: 7c 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29  |pPager->noSync)
9940: 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  ;.  if( (pPager-
9950: 3e 6e 6f 53 79 6e 63 29 20 0a 20 20 20 7c 7c 20  >noSync) .   || 
9960: 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
9970: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
9980: 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49  pPager->fd)&SQLI
9990: 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
99a0: 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20  PEND) .  ){.    
99b0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
99c0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
99d0: 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66  alMagic)], 0xfff
99e0: 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  fffff);.  }else{
99f0: 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26  .    put32bits(&
9a00: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
9a10: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
9a20: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  0);.  }..  /* Th
9a30: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
9a40: 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20  ash initialiser 
9a50: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 52 61 6e  */ .  sqlite3Ran
9a60: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
9a70: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
9a80: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
9a90: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
9aa0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
9ab0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
9ac0: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
9ad0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
9ae0: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
9af0: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
9b00: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
9b10: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
9b20: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
9b30: 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f  er->dbSize);.  /
9b40: 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65  * The assumed se
9b50: 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ctor size for th
9b60: 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  is process */.  
9b70: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
9b80: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
9b90: 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50  alMagic)+12], pP
9ba0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
9bb0: 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4a  );.  IOTRACE(("J
9bc0: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
9bd0: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
9be0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 73  r->journalHdr, s
9bf0: 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29 29  izeof(zHeader)))
9c00: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
9c10: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
9c20: 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a  fd, zHeader, siz
9c30: 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 70 50 61  eof(zHeader),pPa
9c40: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
9c50: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
9c60: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
9c70: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
9c80: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  ;..  /* The jour
9c90: 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73 20 62  nal header has b
9ca0: 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63  een written succ
9cb0: 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74  essfully. Seek t
9cc0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
9cd0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9ce0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
9cf0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
9d00: 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20   sector..  */.  
9d10: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
9d20: 4b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  K ){.    IOTRACE
9d30: 28 28 22 4a 54 41 49 4c 20 25 70 20 25 6c 6c 64  (("JTAIL %p %lld
9d40: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
9d50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d  ger->journalOff-
9d60: 31 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  1)).    rc = sql
9d70: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
9d80: 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c  er->jfd, "\000",
9d90: 20 31 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   1, pPager->jour
9da0: 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20 7d 0a 20  nalOff-1);.  }. 
9db0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9dc0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
9dd0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
9de0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
9df0: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
9e00: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
9e10: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
9e20: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
9e30: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
9e40: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
9e50: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
9e60: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
9e70: 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72  bove function wr
9e80: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  iteJournalHdr() 
9e90: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
9ea0: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  n of.** the jour
9eb0: 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61  nal header forma
9ec0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
9ed0: 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73  header is read s
9ee0: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52  uccessfully, *nR
9ef0: 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ec is set to the
9f00: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
9f10: 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f  ge records follo
9f20: 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72  wing this header
9f30: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20   and *dbSize is 
9f40: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
9f50: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
9f60: 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  se before the tr
9f70: 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c  ansaction began,
9f80: 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c   in pages. Also,
9f90: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
9fa0: 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  it.** is set to 
9fb0: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
9fc0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
9fd0: 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f  header. SQLITE_O
9fe0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
9ff0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
a000: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
a010: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20  nal header file 
a020: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f  appears to be co
a030: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
a040: 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72  DONE is.** retur
a050: 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e  ned and *nRec an
a060: 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f  d *dbSize are no
a070: 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e  t set.  If JOURN
a080: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a  AL_HDR_SZ bytes.
a090: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61  ** cannot be rea
a0a0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
a0b0: 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72  al file an error
a0c0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
a0d0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
a0e0: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
a0f0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
a100: 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  , .  i64 journal
a110: 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52  Size,.  u32 *pNR
a120: 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53  ec, .  u32 *pDbS
a130: 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ize.){.  int rc;
a140: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
a150: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
a160: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
a170: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
a180: 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66   */.  i64 jrnlOf
a190: 66 3b 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61  f;..  seekJourna
a1a0: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
a1b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
a1c0: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
a1d0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
a1e0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
a1f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a200: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 6a 72 6e  _DONE;.  }.  jrn
a210: 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lOff = pPager->j
a220: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 72 63  ournalOff;..  rc
a230: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
a240: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
a250: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
a260: 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a  gic), jrnlOff);.
a270: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
a280: 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20  n rc;.  jrnlOff 
a290: 2b 3d 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  += sizeof(aMagic
a2a0: 29 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70  );..  if( memcmp
a2b0: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
a2c0: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
a2d0: 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
a2e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a2f0: 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  DONE;.  }..  rc 
a300: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
a310: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
a320: 66 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28  f, pNRec);.  if(
a330: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
a340: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
a350: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
a360: 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20 26 70 50 61   jrnlOff+4, &pPa
a370: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
a380: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
a390: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  rn rc;..  rc = r
a3a0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
a3b0: 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 38  ->jfd, jrnlOff+8
a3c0: 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66  , pDbSize);.  if
a3d0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a3e0: 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
a3f0: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
a400: 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
a410: 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
a420: 79 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63  y .  ** the proc
a430: 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64  ess that created
a440: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49   this journal. I
a450: 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  f this journal w
a460: 61 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  as.  ** created 
a470: 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68  by a process oth
a480: 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
a490: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
a4a0: 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e  ine.  ** is bein
a4b0: 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  g called from wi
a4c0: 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62  thin pager_playb
a4d0: 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c  ack(). The local
a4e0: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50   value.  ** of P
a4f0: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
a500: 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74  is restored at t
a510: 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72  he end of that r
a520: 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72  outine..  */.  r
a530: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
a540: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
a550: 4f 66 66 2b 31 32 2c 20 28 75 33 32 20 2a 29 26  Off+12, (u32 *)&
a560: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
a570: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
a580: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50  return rc;..  pP
a590: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
a5a0: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
a5b0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  SZ(pPager);.  re
a5c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a5d0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
a5e0: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
a5f0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
a600: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
a610: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
a620: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
a630: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
a640: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
a650: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
a660: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
a670: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
a680: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
a690: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
a6a0: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
a6b0: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
a6c0: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
a6d0: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
a6e0: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
a6f0: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
a700: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
a710: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
a720: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b  rmat is:.**.** +
a730: 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f   4 bytes: PAGER_
a740: 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20  MJ_PGNO..** + N 
a750: 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66  bytes: length of
a760: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a770: 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74  name..** + 4 byt
a780: 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74  es: N.** + 4 byt
a790: 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
a7a0: 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
a7b0: 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20  ..** + 8 bytes: 
a7c0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
a7d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
a7e0: 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
a7f0: 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
a800: 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
a810: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
a820: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
a830: 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
a840: 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
a850: 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
a860: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
a870: 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
a880: 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
a890: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
a8a0: 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
a8b0: 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
a8c0: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
a8d0: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
a8e0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65  int rc;.  int le
a8f0: 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20  n; .  int i; .  
a900: 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 75  i64 jrnlOff;.  u
a910: 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20  32 cksum = 0;.  
a920: 63 68 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66  char zBuf[sizeof
a930: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
a940: 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  2*4];..  if( !zM
a950: 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d  aster || pPager-
a960: 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65 74 75  >setMaster) retu
a970: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
a980: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
a990: 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20  r = 1;..  len = 
a9a0: 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b  strlen(zMaster);
a9b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
a9c0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; i++){.    cks
a9d0: 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d  um += zMaster[i]
a9e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69  ;.  }..  /* If i
a9f0: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
aa00: 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65  , advance to the
aa10: 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f   next disk secto
aa20: 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  r before writing
aa30: 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72  .  ** the master
aa40: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54   journal name. T
aa50: 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74  his is in case t
aa60: 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65  he previous page
aa70: 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a   written to.  **
aa80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
aa90: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
aaa0: 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nced..  */.  if(
aab0: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
aac0: 63 20 29 7b 0a 20 20 20 20 73 65 65 6b 4a 6f 75  c ){.    seekJou
aad0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
aae0: 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d  .  }.  jrnlOff =
aaf0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ab00: 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  Off;.  pPager->j
ab10: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65  ournalOff += (le
ab20: 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77  n+20);..  rc = w
ab30: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
ab40: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c  r->jfd, jrnlOff,
ab50: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
ab60: 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72  Pager));.  if( r
ab70: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
ab80: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
ab90: 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20 20 72 63 20  Off += 4;..  rc 
aba0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
abb0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
abc0: 61 73 74 65 72 2c 20 6c 65 6e 2c 20 6a 72 6e 6c  aster, len, jrnl
abd0: 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Off);.  if( rc!=
abe0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
abf0: 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66  rn rc;.  jrnlOff
ac00: 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20 70 75 74 33   += len;..  put3
ac10: 32 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29  2bits(zBuf, len)
ac20: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
ac30: 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a  Buf[4], cksum);.
ac40: 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 38    memcpy(&zBuf[8
ac50: 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ], aJournalMagic
ac60: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
ac70: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20 3d  lMagic));.  rc =
ac80: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
ac90: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75  pPager->jfd, zBu
aca0: 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75  f, 8+sizeof(aJou
acb0: 72 6e 61 6c 4d 61 67 69 63 29 2c 20 6a 72 6e 6c  rnalMagic), jrnl
acc0: 4f 66 66 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Off);.  pPager->
acd0: 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
ace0: 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65  er->noSync;.  re
acf0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ad00: 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20  * Add or remove 
ad10: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
ad20: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
ad30: 73 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68  s that are in th
ad40: 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a  e.** statement j
ad50: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
ad60: 65 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20  e Pager keeps a 
ad70: 73 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66  separate list of
ad80: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
ad90: 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20  currently in.** 
ada0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
adb0: 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c  urnal.  This hel
adc0: 70 73 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ps the sqlite3Pa
add0: 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 29 0a  gerStmtCommit().
ade0: 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d  ** routine run M
adf0: 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74  UCH faster for t
ae00: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
ae10: 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d  here there are m
ae20: 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20  any.** pages in 
ae30: 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20  memory but only 
ae40: 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65  a few are in the
ae50: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
ae60: 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  al..*/.static vo
ae70: 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73  id page_add_to_s
ae80: 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a  tmt_list(PgHdr *
ae90: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
aea0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
aeb0: 67 65 72 3b 0a 20 20 50 67 48 69 73 74 6f 72 79  ger;.  PgHistory
aec0: 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
aed0: 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
aee0: 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
aef0: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21  MEMDB );.  if( !
af00: 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 7b  pHist->inStmt ){
af10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69  .    assert( pHi
af20: 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30  st->pPrevStmt==0
af30: 20 26 26 20 70 48 69 73 74 2d 3e 70 4e 65 78 74   && pHist->pNext
af40: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Stmt==0 );.    i
af50: 66 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  f( pPager->pStmt
af60: 20 29 7b 0a 20 20 20 20 20 20 50 47 48 44 52 5f   ){.      PGHDR_
af70: 54 4f 5f 48 49 53 54 28 70 50 61 67 65 72 2d 3e  TO_HIST(pPager->
af80: 70 53 74 6d 74 2c 20 70 50 61 67 65 72 29 2d 3e  pStmt, pPager)->
af90: 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 3b  pPrevStmt = pPg;
afa0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 48 69 73 74  .    }.    pHist
afb0: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50  ->pNextStmt = pP
afc0: 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 20  ager->pStmt;.   
afd0: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
afe0: 20 70 50 67 3b 0a 20 20 20 20 70 48 69 73 74 2d   pPg;.    pHist-
aff0: 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d  >inStmt = 1;.  }
b000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
b010: 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
b020: 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
b030: 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20  s page number.  
b040: 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  Return.** a poin
b050: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
b060: 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  or NULL if not f
b070: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
b080: 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
b090: 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
b0a0: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
b0b0: 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 66 28   PgHdr *p;.  if(
b0c0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 3d 3d   pPager->aHash==
b0d0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b0e0: 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  p = pPager->aHas
b0f0: 68 5b 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  h[pgno & (pPager
b100: 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a 20 20 77  ->nHash-1)];.  w
b110: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67  hile( p && p->pg
b120: 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20  no!=pgno ){.    
b130: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68  p = p->pNextHash
b140: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
b150: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
b160: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
b170: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ile..*/.static v
b180: 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  oid pager_unlock
b190: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
b1a0: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
b1b0: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
b1c0: 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
b1d0: 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 6f 63  ){.      osUnloc
b1e0: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  k(pPager->fd, NO
b1f0: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70 50  _LOCK);.      pP
b200: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
b210: 31 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  1;.      IOTRACE
b220: 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c  (("UNLOCK %p\n",
b230: 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 7d 0a   pPager)).    }.
b240: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
b250: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
b260: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
b270: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
b280: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
b290: 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61  Execute a rollba
b2a0: 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ck if a transact
b2b0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
b2c0: 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a  d unlock the .**
b2d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
b2e0: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
b2f0: 69 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  if the pager has
b300: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
b310: 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 73 74  .** the error-st
b320: 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ate..*/.static v
b330: 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41  oid pagerUnlockA
b340: 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  ndRollback(Pager
b350: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65   *p){.  if( p->e
b360: 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b  rrCode ) return;
b370: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74  .  assert( p->st
b380: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
b390: 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61  VED || p->journa
b3a0: 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 69 66  lOpen==0 );.  if
b3b0: 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ( p->state>=PAGE
b3c0: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
b3d0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
b3e0: 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 20  llback(p);.  }. 
b3f0: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29   pager_unlock(p)
b400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
b410: 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f  rrCode || !p->jo
b420: 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d  urnalOpen || (p-
b430: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 26 26  >exclusiveMode&&
b440: 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  !p->journalOff) 
b450: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
b460: 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 73  errCode || !p->s
b470: 74 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65 78  tmtOpen || p->ex
b480: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 7d  clusiveMode );.}
b490: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  .../*.** Clear t
b4a0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
b4b0: 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
b4c0: 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74  e.** sets the st
b4d0: 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ate of the pager
b4e0: 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74   back to what it
b4f0: 20 77 61 73 20 77 68 65 6e 20 69 74 20 77 61 73   was when it was
b500: 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64   first.** opened
b510: 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69  .  Any outstandi
b520: 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
b530: 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75 62  alidated and sub
b540: 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73  sequent attempts
b550: 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
b560: 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c  ose pages will l
b570: 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ikely result in 
b580: 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73  a coredump..*/.s
b590: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
b5a0: 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50  _reset(Pager *pP
b5b0: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
b5c0: 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69  pPg, *pNext;.  i
b5d0: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
b5e0: 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  de ) return;.  f
b5f0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
b600: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  All; pPg; pPg=pN
b610: 65 78 74 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  ext){.    IOTRAC
b620: 45 28 28 22 50 47 46 52 45 45 20 25 70 20 25 64  E(("PGFREE %p %d
b630: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
b640: 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 50 41  ->pgno));.    PA
b650: 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
b660: 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f  _pager_pgfree_co
b670: 75 6e 74 29 3b 0a 20 20 20 20 70 4e 65 78 74 20  unt);.    pNext 
b680: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
b690: 0a 20 20 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f  .    lruListRemo
b6a0: 76 65 28 70 50 67 29 3b 0a 20 20 20 20 73 71 6c  ve(pPg);.    sql
b6b0: 69 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a  ite3_free(pPg);.
b6c0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 70 50 61    }.  assert(pPa
b6d0: 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3d  ger->lru.pFirst=
b6e0: 3d 30 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  =0);.  assert(pP
b6f0: 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
b700: 53 79 6e 63 65 64 3d 3d 30 29 3b 0a 20 20 61 73  Synced==0);.  as
b710: 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75  sert(pPager->lru
b720: 2e 70 4c 61 73 74 3d 3d 30 29 3b 0a 20 20 70 50  .pLast==0);.  pP
b730: 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
b740: 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  .  pPager->pAll 
b750: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
b760: 48 61 73 68 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Hash = 0;.  sqli
b770: 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
b780: 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65  >aHash);.  pPage
b790: 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->nPage = 0;.  
b7a0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20  pPager->aHash = 
b7b0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
b7c0: 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f = 0;.}../*.** 
b7d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64  This routine end
b7e0: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  s a transaction.
b7f0: 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20    A transaction 
b800: 69 73 20 65 6e 64 65 64 20 62 79 20 65 69 74 68  is ended by eith
b810: 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54 20 6f  er.** a COMMIT o
b820: 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a  r a ROLLBACK..**
b830: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
b840: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
b850: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
b860: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b870: 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45  open and.** a RE
b880: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
b890: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
b8a0: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
b8b0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 6c  routine will rel
b8c0: 65 61 73 65 0a 2a 2a 20 74 68 65 20 64 61 74 61  ease.** the data
b8d0: 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63  base lock and ac
b8e0: 71 75 69 72 65 73 20 61 20 53 48 41 52 45 44 20  quires a SHARED 
b8f0: 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63  lock in its plac
b900: 65 20 69 66 20 74 68 61 74 20 69 73 0a 2a 2a 20  e if that is.** 
b910: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
b920: 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20 52 65  thing to do.  Re
b930: 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75 73 75 61  lease locks usua
b940: 6c 6c 79 20 69 73 20 61 70 70 72 6f 70 72 69 61  lly is appropria
b950: 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 77 65  te,.** unless we
b960: 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76   are in exclusiv
b970: 65 20 61 63 63 65 73 73 20 6d 6f 64 65 20 6f 72  e access mode or
b980: 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20   unless this is 
b990: 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e 44  a .** COMMIT AND
b9a0: 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c 42 41   BEGIN or ROLLBA
b9b0: 43 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f 70 65  CK AND BEGIN ope
b9c0: 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ration..**.** Th
b9d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
b9e0: 73 20 65 69 74 68 65 72 20 64 65 6c 65 74 65 64  s either deleted
b9f0: 20 6f 72 20 74 72 75 6e 63 61 74 65 64 2e 0a 2a   or truncated..*
ba00: 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69  *.** TODO: Consi
ba10: 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20  der keeping the 
ba20: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
ba30: 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  n for temporary 
ba40: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68  databases..** Th
ba50: 69 73 20 6d 69 67 68 74 20 67 69 76 65 20 61 20  is might give a 
ba60: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
ba70: 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f  ovement on windo
ba80: 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67  ws where opening
ba90: 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e  .** a file is an
baa0: 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
bab0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
bac0: 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
bad0: 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
bae0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
baf0: 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
bb00: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
bb10: 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
bb20: 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 21  _OK;.  assert( !
bb30: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70  MEMDB );.  if( p
bb40: 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
bb50: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
bb60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bb70: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  _OK;.  }.  sqlit
bb80: 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
bb90: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
bba0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
bbb0: 6e 20 26 26 20 21 70 50 61 67 65 72 2d 3e 65 78  n && !pPager->ex
bbc0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
bbd0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
bbe0: 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b  e(pPager->stfd);
bbf0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
bc00: 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20  tOpen = 0;.  }. 
bc10: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
bc20: 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
bc30: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  if( pPager->excl
bc40: 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 20 20  usiveMode .     
bc50: 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 73 71       && (rc = sq
bc60: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
bc70: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 29  pPager->jfd, 0))
bc80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 3b 0a  ==SQLITE_OK ){;.
bc90: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
bca0: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
bcb0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
bcc0: 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
bcd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bce0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
bcf0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
bd00: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
bd10: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
bd20: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
bd30: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
bd40: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
bd50: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
bd60: 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
bd70: 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  nal, 0);.      }
bd80: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
bd90: 65 33 5f 66 72 65 65 28 20 70 50 61 67 65 72 2d  e3_free( pPager-
bda0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >aInJournal );. 
bdb0: 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
bdc0: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66  urnal = 0;.    f
bdd0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
bde0: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
bdf0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
be00: 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
be10: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
be20: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
be30: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
be40: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  c = 0;.      pPg
be50: 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
be60: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
be70: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
be80: 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48        pPg->pageH
be90: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
bea0: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
beb0: 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  f.    }.    pPag
bec0: 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  er->pDirty = 0;.
bed0: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
bee0: 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  yCache = 0;.    
bef0: 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
bf00: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
bf10: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
bf20: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
bf30: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
bf40: 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d  er->dirtyCache==
bf50: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75 73 65  0 || pPager->use
bf60: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
bf70: 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  }..  if( !pPager
bf80: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
bf90: 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55  ){.    rc2 = osU
bfa0: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
bfb0: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
bfc0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
bfd0: 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
bfe0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
bff0: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
c000: 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20  ER_SYNCED ){.   
c010: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
c020: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
c030: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
c040: 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a  origDbSize = 0;.
c050: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
c060: 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ter = 0;.  pPage
c070: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
c080: 0a 20 20 6c 72 75 4c 69 73 74 53 65 74 46 69 72  .  lruListSetFir
c090: 73 74 53 79 6e 63 65 64 28 70 50 61 67 65 72 29  stSynced(pPager)
c0a0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
c0b0: 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 72 65 74 75  ze = -1;..  retu
c0c0: 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
c0d0: 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a  K?rc2:rc);.}../*
c0e0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20  .** Compute and 
c0f0: 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75  return a checksu
c100: 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f  m for the page o
c110: 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68  f data..**.** Th
c120: 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
c130: 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69   checksum.  It i
c140: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
c150: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
c160: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
c170: 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61  value and the pa
c180: 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65  ge number.  We e
c190: 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68  xperimented with
c1a0: 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f  .** a checksum o
c1b0: 66 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74  f the entire dat
c1c0: 61 2c 20 62 75 74 20 74 68 61 74 20 77 61 73 20  a, but that was 
c1d0: 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20  found to be too 
c1e0: 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  slow..**.** Note
c1f0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
c200: 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64 20  umber is stored 
c210: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
c220: 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20   of data and.** 
c230: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  the checksum is 
c240: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
c250: 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f  d.  This is impo
c260: 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e  rtant.  If journ
c270: 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e  al.** corruption
c280: 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61   occurs due to a
c290: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
c2a0: 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20  the most likely 
c2b0: 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74  scenario.** is t
c2c0: 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74  hat one end or t
c2d0: 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
c2e0: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63  record will be c
c2f0: 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a  hanged.  It is.*
c300: 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65  * much less like
c310: 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  ly that the two 
c320: 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ends of the jour
c330: 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  nal record will 
c340: 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e  be.** correct an
c350: 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20  d the middle be 
c360: 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20  corrupt.  Thus, 
c370: 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20  this "checksum" 
c380: 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67  scheme,.** thoug
c390: 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c  h fast and simpl
c3a0: 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d  e, catches the m
c3b0: 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e  ostly likely kin
c3c0: 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d of corruption.
c3d0: 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20  .**.** FIX ME:  
c3e0: 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20  Consider adding 
c3f0: 65 76 65 72 79 20 32 30 30 74 68 20 28 6f 72 20  every 200th (or 
c400: 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65 20  so) byte of the 
c410: 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63  data to the.** c
c420: 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77  hecksum.  That w
c430: 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70  ay if a single p
c440: 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d  age spans 3 or m
c450: 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  ore disk sectors
c460: 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65   and.** only the
c470: 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69   middle sector i
c480: 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69  s corrupt, we wi
c490: 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20  ll still have a 
c4a0: 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68  reasonable.** ch
c4b0: 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20  ance of failing 
c4c0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64  the checksum and
c4d0: 20 74 68 75 73 20 64 65 74 65 63 74 69 6e 67 20   thus detecting 
c4e0: 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  the problem..*/.
c4f0: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
c500: 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50  _cksum(Pager *pP
c510: 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a  ager, const u8 *
c520: 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b  aData){.  u32 ck
c530: 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  sum = pPager->ck
c540: 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69  sumInit;.  int i
c550: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
c560: 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65  ize-200;.  while
c570: 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73  ( i>0 ){.    cks
c580: 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a  um += aData[i];.
c590: 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20      i -= 200;.  
c5a0: 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d  }.  return cksum
c5b0: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
c5c0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73  declaration */.s
c5d0: 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43  tatic void makeC
c5e0: 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a 2f  lean(PgHdr*);../
c5f0: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67  *.** Read a sing
c600: 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  le page from the
c610: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
c620: 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73  ened on file des
c630: 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20  criptor.** jfd. 
c640: 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f   Playback this o
c650: 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  ne page..**.** I
c660: 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74  f useCksum==0 it
c670: 20 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72   means this jour
c680: 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  nal does not use
c690: 20 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65   checksums.  Che
c6a0: 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f  cksums.** are no
c6b0: 74 20 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d  t used in statem
c6c0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63  ent journals bec
c6d0: 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a  ause statement j
c6e0: 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a  ournals do not.*
c6f0: 2a 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76  * need to surviv
c700: 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  e power failures
c710: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c720: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
c730: 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72  ne_page(.  Pager
c740: 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 73 71 6c   *pPager, .  sql
c750: 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 2c 0a  ite3_file *jfd,.
c760: 20 20 69 36 34 20 6f 66 66 73 65 74 2c 0a 20 20    i64 offset,.  
c770: 69 6e 74 20 75 73 65 43 6b 73 75 6d 0a 29 7b 0a  int useCksum.){.
c780: 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
c790: 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20  r *pPg;         
c7a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
c7b0: 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e  existing page in
c7c0: 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20   the cache */.  
c7d0: 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c7f0: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
c800: 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f   of a page in jo
c810: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
c820: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
c830: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
c840: 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61  ksum used for sa
c850: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f  nity checking */
c860: 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 28  .  u8 *aData = (
c870: 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
c880: 70 53 70 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d  pSpace;   /* Tem
c890: 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20  p storage for a 
c8a0: 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73  page */..  /* us
c8b0: 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62 65  eCksum should be
c8c0: 20 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d 61   true for the ma
c8d0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66  in journal and f
c8e0: 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74  alse for.  ** st
c8f0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
c900: 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
c910: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 74 68  his is always th
c920: 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73  e case.  */.  as
c930: 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 75 73  sert( jfd == (us
c940: 65 43 6b 73 75 6d 20 3f 20 70 50 61 67 65 72 2d  eCksum ? pPager-
c950: 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73  >jfd : pPager->s
c960: 74 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tfd) );.  assert
c970: 28 20 61 44 61 74 61 20 29 3b 0a 0a 20 20 72 63  ( aData );..  rc
c980: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
c990: 64 2c 20 6f 66 66 73 65 74 2c 20 26 70 67 6e 6f  d, offset, &pgno
c9a0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
c9b0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
c9c0: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
c9d0: 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44  e3OsRead(jfd, aD
c9e0: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
c9f0: 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
ca00: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
ca10: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
ca20: 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c;.  pPager->jou
ca30: 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65  rnalOff += pPage
ca40: 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b  r->pageSize + 4;
ca50: 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
ca60: 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
ca70: 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ge.  This is mor
ca80: 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  e important that
ca90: 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20   I originally.  
caa0: 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20  ** thought.  If 
cab0: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
cac0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
cad0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
cae0: 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20  g written,.  ** 
caf0: 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69  it could cause i
cb00: 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62  nvalid data to b
cb10: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
cb20: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20  he journal.  We 
cb30: 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74  need to.  ** det
cb40: 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64  ect this invalid
cb50: 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68   data (with high
cb60: 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e   probability) an
cb70: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a  d ignore it..  *
cb80: 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
cb90: 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
cba0: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
cbb0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
cbc0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
cbd0: 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e  if( pgno>(unsign
cbe0: 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
cbf0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
cc00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
cc10: 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b   if( useCksum ){
cc20: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
cc30: 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65 74  bits(jfd, offset
cc40: 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
cc50: 65 2b 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  e+4, &cksum);.  
cc60: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
cc70: 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72  n rc;.    pPager
cc80: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
cc90: 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  4;.    if( pager
cca0: 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61  _cksum(pPager, a
ccb0: 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
ccc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ccd0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
cce0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
ccf0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
cd00: 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20  GER_RESERVED || 
cd10: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
cd20: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
cd30: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
cd40: 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52  ager is in RESER
cd50: 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  VED state, then 
cd60: 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
cd70: 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a  copy of this.  *
cd80: 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61  * page in the pa
cd90: 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68  ger cache. In th
cda0: 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64  is case just upd
cdb0: 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
cdc0: 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  che,.  ** not th
cdd0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
cde0: 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66   The page is lef
cdf0: 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69  t marked dirty i
ce00: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
ce10: 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74  *.  ** An except
ce20: 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65  ion to the above
ce30: 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61   rule: If the da
ce40: 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d  tabase is in no-
ce50: 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61  sync mode.  ** a
ce60: 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76  nd a page is mov
ce70: 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63  ed during an inc
ce80: 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
ce90: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
cea0: 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e  y.  ** not be in
ceb0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
cec0: 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61  . Later: if a ma
ced0: 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72  lloc() or IO err
cee0: 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  or occurs.  ** d
cef0: 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65  uring a Movepage
cf00: 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68  () call, then th
cf10: 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  e page may not b
cf20: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20  e in the cache. 
cf30: 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74   ** either. So t
cf40: 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  he condition des
cf50: 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62  cribed in the ab
cf60: 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73  ove paragraph is
cf70: 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74   not.  ** assert
cf80: 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ()able..  **.  *
cf90: 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56  * If in EXCLUSIV
cfa0: 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  E state, then we
cfb0: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
cfc0: 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78  r cache if it ex
cfd0: 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ists.  ** and th
cfe0: 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
cff0: 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
d000: 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a  rked not dirty..
d010: 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74    **.  ** Ticket
d020: 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61   #1171:  The sta
d030: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d  tement journal m
d040: 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67  ight contain pag
d050: 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69  e content that i
d060: 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74  s.  ** different
d070: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63   from the page c
d080: 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74  ontent at the st
d090: 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
d0a0: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69  action..  ** Thi
d0b0: 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20  s occurs when a 
d0c0: 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20  page is changed 
d0d0: 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
d0e0: 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e  rt of a statemen
d0f0: 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e  t.  ** then chan
d100: 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e  ged again within
d110: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
d120: 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
d130: 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73  ck such a.  ** s
d140: 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74  tatement we must
d150: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
d160: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
d170: 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e  ase unless we kn
d180: 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74  ow.  ** for cert
d190: 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61  ain that origina
d1a0: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  l page contents 
d1b0: 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20  are synced into 
d1c0: 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
d1d0: 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
d1e0: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f   Otherwise, a po
d1f0: 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c  wer loss might l
d200: 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61  eave modified da
d210: 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ta in the.  ** d
d220: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74  atabase file wit
d230: 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  hout an entry in
d240: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
d250: 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20  urnal that can. 
d260: 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20   ** restore the 
d270: 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20  database to its 
d280: 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20  original form.  
d290: 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d  Two conditions m
d2a0: 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20  ust be.  ** met 
d2b0: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  before writing t
d2c0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
d2d0: 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61  iles. (1) the da
d2e0: 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20  tabase must be. 
d2f0: 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29   ** locked.  (2)
d300: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
d310: 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  e original page 
d320: 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79  content is fully
d330: 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20   synced.  ** in 
d340: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
d350: 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
d360: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
d370: 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65  in cache or else
d380: 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69  .  ** the page i
d390: 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64  s marked as need
d3a0: 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20  Sync==0..  */.  
d3b0: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
d3c0: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
d3d0: 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28  ;.  PAGERTRACE4(
d3e0: 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67  "PLAYBACK %d pag
d3f0: 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
d400: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
d410: 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
d420: 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
d430: 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d  datahash(pPager-
d440: 3e 70 61 67 65 53 69 7a 65 2c 20 61 44 61 74 61  >pageSize, aData
d450: 29 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  ));.  if( pPager
d460: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
d470: 58 43 4c 55 53 49 56 45 20 26 26 20 28 70 50 67  XCLUSIVE && (pPg
d480: 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64  ==0 || pPg->need
d490: 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20  Sync==0) ){.    
d4a0: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67  i64 offset = (pg
d4b0: 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
d4c0: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
d4d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
d4e0: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
d4f0: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
d500: 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
d510: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 20 29  );.    if( pPg )
d520: 7b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61  {.      makeClea
d530: 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  n(pPg);.    }.  
d540: 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  }.  if( pPg ){. 
d550: 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68     /* No page sh
d560: 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70  ould ever be exp
d570: 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62  licitly rolled b
d580: 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75  ack that is in u
d590: 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a  se, except.    *
d5a0: 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69  * for page 1 whi
d5b0: 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73  ch is held in us
d5c0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  e in order to ke
d5d0: 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  ep the lock on t
d5e0: 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
d5f0: 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76  se active. Howev
d600: 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d  er such a page m
d610: 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ay be rolled bac
d620: 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20  k as a result.  
d630: 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72    ** of an inter
d640: 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74  nal error result
d650: 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61  ing in an automa
d660: 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  tic call to.    
d670: 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  ** sqlite3PagerR
d680: 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a  ollback()..    *
d690: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  /.    void *pDat
d6a0: 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74  a;.    /* assert
d6b0: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c  ( pPg->nRef==0 |
d6c0: 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29  | pPg->pgno==1 )
d6d0: 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d  ; */.    pData =
d6e0: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
d6f0: 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  Pg);.    memcpy(
d700: 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50  pData, aData, pP
d710: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
d720: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
d730: 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
d740: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
d750: 6e 69 74 65 72 28 70 50 67 2c 20 70 50 61 67 65  niter(pPg, pPage
d760: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
d770: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
d780: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
d790: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
d7a0: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
d7b0: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
d7c0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
d7d0: 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65   page 1, then re
d7e0: 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
d7f0: 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
d800: 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74  ers..    ** Do t
d810: 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64  his before any d
d820: 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  ecoding. */.    
d830: 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
d840: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
d850: 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
d860: 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32   &((u8*)pData)[2
d870: 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72  4],sizeof(pPager
d880: 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
d890: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
d8a0: 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75  code the page ju
d8b0: 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  st read from dis
d8c0: 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28  k */.    CODEC1(
d8d0: 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
d8e0: 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  Pg->pgno, 3);.  
d8f0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
d900: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
d910: 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
d920: 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
d930: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
d940: 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
d950: 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
d960: 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
d970: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d980: 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
d990: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
d9a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
d9b0: 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
d9c0: 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
d9d0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
d9e0: 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
d9f0: 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
da00: 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
da10: 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
da20: 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
da30: 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
da40: 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
da50: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
da60: 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
da70: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a  unction..**.**.*
da80: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
da90: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
daa0: 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ns the names of 
dab0: 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  all child journa
dac0: 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69  ls..** To tell i
dad0: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
dae0: 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  al can be delete
daf0: 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68  d, check to each
db00: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64   of the.** child
db10: 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69  ren.  If all chi
db20: 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68 65 72  ldren are either
db30: 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e   missing or do n
db40: 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61  ot refer to.** a
db50: 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65   different maste
db60: 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  r journal, then 
db70: 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72  this master jour
db80: 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74  nal can be delet
db90: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
dba0: 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
dbb0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
dbc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
dbd0: 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
dbe0: 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
dbf0: 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
dc00: 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65   rc;.  int maste
dc10: 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71  r_open = 0;.  sq
dc20: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
dc30: 74 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ter;.  sqlite3_f
dc40: 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20  ile *pJournal;. 
dc50: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f   char *zMasterJo
dc60: 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f  urnal = 0; /* Co
dc70: 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72  ntents of master
dc80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
dc90: 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f  .  i64 nMasterJo
dca0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20  urnal;       /* 
dcb0: 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Size of master j
dcc0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a  ournal file */..
dcd0: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61    /* Open the ma
dce0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
dcf0: 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e  e exclusively in
dd00: 20 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72   case some other
dd10: 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73   process.  ** is
dd20: 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f   running this ro
dd30: 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20  utine also. Not 
dd40: 74 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f  that it makes to
dd50: 6f 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63  o much differenc
dd60: 65 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65  e..  */.  pMaste
dd70: 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  r = (sqlite3_fil
dd80: 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e *)sqlite3_mall
dd90: 6f 63 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  oc(pVfs->szOsFil
dda0: 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e  e * 2);.  pJourn
ddb0: 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  al = (sqlite3_fi
ddc0: 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61  le *)(((u8 *)pMa
ddd0: 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a  ster) + pVfs->sz
dde0: 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  OsFile);.  if( !
ddf0: 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  pMaster ){.    r
de00: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
de10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
de20: 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
de30: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
de40: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
de50: 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  TER_JOURNAL);.  
de60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
de70: 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74  Open(pVfs, zMast
de80: 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61  er, pMaster, fla
de90: 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  gs, 0);.  }.  if
dea0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
deb0: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
dec0: 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f  _out;.  master_o
ded0: 70 65 6e 20 3d 20 31 3b 0a 0a 20 20 72 63 20 3d  pen = 1;..  rc =
dee0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
def0: 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(pMaster, &nMa
df00: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
df10: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
df20: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
df30: 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e  er_out;..  if( n
df40: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20  MasterJournal>0 
df50: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f  ){.    char *zJo
df60: 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20  urnal;.    char 
df70: 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b  *zMasterPtr = 0;
df80: 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  .    int nMaster
df90: 50 74 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Ptr = pPager->pV
dfa0: 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
dfb0: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  ;..    /* Load t
dfc0: 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
dfd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
dfe0: 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
dff0: 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71  d from.    ** sq
e000: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61  lite3_malloc() a
e010: 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  nd pointed to by
e020: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e   zMasterJournal.
e030: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61   .    */.    zMa
e040: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63  sterJournal = (c
e050: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
e060: 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72  lloc(nMasterJour
e070: 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72  nal + nMasterPtr
e080: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
e090: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
e0a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e0b0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
e0c0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
e0d0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74  .    }.    zMast
e0e0: 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72  erPtr = &zMaster
e0f0: 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
e100: 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20  ournal];.    rc 
e110: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
e120: 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  pMaster, zMaster
e130: 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72  Journal, nMaster
e140: 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
e150: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e160: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
e170: 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a  ter_out;..    zJ
e180: 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72  ournal = zMaster
e190: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69  Journal;.    whi
e1a0: 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
e1b0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
e1c0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
e1d0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
e1e0: 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
e1f0: 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
e200: 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 20  _ACCESS_EXISTS) 
e210: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ){.        /* On
e220: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
e230: 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
e240: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
e250: 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
e260: 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e     ** Open it an
e270: 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f  d check if it po
e280: 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74  ints at the mast
e290: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  er journal. If. 
e2a0: 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65         ** so, re
e2b0: 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c  turn without del
e2c0: 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  eting the master
e2d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
e2e0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
e2f0: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
e300: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
e310: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
e320: 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
e330: 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  AIN_JOURNAL);.  
e340: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e350: 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
e360: 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61  Journal, pJourna
e370: 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  l, flags, 0);.  
e380: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
e390: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e3a0: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
e3b0: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
e3c0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d   }..        rc =
e3d0: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
e3e0: 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61  al(pJournal, zMa
e3f0: 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72  sterPtr, nMaster
e400: 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Ptr);.        sq
e410: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f  lite3OsClose(pJo
e420: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  urnal);.        
e430: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e440: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
e450: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
e460: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
e470: 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65        c = zMaste
e480: 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74  rPtr[0]!=0 && st
e490: 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
e4a0: 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20   zMaster)==0;.  
e4b0: 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
e4c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68           /* We h
e4d0: 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20  ave a match. Do 
e4e0: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
e4f0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e500: 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  le. */.         
e510: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
e520: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
e530: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f       }.      zJo
e540: 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e  urnal += (strlen
e550: 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20  (zJournal)+1);. 
e560: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63     }.  }.  .  rc
e570: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
e580: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
e590: 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72  , 0);..delmaster
e5a0: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73  _out:.  if( zMas
e5b0: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
e5c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
e5d0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
e5e0: 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74    }  .  if( mast
e5f0: 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73  er_open ){.    s
e600: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
e610: 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71  aster);.  }.  sq
e620: 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74  lite3_free(pMast
e630: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
e640: 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69  ;.}...static voi
e650: 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  d pager_truncate
e660: 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50  _cache(Pager *pP
e670: 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72  ager);../*.** Tr
e680: 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20  uncate the main 
e690: 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65  file of the give
e6a0: 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65 20 6e  n pager to the n
e6b0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
e6c0: 2a 20 69 6e 64 69 63 61 74 65 64 2e 20 41 6c 73  * indicated. Als
e6d0: 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 63  o truncate the c
e6e0: 61 63 68 65 64 20 72 65 70 72 65 73 65 6e 74 61  ached representa
e6f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65  tion of the file
e700: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e710: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
e720: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
e730: 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  t nPage){.  int 
e740: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
e750: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
e760: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
e770: 53 49 56 45 20 26 26 20 70 50 61 67 65 72 2d 3e  SIVE && pPager->
e780: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
e790: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e7a0: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
e7b0: 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70  r->fd, pPager->p
e7c0: 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61  ageSize*(i64)nPa
e7d0: 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ge);.  }.  if( r
e7e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e7f0: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
e800: 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
e810: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63  pager_truncate_c
e820: 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20  ache(pPager);.  
e830: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
e840: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
e850: 73 65 63 74 6f 72 53 69 7a 65 20 66 6f 72 20 74  sectorSize for t
e860: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
e870: 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 74 6f 72  **.** The sector
e880: 20 73 69 7a 65 20 69 73 20 74 68 65 20 6c 61 72   size is the lar
e890: 67 65 72 20 6f 66 20 74 68 65 20 73 65 63 74 6f  ger of the secto
e8a0: 72 20 73 69 7a 65 20 72 65 70 6f 72 74 65 64 0a  r size reported.
e8b0: 2a 2a 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ** by sqlite3OsS
e8c0: 65 63 74 6f 72 53 69 7a 65 28 29 20 61 6e 64 20  ectorSize() and 
e8d0: 74 68 65 20 70 61 67 65 53 69 7a 65 2e 0a 2a 2f  the pageSize..*/
e8e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
e8f0: 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72  SectorSize(Pager
e900: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
e910: 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e  ert(pPager->fd->
e920: 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72  pMethods||pPager
e930: 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69  ->tempFile);.  i
e940: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
e950: 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53  File ){.    /* S
e960: 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e  ector size doesn
e970: 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65  't matter for te
e980: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41  mporary files. A
e990: 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20  lso, the file.  
e9a0: 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76    ** may not hav
e9b0: 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65  e been opened ye
e9c0: 74 2c 20 69 6e 20 77 68 63 69 68 20 63 61 73 65  t, in whcih case
e9d0: 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a   the OsSectorSiz
e9e0: 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  e().    ** call 
e9f0: 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20  will segfault.. 
ea00: 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
ea10: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73  ->sectorSize = s
ea20: 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
ea30: 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  ze(pPager->fd);.
ea40: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
ea50: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 70 50 61  ->sectorSize<pPa
ea60: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
ea70: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
ea80: 74 6f 72 53 69 7a 65 20 3d 20 70 50 61 67 65 72  torSize = pPager
ea90: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a  ->pageSize;.  }.
eaa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
eab0: 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  k the journal an
eac0: 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74  d thus restore t
ead0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
eae0: 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65   to.** the state
eaf0: 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72   it was in befor
eb00: 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b  e we started mak
eb10: 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a  ing changes.  .*
eb20: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
eb30: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20   file format is 
eb40: 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a  as follows: .**.
eb50: 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20  **  (1)  8 byte 
eb60: 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20  prefix.  A copy 
eb70: 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of aJournalMagic
eb80: 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62  []..**  (2)  4 b
eb90: 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
eba0: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
ebb0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61  the number of va
ebc0: 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73  lid page records
ebd0: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65  .**       in the
ebe0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68   journal.  If th
ebf0: 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  is value is 0xff
ec00: 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d  ffffff, then com
ec10: 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  pute the.**     
ec20: 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65    number of page
ec30: 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
ec40: 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a  e journal size..
ec50: 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20  **  (3)  4 byte 
ec60: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
ec70: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
ec80: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f  initial value fo
ec90: 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  r the .**       
eca0: 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e  sanity checksum.
ecb0: 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65  .**  (4)  4 byte
ecc0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
ecd0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
ece0: 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74  pages to truncat
ecf0: 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64  e the.**       d
ed00: 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e  atabase to durin
ed10: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  g a rollback..**
ed20: 20 20 28 35 29 20 20 34 20 62 79 74 65 20 69 6e    (5)  4 byte in
ed30: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
ed40: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
ed50: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
ed60: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
ed70: 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c    name.  The val
ed80: 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28  ue may be zero (
ed90: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
eda0: 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72  ere is no master
edb0: 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  .**       journa
edc0: 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62  l.).**  (6)  N b
edd0: 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ytes of the mast
ede0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
edf0: 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20    The name will 
ee00: 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  be nul-terminate
ee10: 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d  d.**       and m
ee20: 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 72 20  ight be shorter 
ee30: 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72  than the value r
ee40: 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49  ead from (5).  I
ee50: 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  f the first byte
ee60: 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65  .**       of the
ee70: 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68   name is \000 th
ee80: 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  en there is no m
ee90: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20  aster journal.  
eea0: 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20  The master.**   
eeb0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65      journal name
eec0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54   is stored in UT
eed0: 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65  F-8..**  (7)  Ze
eee0: 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73  ro or more pages
eef0: 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68   instances, each
ef00: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
ef10: 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
ef20: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
ef30: 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65          +  pPage
ef40: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
ef50: 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20  s of data..**   
ef60: 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63       +  4 byte c
ef70: 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68  hecksum.**.** Wh
ef80: 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74  en we speak of t
ef90: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
efa0: 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66  r, we mean the f
efb0: 69 72 73 74 20 36 20 69 74 65 6d 73 20 61 62 6f  irst 6 items abo
efc0: 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72  ve..** Each entr
efd0: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
efe0: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
eff0: 6f 66 20 74 68 65 20 37 74 68 20 69 74 65 6d 2e  of the 7th item.
f000: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
f010: 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73  value from the s
f020: 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52  econd bullet "nR
f030: 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68  ec".  nRec is th
f040: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76  e number of.** v
f050: 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65  alid page entrie
f060: 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
f070: 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73  .  In most cases
f080: 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74  , you can comput
f090: 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  e the.** value o
f0a0: 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20  f nRec from the 
f0b0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
f0c0: 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69  nal file.  But i
f0d0: 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  f a power.** fai
f0e0: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68  lure occurred wh
f0f0: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
f100: 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65  was being writte
f110: 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  n, it could be t
f120: 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20  he.** case that 
f130: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
f140: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64  journal file had
f150: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
f160: 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74  creased but.** t
f170: 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73  he extra entries
f180: 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64   had not yet mad
f190: 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64  e it safely to d
f1a0: 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20  isk.  In such a 
f1b0: 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c  case,.** the val
f1c0: 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75  ue of nRec compu
f1d0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  ted from the fil
f1e0: 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20  e size would be 
f1f0: 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a  too large.  For.
f200: 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20  ** that reason, 
f210: 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
f220: 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20  e nRec value in 
f230: 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a  the header..**.*
f240: 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61  * If the nRec va
f250: 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
f260: 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  f it means that 
f270: 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63  nRec should be c
f280: 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  omputed.** from 
f290: 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20  the file size.  
f2a0: 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73  This value is us
f2b0: 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  ed when the user
f2c0: 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20   selects the.** 
f2d0: 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66  no-sync option f
f2e0: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  or the journal. 
f2f0: 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   A power failure
f300: 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63   could lead to c
f310: 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20  orruption.** in 
f320: 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20  this case.  But 
f330: 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20  for things like 
f340: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
f350: 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a  (which will be.*
f360: 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  * deleted when t
f370: 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  he power is rest
f380: 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63  ored) we don't c
f390: 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20  are.  .**.** If 
f3a0: 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  the file opened 
f3b0: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
f3c0: 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c  ile is not a wel
f3d0: 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72  l-formed.** jour
f3e0: 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c  nal file then al
f3f0: 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68  l pages up to th
f400: 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65  e first corrupte
f410: 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65  d page are rolle
f420: 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f  d.** back (or no
f430: 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f   pages if the jo
f440: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
f450: 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20  corrupted). The 
f460: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
f470: 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20  is then deleted 
f480: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
f490: 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20  turned, just as 
f4a0: 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e  if no corruption
f4b0: 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63   had.** been enc
f4c0: 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  ountered..**.** 
f4d0: 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c  If an I/O or mal
f4e0: 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75  loc() error occu
f4f0: 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  rs, the journal-
f500: 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65  file is not dele
f510: 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ted.** and an er
f520: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
f530: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
f540: 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
f550: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
f560: 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20  , int isHot){.  
f570: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
f580: 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
f590: 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  ;.  i64 szJ;    
f5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f5b0: 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Size of the jour
f5c0: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
f5d0: 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b  s */.  u32 nRec;
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
f600: 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ords in the jour
f610: 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  nal */.  int i; 
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f630: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
f640: 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  r */.  Pgno mxPg
f650: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
f660: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f  /* Size of the o
f670: 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20  riginal file in 
f680: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  pages */.  int r
f690: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
f6a0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
f6b0: 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69  de of a subrouti
f6c0: 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  ne */.  char *zM
f6d0: 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  aster = 0;      
f6e0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74   /* Name of mast
f6f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
f700: 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20  if any */..  /* 
f710: 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
f720: 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
f730: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
f740: 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a   Abort early if.
f750: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
f760: 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   is empty..  */.
f770: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
f780: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
f790: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
f7a0: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
f7b0: 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
f7c0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f7d0: 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20  K || szJ==0 ){. 
f7e0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
f7f0: 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
f800: 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20  Read the master 
f810: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f  journal name fro
f820: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  m the journal, i
f830: 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e  f it is present.
f840: 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  .  ** If a maste
f850: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
f860: 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
f870: 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69  , but the file i
f880: 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65  s not.  ** prese
f890: 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e  nt on disk, then
f8a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
f8b0: 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73  not hot and does
f8c0: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a   not need to be.
f8d0: 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b    ** played back
f8e0: 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  ..  */.  zMaster
f8f0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
f900: 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61  pace;.  rc = rea
f910: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
f920: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
f930: 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
f940: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
f950: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
f960: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
f970: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f980: 4f 4b 20 0a 20 20 20 7c 7c 20 28 7a 4d 61 73 74  OK .   || (zMast
f990: 65 72 5b 30 5d 20 26 26 20 21 73 71 6c 69 74 65  er[0] && !sqlite
f9a0: 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
f9b0: 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
f9c0: 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 29 20  ACCESS_EXISTS)) 
f9d0: 0a 20 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65  .  ){.    zMaste
f9e0: 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
f9f0: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
fa00: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
fa10: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
fa20: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50  ayback;.  }.  pP
fa30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
fa40: 20 3d 20 30 3b 0a 20 20 7a 4d 61 73 74 65 72 20   = 0;.  zMaster 
fa50: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  = 0;..  /* This 
fa60: 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20  loop terminates 
fa70: 65 69 74 68 65 72 20 77 68 65 6e 20 74 68 65 20  either when the 
fa80: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29  readJournalHdr()
fa90: 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20   call returns.  
faa0: 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ** SQLITE_DONE o
fab0: 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  r an IO error oc
fac0: 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65  curs. */.  while
fad0: 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52  ( 1 ){..    /* R
fae0: 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
faf0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
fb00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
fb10: 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
fb20: 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
fb30: 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
fb40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
fb50: 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
fb60: 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
fb70: 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
fb80: 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
fb90: 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65  ss must of faile
fba0: 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
fbb0: 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  it..    ** This 
fbc0: 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e  indicates nothin
fbd0: 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20  g more needs to 
fbe0: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
fbf0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
fc00: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
fc10: 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65  Pager, szJ, &nRe
fc20: 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69  c, &mxPg);.    i
fc30: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
fc40: 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72   ){ .      if( r
fc50: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
fc60: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
fc70: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
fc80: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
fc90: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
fca0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
fcb0: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
fcc0: 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61  then this journa
fcd0: 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  l was created by
fce0: 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a   a process.    *
fcf0: 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d  * working in no-
fd00: 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20  sync mode. This 
fd10: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72  means that the r
fd20: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
fd30: 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  al.    ** file c
fd40: 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73  onsists of pages
fd50: 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  , there are no m
fd60: 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ore journal head
fd70: 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20  ers. Compute.   
fd80: 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
fd90: 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74   nRec based on t
fda0: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a  his assumption..
fdb0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
fdc0: 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20  Rec==0xffffffff 
fdd0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
fde0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fdf0: 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
fe00: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
fe10: 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a       nRec = (szJ
fe20: 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   - JOURNAL_HDR_S
fe30: 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e  Z(pPager))/JOURN
fe40: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
fe50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
fe60: 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
fe70: 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
fe80: 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
fe90: 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
fea0: 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
feb0: 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
fec0: 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
fed0: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
fee0: 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
fef0: 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
ff00: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
ff10: 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
ff20: 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
ff30: 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
ff40: 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
ff50: 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
ff60: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
ff70: 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
ff80: 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
ff90: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
ffa0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
ffb0: 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
ffc0: 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
ffd0: 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
ffe0: 23 32 35 36 35 2e 0a 20 20 20 20 2a 2f 0a 20 20  #2565..    */.  
fff0: 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26    if( nRec==0 &&
10000 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20   !isHot &&.     
10010 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
10020 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
10030 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
10040 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10050 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   ){.      nRec =
10060 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e   (szJ - pPager->
10070 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f  journalOff) / JO
10080 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
10090 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
100a0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
100b0 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
100c0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
100d0 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
100e0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
100f0 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
10100 69 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69  it's original si
10110 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
10120 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
10130 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
10140 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b  DR_SZ(pPager) ){
10150 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
10160 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
10170 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20  r, mxPg);.      
10180 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10190 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
101a0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
101b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
101c0 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69     /* Copy origi
101d0 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
101e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
101f0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
10200 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
10210 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
10220 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a  ; i<nRec; i++){.
10230 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
10240 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
10250 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
10260 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
10270 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a  journalOff, 1);.
10280 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
10290 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
102a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
102b0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
102c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
102d0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  OK;.          pP
102e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
102f0 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20   = szJ;.        
10300 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
10310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10320 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
10330 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
10340 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10350 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
10360 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  /.  assert( 0 );
10370 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
10380 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
10390 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74  _OK ){.    zMast
103a0 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
103b0 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d  pSpace;.    rc =
103c0 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
103d0 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
103e0 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
103f0 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
10400 65 2b 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e+1);.  }.  if( 
10410 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10420 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
10430 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
10440 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
10450 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10460 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29   && zMaster[0] )
10470 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
10480 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
10490 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
104a0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
104b0 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20  urn success,.   
104c0 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
104d0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
104e0 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
104f0 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
10500 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
10510 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20  lmaster(pPager, 
10520 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20  zMaster);.  }.. 
10530 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65   /* The Pager.se
10540 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
10550 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
10560 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f  updated while ro
10570 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20  lling.  ** back 
10580 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65  a journal create
10590 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77  d by a process w
105a0 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
105b0 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a  sector size.  **
105c0 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
105d0 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
105e0 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
105f0 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rocess..  */.  s
10600 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
10610 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
10620 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  c;.}../*.** Play
10630 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
10640 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
10650 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61  * This is simila
10660 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  r to playing bac
10670 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
10680 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69  n journal but wi
10690 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72  th.** a few extr
106a0 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  a twists..**.** 
106b0 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62     (1)  The numb
106c0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
106d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
106e0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
106f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20  .**         the 
10700 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f  statement is sto
10710 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73  red in pPager->s
10720 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20  tmtSize, not in 
10730 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a  the.**         j
10740 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65  ournal file itse
10750 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  lf..**.**    (2)
10760 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f    In addition to
10770 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
10780 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
10790 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20  nal, also.**    
107a0 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c       playback al
107b0 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 74  l pages of the t
107c0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
107d0 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20  al beginning.** 
107e0 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73 65          at offse
107f0 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  t pPager->stmtJS
10800 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
10810 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c  nt pager_stmt_pl
10820 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
10830 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a  ager){.  i64 szJ
10840 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10850 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
10860 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f   full journal */
10870 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20  .  i64 hdrOff;. 
10880 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
10890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
108a0 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a  ber of Records *
108b0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
108c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
108d0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
108e0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a    int rc;..  szJ
108f0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
10900 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e  alOff;.#ifndef N
10910 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20 20 69  DEBUG .  {.    i
10920 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72  64 os_szJ;.    r
10930 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
10940 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
10950 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20  d, &os_szJ);.   
10960 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10970 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
10980 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a 3d      assert( szJ=
10990 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23  =os_szJ );.  }.#
109a0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20  endif..  /* Set 
109b0 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65  hdrOff to be the
109c0 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61 66 74   offset just aft
109d0 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  er the end of th
109e0 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a 20  e last journal. 
109f0 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74 65 6e   ** page written
10a00 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
10a10 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  t journal-header
10a20 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 6d   for this statem
10a30 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ent.  ** transac
10a40 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74 65 6e  tion was written
10a50 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20  , or the end of 
10a60 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a  the file if no j
10a70 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64  ournal.  ** head
10a80 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a  er was written..
10a90 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20    */.  hdrOff = 
10aa0 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
10ab0 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ff;.  assert( pP
10ac0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c  ager->fullSync |
10ad0 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69  | !hdrOff );.  i
10ae0 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20  f( !hdrOff ){.  
10af0 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a    hdrOff = szJ;.
10b00 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e    }.  .  /* Trun
10b10 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  cate the databas
10b20 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
10b30 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a  iginal size..  *
10b40 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74  /.  rc = pager_t
10b50 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
10b60 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
10b70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
10b80 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
10b90 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f  R_SHARED );..  /
10ba0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
10bb0 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
10bc0 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  e in the stateme
10bd0 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  nt journal..  */
10be0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
10bf0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20  r->stmtInUse && 
10c00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10c10 70 65 6e 20 29 3b 0a 20 20 6e 52 65 63 20 3d 20  pen );.  nRec = 
10c20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
10c30 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f  ;.  .  /* Copy o
10c40 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
10c50 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
10c60 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  nt journal and b
10c70 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ack into the.  *
10c80 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
10c90 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20    Note that the 
10ca0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
10cb0 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d  l omits checksum
10cc0 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68  s from.  ** each
10cd0 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f   record since po
10ce0 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f  wer-failure reco
10cf0 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f  very is not impo
10d00 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65  rtant to stateme
10d10 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73  nt.  ** journals
10d20 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
10d30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a  ; i<nRec; i++){.
10d40 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
10d50 20 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61   i*(4+pPager->pa
10d60 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20  geSize);.    rc 
10d70 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
10d80 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
10d90 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  , pPager->stfd, 
10da0 6f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20  offset, 0);.    
10db0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
10dc0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
10dd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10de0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
10df0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
10e00 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f    /* Now roll so
10e10 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20 66 72  me pages back fr
10e20 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  om the transacti
10e30 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65  on journal. Page
10e40 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a  r.stmtJSize.  **
10e50 20 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66   was the size of
10e60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10e70 65 20 77 68 65 6e 20 74 68 69 73 20 73 74 61 74  e when this stat
10e80 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65  ement was starte
10e90 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79  d, so.  ** every
10ea0 74 68 69 6e 67 20 61 66 74 65 72 20 74 68 61 74  thing after that
10eb0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
10ec0 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72  led back, either
10ed0 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
10ee0 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d  atabase, the mem
10ef0 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f  ory cache, or bo
10f00 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  th..  **.  ** If
10f10 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c   it is not zero,
10f20 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74   then Pager.stmt
10f30 48 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66  HdrOff is the of
10f40 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
10f50 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69  t.  ** of the fi
10f60 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
10f70 65 72 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e  er written durin
10f80 67 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  g this statement
10f90 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
10fa0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  */.  pPager->jou
10fb0 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  rnalOff = pPager
10fc0 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70  ->stmtJSize;.  p
10fd0 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
10fe0 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43   = pPager->stmtC
10ff0 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70  ksum;.  while( p
11000 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11010 66 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a 20 20  f < hdrOff ){.  
11020 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
11030 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
11040 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
11050 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
11060 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20  nalOff, 1);.    
11070 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
11080 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
11090 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
110a0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
110b0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
110c0 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
110d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
110e0 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52  J ){.    u32 nJR
110f0 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ec;         /* N
11100 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c  umber of Journal
11110 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   Records */.    
11120 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
11130 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
11140 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20  dr(pPager, szJ, 
11150 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b  &nJRec, &dummy);
11160 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
11170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11180 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
11190 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
111a0 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
111b0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
111c0 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
111d0 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
111e0 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e   (szJ - pPager->
111f0 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70  journalOff) / (p
11200 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
11210 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  8);.    }.    fo
11220 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d  r(i=nJRec-1; i>=
11230 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0 && pPager->jou
11240 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69  rnalOff < szJ; i
11250 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
11260 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
11270 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
11280 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
11290 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
112a0 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   1);.      asser
112b0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
112c0 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NE );.      if( 
112d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
112e0 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
112f0 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
11300 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
11310 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
11320 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62   .end_stmt_playb
11330 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  ack:.  if( rc==S
11340 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20  QLITE_OK) {.    
11350 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11360 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a  ff = szJ;.    /*
11370 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
11380 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a  che(pPager); */.
11390 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
113a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
113b0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
113c0 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
113d0 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
113e0 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64  allowed..*/.void
113f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11400 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  Cachesize(Pager 
11410 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
11420 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61  age){.  if( mxPa
11430 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61  ge>10 ){.    pPa
11440 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78  ger->mxPage = mx
11450 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Page;.  }else{. 
11460 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67     pPager->mxPag
11470 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e = 10;.  }.}../
11480 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
11490 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68  robustness of th
114a0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
114b0 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
114c0 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77  rashes.** or pow
114d0 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63  er failures by c
114e0 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
114f0 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
11500 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  hen writing.** t
11510 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
11520 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20  nal.  There are 
11530 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a  three levels:.**
11540 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20  .**    OFF      
11550 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
11560 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
11570 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
11580 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
11590 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
115a0 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
115b0 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
115c0 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
115d0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
115e0 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
115f0 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
11600 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
11610 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
11620 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
11630 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
11640 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
11650 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
11660 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
11670 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
11680 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
11690 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
116a0 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
116b0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
116c0 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
116d0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
116e0 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
116f0 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
11700 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
11710 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
11720 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
11730 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
11740 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
11750 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
11760 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
11770 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
11780 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
11790 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
117a0 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
117b0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
117c0 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
117d0 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
117e0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
117f0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
11800 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
11810 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
11820 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11830 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
11840 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
11850 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
11860 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
11870 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
11880 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
11890 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
118a0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
118b0 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
118c0 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
118d0 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
118e0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
118f0 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
11900 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
11910 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
11920 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
11930 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
11940 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
11950 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
11960 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
11970 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
11980 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  3..*/.#ifndef SQ
11990 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
119a0 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c  PRAGMAS.void sql
119b0 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65  ite3PagerSetSafe
119c0 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70  tyLevel(Pager *p
119d0 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c  Pager, int level
119e0 2c 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63  , int full_fsync
119f0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ){.  pPager->noS
11a00 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20  ync =  level==1 
11a10 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
11a20 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ile;.  pPager->f
11a30 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d  ullSync = level=
11a40 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =3 && !pPager->t
11a50 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
11a60 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20  r->sync_flags = 
11a70 28 66 75 6c 6c 5f 66 73 79 6e 63 3f 53 51 4c 49  (full_fsync?SQLI
11a80 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c  TE_SYNC_FULL:SQL
11a90 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
11aa0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
11ab0 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d  noSync ) pPager-
11ac0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d  >needSync = 0;.}
11ad0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
11ae0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
11af0 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
11b00 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
11b10 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79  ever the library
11b20 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
11b30 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
11b40 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66   file.  This inf
11b50 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
11b60 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
11b70 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
11b80 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53  y.  .*/.#ifdef S
11b90 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
11ba0 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
11bb0 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
11bc0 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  f../*.** Open a 
11bd0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
11be0 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
11bf0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
11c00 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75   into *fd.  Retu
11c10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
11c20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a  success or some.
11c30 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  ** other error c
11c40 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20  ode if we fail. 
11c50 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
11c60 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
11c70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 2a   the temporary.*
11c80 2a 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  * file when it i
11c90 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
11ca0 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
11cb0 30 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  0, then an appro
11cc0 70 72 69 61 74 65 20 74 65 6d 70 6f 72 61 72 79  priate temporary
11cd0 20 66 69 6c 65 6e 61 6d 65 20 69 73 0a 2a 2a 20   filename is.** 
11ce0 67 65 6e 65 72 61 74 65 64 20 61 75 74 6f 6d 61  generated automa
11cf0 74 69 63 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  tically..**.** T
11d00 68 65 20 76 66 73 46 6c 61 67 73 20 76 61 6c 75  he vfsFlags valu
11d10 65 20 73 68 6f 75 6c 64 20 62 65 20 53 51 4c 49  e should be SQLI
11d20 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
11d30 41 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 50 45  AL or SQLITE_OPE
11d40 4e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  N.*/.static int 
11d50 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
11d60 74 65 6d 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  temp(.  sqlite3_
11d70 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 2f 2a  vfs *pVfs,    /*
11d80 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c   The virtual fil
11d90 65 20 73 79 73 74 65 6d 20 6c 61 79 65 72 20 2a  e system layer *
11da0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
11db0 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69   *pFile,  /* Wri
11dc0 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
11dd0 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20  riptor here */. 
11de0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
11df0 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ,      /* Name o
11e00 66 20 74 68 65 20 66 69 6c 65 2e 20 20 4d 69 67  f the file.  Mig
11e10 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
11e20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
11e30 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
11e40 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
11e50 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20   the VFS */.){. 
11e60 20 69 6e 74 20 72 63 3b 0a 0a 20 20 63 68 61 72   int rc;..  char
11e70 20 2a 7a 46 72 65 65 20 3d 20 30 3b 0a 20 20 69   *zFree = 0;.  i
11e80 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  f( zFilename==0 
11e90 29 7b 0a 20 20 20 20 7a 46 72 65 65 20 3d 20 28  ){.    zFree = (
11ea0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
11eb0 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 6d 78 50 61  alloc(pVfs->mxPa
11ec0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  thname);.    if(
11ed0 20 21 7a 46 72 65 65 20 29 7b 0a 20 20 20 20 20   !zFree ){.     
11ee0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
11ef0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
11f00 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 46 72 65  zFilename = zFre
11f10 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
11f20 74 65 33 4f 73 47 65 74 54 65 6d 70 4e 61 6d 65  te3OsGetTempName
11f30 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
11f40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
11f50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11f60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
11f70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Free);.      ret
11f80 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
11f90 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
11fa0 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
11fb0 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b  opentemp_count++
11fc0 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74  ;  /* Used for t
11fd0 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
11fe0 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64  sis only */.#end
11ff0 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c  if..  vfsFlags |
12000 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  =  SQLITE_OPEN_R
12010 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
12020 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
12030 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
12040 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
12050 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
12060 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20  DELETEONCLOSE;. 
12070 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
12080 70 65 6e 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  pen(pVfs, zFilen
12090 61 6d 65 2c 20 70 46 69 6c 65 2c 20 76 66 73 46  ame, pFile, vfsF
120a0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65  lags, 0);.  asse
120b0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
120c0 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 4d 65 74  K || pFile->pMet
120d0 68 6f 64 73 20 29 3b 0a 20 20 73 71 6c 69 74 65  hods );.  sqlite
120e0 33 5f 66 72 65 65 28 7a 46 72 65 65 29 3b 0a 20  3_free(zFree);. 
120f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12100 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
12110 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  w page cache and
12120 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
12130 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
12140 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a   in *ppPager..**
12150 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   The file to be 
12160 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20  cached need not 
12170 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65  exist.  The file
12180 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75   is not locked u
12190 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73  ntil.** the firs
121a0 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
121b0 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64 20  3PagerGet() and 
121c0 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65  is only held ope
121d0 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c  n until the.** l
121e0 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
121f0 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ased using sqlit
12200 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a  e3PagerUnref()..
12210 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
12220 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
12230 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
12240 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
12250 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
12260 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
12270 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
12280 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20    The file will 
12290 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75  be deleted.** au
122a0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e  tomatically when
122b0 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
122c0 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
122d0 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
122e0 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  then all informa
122f0 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20  tion is held in 
12300 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20  cache..** It is 
12310 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
12320 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e   disk.  This can
12330 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
12340 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d  ement an.** in-m
12350 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
12360 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
12370 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  gerOpen(.  sqlit
12380 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
12390 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
123a0 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74  al file system t
123b0 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72  o use */.  Pager
123c0 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20   **ppPager,     
123d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
123e0 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
123f0 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
12400 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
12410 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e,   /* Name of 
12420 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
12430 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
12440 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
12450 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
12460 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f   bytes append to
12470 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
12480 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  page */.  int fl
12490 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
124a0 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74     /* flags cont
124b0 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c  rolling this fil
124c0 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
124d0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
124e0 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  /* flags passed 
124f0 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74  through to sqlit
12500 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
12510 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b  /.){.  u8 *pPtr;
12520 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
12530 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
12540 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
12550 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46  t i;.  int tempF
12560 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d  ile = 0;.  int m
12570 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20  emDb = 0;.  int 
12580 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
12590 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
125a0 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
125b0 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
125c0 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f  ;.  int noReadlo
125d0 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  ck = (flags & PA
125e0 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29  GER_NO_READLOCK)
125f0 21 3d 30 3b 0a 20 20 69 6e 74 20 6a 6f 75 72 6e  !=0;.  int journ
12600 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c  alFileSize = sql
12610 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
12620 70 56 66 73 29 3b 0a 20 20 69 6e 74 20 6e 44 65  pVfs);.  int nDe
12630 66 61 75 6c 74 50 61 67 65 20 3d 20 53 51 4c 49  faultPage = SQLI
12640 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
12650 53 49 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a 50  SIZE;.  char *zP
12660 61 74 68 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  athname;.  int n
12670 50 61 74 68 6e 61 6d 65 3b 0a 0a 20 20 2f 2a 20  Pathname;..  /* 
12680 54 68 65 20 64 65 66 61 75 6c 74 20 72 65 74 75  The default retu
12690 72 6e 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  rn is a NULL poi
126a0 6e 74 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67  nter */.  *ppPag
126b0 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  er = 0;..  /* Co
126c0 6d 70 75 74 65 20 74 68 65 20 66 75 6c 6c 20 70  mpute the full p
126d0 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 7a 50 61  athname */.  zPa
126e0 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
126f0 5f 6d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 6d 78  _malloc(pVfs->mx
12700 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69  Pathname+1);.  i
12710 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20  f( zPathname==0 
12720 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
12730 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
12740 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
12750 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
12760 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
12770 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
12780 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
12790 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72  Filename,":memor
127a0 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  y:")==0 ){.     
127b0 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
127c0 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
127d0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   0;.    }else.#e
127e0 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
127f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
12800 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
12810 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  , zFilename, zPa
12820 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  thname);.    }. 
12830 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
12840 20 73 71 6c 69 74 65 33 4f 73 47 65 74 54 65 6d   sqlite3OsGetTem
12850 70 4e 61 6d 65 28 70 56 66 73 2c 20 7a 50 61 74  pName(pVfs, zPat
12860 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66  hname);.  }.  if
12870 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12880 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
12890 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
128a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
128b0 20 7d 0a 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d   }.  nPathname =
128c0 20 73 74 72 6c 65 6e 28 7a 50 61 74 68 6e 61 6d   strlen(zPathnam
128d0 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  e);..  /* Alloca
128e0 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  te memory for th
128f0 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
12900 65 20 2a 2f 0a 20 20 70 50 61 67 65 72 20 3d 20  e */.  pPager = 
12910 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
12920 6f 28 0a 20 20 20 20 73 69 7a 65 6f 66 28 2a 70  o(.    sizeof(*p
12930 50 61 67 65 72 29 20 2b 20 20 20 20 20 20 20 20  Pager) +        
12940 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75     /* Pager stru
12950 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 6a 6f 75  cture */.    jou
12960 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2b 20 20  rnalFileSize +  
12970 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12980 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 72  journal file str
12990 75 63 74 75 72 65 20 2a 2f 20 0a 20 20 20 20 70  ucture */ .    p
129a0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
129b0 32 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  2 +        /* Th
129c0 65 20 64 62 20 61 6e 64 20 73 74 6d 74 20 6a 6f  e db and stmt jo
129d0 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a  urnal files */ .
129e0 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2a 20      nPathname * 
129f0 33 20 2b 20 33 30 20 20 20 20 20 20 20 20 20 20  3 + 30          
12a00 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44  /* zFilename, zD
12a10 69 72 65 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e  irectory, zJourn
12a20 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28  al */.  );.  if(
12a30 20 21 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20   !pPager ){.    
12a40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
12a50 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
12a60 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
12a70 3b 0a 20 20 7d 0a 20 20 70 50 74 72 20 3d 20 28  ;.  }.  pPtr = (
12a80 75 38 20 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b  u8 *)&pPager[1];
12a90 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  .  pPager->vfsFl
12aa0 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a  ags = vfsFlags;.
12ab0 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 28    pPager->fd = (
12ac0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70  sqlite3_file*)&p
12ad0 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69  Ptr[pVfs->szOsFi
12ae0 6c 65 2a 30 5d 3b 0a 20 20 70 50 61 67 65 72 2d  le*0];.  pPager-
12af0 3e 73 74 66 64 20 3d 20 28 73 71 6c 69 74 65 33  >stfd = (sqlite3
12b00 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66  _file*)&pPtr[pVf
12b10 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 31 5d 3b 0a  s->szOsFile*1];.
12b20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20    pPager->jfd = 
12b30 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
12b40 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46  pPtr[pVfs->szOsF
12b50 69 6c 65 2a 32 5d 3b 0a 20 20 70 50 61 67 65 72  ile*2];.  pPager
12b60 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  ->zFilename = (c
12b70 68 61 72 2a 29 26 70 50 74 72 5b 70 56 66 73 2d  har*)&pPtr[pVfs-
12b80 3e 73 7a 4f 73 46 69 6c 65 2a 32 2b 6a 6f 75 72  >szOsFile*2+jour
12b90 6e 61 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20  nalFileSize];.  
12ba0 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
12bb0 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46  ry = &pPager->zF
12bc0 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d  ilename[nPathnam
12bd0 65 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  e+1];.  pPager->
12be0 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67  zJournal = &pPag
12bf0 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e  er->zDirectory[n
12c00 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70  Pathname+1];.  p
12c10 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56  Pager->pVfs = pV
12c20 66 73 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 61  fs;.  memcpy(pPa
12c30 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
12c40 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
12c50 6e 61 6d 65 2b 31 29 3b 0a 20 20 73 71 6c 69 74  name+1);.  sqlit
12c60 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
12c70 65 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  e);..  /* Open t
12c80 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20  he pager file.. 
12c90 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
12ca0 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
12cb0 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b  [0] && !memDb ){
12cc0 0a 20 20 20 20 69 66 28 20 6e 50 61 74 68 6e 61  .    if( nPathna
12cd0 6d 65 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74 68  me>(pVfs->mxPath
12ce0 6e 61 6d 65 20 2d 20 73 69 7a 65 6f 66 28 22 2d  name - sizeof("-
12cf0 6a 6f 75 72 6e 61 6c 22 29 29 20 29 7b 0a 20 20  journal")) ){.  
12d00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12d10 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 65  CANTOPEN;.    }e
12d20 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 66  lse{.      int f
12d30 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  out = 0;.      r
12d40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
12d50 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
12d60 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
12d70 72 2d 3e 66 64 2c 0a 20 20 20 20 20 20 20 20 20  r->fd,.         
12d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d90 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
12da0 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
12db0 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74  readOnly = (fout
12dc0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
12dd0 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 20 20 2f  DONLY);..      /
12de0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
12df0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
12e00 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
12e10 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
12e20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
12e30 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
12e40 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
12e50 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
12e60 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
12e70 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75   file. The defau
12e80 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  lt page size is 
12e90 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a  the maximum of:.
12ea0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
12eb0 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45  *    + SQLITE_DE
12ec0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c  FAULT_PAGE_SIZE,
12ed0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  .      **    + T
12ee0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
12ef0 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  d by sqlite3OsSe
12f00 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 20  ctorSize().     
12f10 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
12f20 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
12f30 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
12f40 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
12f50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
12f60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12f70 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  && !readOnly ){.
12f80 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 63          int iSec
12f90 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  torSize = sqlite
12fa0 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50  3OsSectorSize(pP
12fb0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
12fc0 20 20 20 69 66 28 20 6e 44 65 66 61 75 6c 74 50     if( nDefaultP
12fd0 61 67 65 3c 69 53 65 63 74 6f 72 53 69 7a 65 20  age<iSectorSize 
12fe0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 44 65  ){.          nDe
12ff0 66 61 75 6c 74 50 61 67 65 20 3d 20 69 53 65 63  faultPage = iSec
13000 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  torSize;.       
13010 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
13020 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
13030 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20  RITE.        {. 
13040 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63           int iDc
13050 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
13060 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
13070 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
13080 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b           int ii;
13090 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
130a0 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
130b0 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
130c0 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  8));.          a
130d0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
130e0 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
130f0 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20  5536>>8));.     
13100 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
13110 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
13120 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
13130 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
13140 69 69 3d 6e 44 65 66 61 75 6c 74 50 61 67 65 3b  ii=nDefaultPage;
13150 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
13160 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
13170 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
13180 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
13190 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
131a0 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
131b0 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20   nDefaultPage = 
131c0 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ii;.          }.
131d0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
131e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 44 65  .        if( nDe
131f0 66 61 75 6c 74 50 61 67 65 3e 53 51 4c 49 54 45  faultPage>SQLITE
13200 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
13210 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  E_SIZE ){.      
13220 20 20 20 20 6e 44 65 66 61 75 6c 74 50 61 67 65      nDefaultPage
13230 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45   = SQLITE_MAX_DE
13240 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
13250 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13260 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
13270 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20   if( !memDb ){. 
13280 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f     /* If a tempo
13290 72 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71  rary file is req
132a0 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f  uested, it is no
132b0 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61  t opened immedia
132c0 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  tely..    ** In 
132d0 74 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63  this case we acc
132e0 65 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20  ept the default 
132f0 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65  page size and de
13300 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20  lay actually.   
13310 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20   ** opening the 
13320 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66  file until the f
13330 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57  irst call to OsW
13340 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2f 20 0a  rite()..    */ .
13350 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
13360 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
13370 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
13380 55 53 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66  USIVE;.  }..  if
13390 28 20 70 50 61 67 65 72 20 26 26 20 72 63 3d 3d  ( pPager && rc==
133a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
133b0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
133c0 63 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ce = (char *)sql
133d0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 44 65 66  ite3_malloc(nDef
133e0 61 75 6c 74 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  aultPage);.  }..
133f0 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
13400 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68   occured in eith
13410 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
13420 20 61 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72 65   above..  ** Fre
13430 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  e the Pager stru
13440 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20  cture and close 
13450 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53  the file..  ** S
13460 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69  ince the pager i
13470 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20  s not allocated 
13480 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
13490 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e   to set .  ** an
134a0 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20  y Pager.errMask 
134b0 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  variables..  */.
134c0 20 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c    if( !pPager ||
134d0 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70   !pPager->pTmpSp
134e0 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ace ){.    sqlit
134f0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
13500 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->fd);.    sqlit
13510 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
13520 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63  .    return ((rc
13530 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c  ==SQLITE_OK)?SQL
13540 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20  ITE_NOMEM:rc);. 
13550 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
13560 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  3("OPEN %d %s\n"
13570 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
13580 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
13590 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
135a0 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e    IOTRACE(("OPEN
135b0 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65   %p %s\n", pPage
135c0 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  r, pPager->zFile
135d0 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a 20 46 69 6c  name))..  /* Fil
135e0 6c 20 69 6e 20 50 61 67 65 72 2e 7a 44 69 72 65  l in Pager.zDire
135f0 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d  ctory[] */.  mem
13600 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72  cpy(pPager->zDir
13610 65 63 74 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e  ectory, pPager->
13620 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68  zFilename, nPath
13630 6e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28 69  name+1);.  for(i
13640 3d 73 74 72 6c 65 6e 28 70 50 61 67 65 72 2d 3e  =strlen(pPager->
13650 7a 44 69 72 65 63 74 6f 72 79 29 3b 20 69 3e 30  zDirectory); i>0
13660 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72   && pPager->zDir
13670 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27  ectory[i-1]!='/'
13680 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69  ; i--){}.  if( i
13690 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69  >0 ) pPager->zDi
136a0 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30  rectory[i-1] = 0
136b0 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
136c0 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d  Pager.zJournal[]
136d0 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50 61   */.  memcpy(pPa
136e0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
136f0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
13700 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
13710 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
13720 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
13730 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c  me], "-journal",
13740 20 39 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65   9);..  /* pPage
13750 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
13760 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
13770 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73  >useJournal = us
13780 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d  eJournal && !mem
13790 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  Db;.  pPager->no
137a0 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61  Readlock = noRea
137b0 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c  dlock && readOnl
137c0 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  y;.  /* pPager->
137d0 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
137e0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
137f0 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
13800 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
13810 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  f = 0; */.  pPag
13820 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d  er->dbSize = mem
13830 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Db-1;.  pPager->
13840 70 61 67 65 53 69 7a 65 20 3d 20 6e 44 65 66 61  pageSize = nDefa
13850 75 6c 74 50 61 67 65 3b 0a 20 20 2f 2a 20 70 50  ultPage;.  /* pP
13860 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
13870 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
13880 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
13890 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
138a0 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
138b0 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  .  pPager->mxPag
138c0 65 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65  e = 100;.  pPage
138d0 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49  r->mxPgno = SQLI
138e0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e  TE_MAX_PAGE_COUN
138f0 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  T;.  /* pPager->
13900 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
13910 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72  LOCK; */.  asser
13920 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
13930 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20   == (tempFile ? 
13940 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
13950 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20  : PAGER_UNLOCK) 
13960 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
13970 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
13980 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
13990 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20  le = tempFile;. 
139a0 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c   assert( tempFil
139b0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
139c0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20  MODE_NORMAL .   
139d0 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69         || tempFi
139e0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
139f0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
13a00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
13a10 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
13a20 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20  XCLUSIVE==1 );. 
13a30 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
13a40 76 65 4d 6f 64 65 20 3d 20 74 65 6d 70 46 69 6c  veMode = tempFil
13a50 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  e; .  pPager->me
13a60 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70  mDb = memDb;.  p
13a70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
13a80 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  = readOnly;.  /*
13a90 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
13aa0 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  c = 0; */.  pPag
13ab0 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
13ac0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
13ad0 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20   !useJournal;.  
13ae0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
13af0 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = (pPager->noSy
13b00 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65  nc?0:1);.  pPage
13b10 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20  r->sync_flags = 
13b20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
13b30 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  AL;.  /* pPager-
13b40 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
13b50 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
13b60 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
13b70 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
13b80 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
13b90 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
13ba0 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
13bb0 6e 45 78 74 72 61 29 3b 0a 20 20 61 73 73 65 72  nExtra);.  asser
13bc0 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
13bd0 65 74 68 6f 64 73 7c 7c 6d 65 6d 44 62 7c 7c 74  ethods||memDb||t
13be0 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  empFile);.  if( 
13bf0 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 65  !memDb ){.    se
13c00 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
13c10 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  er);.  }.  /* pP
13c20 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
13c30 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
13c40 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
13c50 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
13c60 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
13c70 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
13c80 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66 20   pPager;.#ifdef 
13c90 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
13ca0 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
13cb0 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65    pPager->iInUse
13cc0 4d 4d 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  MM = 0;.  pPager
13cd0 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 30 3b 0a  ->iInUseDB = 0;.
13ce0 20 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a    if( !memDb ){.
13cf0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
13d00 78 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  x *mutex = sqlit
13d10 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
13d20 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
13d30 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20 73 71  IC_MEM2);.    sq
13d40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
13d50 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 50  r(mutex);.    pP
13d60 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20 73 71  ager->pNext = sq
13d70 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 0a  lite3PagerList;.
13d80 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
13d90 61 67 65 72 4c 69 73 74 20 29 7b 0a 20 20 20 20  agerList ){.    
13da0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13db0 33 50 61 67 65 72 4c 69 73 74 2d 3e 70 50 72 65  3PagerList->pPre
13dc0 76 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  v==0 );.      sq
13dd0 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 2d 3e  lite3PagerList->
13de0 70 50 72 65 76 20 3d 20 70 50 61 67 65 72 3b 0a  pPrev = pPager;.
13df0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
13e00 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
13e10 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
13e20 74 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20  t = pPager;.    
13e30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
13e40 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  ave(mutex);.  }.
13e50 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
13e60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
13e70 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79  .** Set the busy
13e80 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f   handler functio
13e90 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
13ea0 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
13eb0 6e 64 6c 65 72 28 50 61 67 65 72 20 2a 70 50 61  ndler(Pager *pPa
13ec0 67 65 72 2c 20 42 75 73 79 48 61 6e 64 6c 65 72  ger, BusyHandler
13ed0 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 29 7b   *pBusyHandler){
13ee0 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
13ef0 48 61 6e 64 6c 65 72 20 3d 20 70 42 75 73 79 48  Handler = pBusyH
13f00 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  andler;.}../*.**
13f10 20 53 65 74 20 74 68 65 20 64 65 73 74 72 75 63   Set the destruc
13f20 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  tor for this pag
13f30 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  er.  If not NULL
13f40 2c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  , the destructor
13f50 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68   is called.** wh
13f60 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
13f70 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70   count on each p
13f80 61 67 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f  age reaches zero
13f90 2e 20 20 54 68 65 20 64 65 73 74 72 75 63 74 6f  .  The destructo
13fa0 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64  r can.** be used
13fb0 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66   to clean up inf
13fc0 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
13fd0 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70  extra segment ap
13fe0 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70  pended to each p
13ff0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  age..**.** The d
14000 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74  estructor is not
14010 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73   called as a res
14020 75 6c 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  ult sqlite3Pager
14030 43 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65  Close().  .** De
14040 73 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e  structors are on
14050 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c  ly called by sql
14060 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
14070 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14080 33 50 61 67 65 72 53 65 74 44 65 73 74 72 75 63  3PagerSetDestruc
14090 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  tor(Pager *pPage
140a0 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29  r, void (*xDesc)
140b0 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a  (DbPage*,int)){.
140c0 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
140d0 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d  uctor = xDesc;.}
140e0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
140f0 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f  reinitializer fo
14100 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49  r this pager.  I
14110 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
14120 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a  reinitializer.**
14130 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
14140 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
14150 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69   page in cache i
14160 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
14170 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61  s original.** va
14180 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  lue as a result 
14190 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20  of a rollback.  
141a0 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76  The callback giv
141b0 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20  es higher-level 
141c0 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72  code.** an oppor
141d0 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72  tunity to restor
141e0 65 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74  e the EXTRA sect
141f0 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74  ion to agree wit
14200 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a  h the restored.*
14210 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  * page data..*/.
14220 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
14230 72 53 65 74 52 65 69 6e 69 74 65 72 28 50 61 67  rSetReiniter(Pag
14240 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
14250 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61   (*xReinit)(DbPa
14260 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61  ge*,int)){.  pPa
14270 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d  ger->xReiniter =
14280 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a   xReinit;.}../*.
14290 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67 65 20  ** Set the page 
142a0 73 69 7a 65 20 74 6f 20 2a 70 50 61 67 65 53 69  size to *pPageSi
142b0 7a 65 2e 20 49 66 20 74 68 65 20 73 75 67 67 65  ze. If the sugge
142c0 73 74 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  st new page size
142d0 20 69 73 0a 2a 2a 20 69 6e 61 70 70 72 6f 70 72   is.** inappropr
142e0 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c  iate, then an al
142f0 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73  ternative page s
14300 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
14310 61 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65 66 6f  at.** value befo
14320 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
14330 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
14340 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67  rSetPagesize(Pag
14350 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20  er *pPager, u16 
14360 2a 70 50 61 67 65 53 69 7a 65 29 7b 0a 20 20 69  *pPageSize){.  i
14370 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14380 4b 3b 0a 20 20 75 31 36 20 70 61 67 65 53 69 7a  K;.  u16 pageSiz
14390 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
143a0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
143b0 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
143c0 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
143d0 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
143e0 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
143f0 69 66 28 20 70 61 67 65 53 69 7a 65 20 26 26 20  if( pageSize && 
14400 70 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72  pageSize!=pPager
14410 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20 26  ->pageSize .   &
14420 26 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  & !pPager->memDb
14430 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   && pPager->nRef
14440 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20 63 68  ==0 .  ){.    ch
14450 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72  ar *pNew = (char
14460 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
14470 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  c(pageSize);.   
14480 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20   if( !pNew ){.  
14490 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
144a0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
144b0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 45 6e 74  {.      pagerEnt
144c0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  er(pPager);.    
144d0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
144e0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61  ager);.      pPa
144f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
14500 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
14510 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
14520 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
14530 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
14540 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
14550 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
14560 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Space = pNew;.  
14570 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
14580 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
14590 7d 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d  }.  *pPageSize =
145a0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
145b0 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
145c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
145d0 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69   to set the maxi
145e0 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67  mum database pag
145f0 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67  e count if mxPag
14600 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a  e is positive. .
14610 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
14620 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  es if mxPage is 
14630 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
14640 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64  .  And never red
14650 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  uce the.** maxim
14660 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65  um page count be
14670 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  low the current 
14680 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
14690 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61  base..**.** Rega
146a0 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65  rdless of mxPage
146b0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  , return the cur
146c0 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67  rent maximum pag
146d0 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
146e0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
146f0 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a  ageCount(Pager *
14700 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
14710 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
14720 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  e>0 ){.    pPage
14730 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61  r->mxPgno = mxPa
14740 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ge;.  }.  sqlite
14750 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
14760 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
14770 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  n pPager->mxPgno
14780 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
14790 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20  ollowing set of 
147a0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
147b0 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
147c0 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f   simulated.** I/
147d0 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73  O error mechanis
147e0 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  m.  These routin
147f0 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  es are used to a
14800 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a  void simulated.*
14810 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63  * errors in plac
14820 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  es where we do n
14830 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72  ot care about er
14840 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  rors..**.** Unle
14850 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54  ss -DSQLITE_TEST
14860 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73  =1 is used, thes
14870 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61  e routines are a
14880 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64  ll no-ops.** and
14890 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64   generate no cod
148a0 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
148b0 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20  ITE_TEST.extern 
148c0 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
148d0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78  rror_pending;.ex
148e0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
148f0 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73  _io_error_hit;.s
14900 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f  tatic int saved_
14910 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c  cnt;.void disabl
14920 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
14930 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
14940 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74  aved_cnt = sqlit
14950 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
14960 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ing;.  sqlite3_i
14970 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
14980 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61  = -1;.}.void ena
14990 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
149a0 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
149b0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
149c0 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65  r_pending = save
149d0 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23  d_cnt;.}.#else.#
149e0 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f   define disable_
149f0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
14a00 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65  ors().# define e
14a10 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
14a20 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64  io_errors().#end
14a30 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  if../*.** Read t
14a40 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73  he first N bytes
14a50 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
14a60 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ing of the file 
14a70 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74  into memory.** t
14a80 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73  hat pDest points
14a90 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65   to. .**.** No e
14aa0 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73  rror checking is
14ab0 20 64 6f 6e 65 2e 20 54 68 65 20 72 61 74 69 6f   done. The ratio
14ac0 6e 61 6c 20 66 6f 72 20 74 68 69 73 20 69 73 20  nal for this is 
14ad0 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69  that this functi
14ae0 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61  on .** may be ca
14af0 6c 6c 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  lled even if the
14b00 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
14b10 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20  xist or contain 
14b20 61 20 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a  a header. In .**
14b30 20 74 68 65 73 65 20 63 61 73 65 73 20 73 71 6c   these cases sql
14b40 69 74 65 33 4f 73 52 65 61 64 28 29 20 77 69 6c  ite3OsRead() wil
14b50 6c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  l return an erro
14b60 72 2c 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  r, to which the 
14b70 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65 73 70  correct .** resp
14b80 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65 72 6f 20  onse is to zero 
14b90 74 68 65 20 6d 65 6d 6f 72 79 20 61 74 20 70 44  the memory at pD
14ba0 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65  est and continue
14bb0 2e 20 20 41 20 72 65 61 6c 20 49 4f 20 65 72 72  .  A real IO err
14bc0 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73  or .** will pres
14bd0 75 6d 61 62 6c 79 20 72 65 63 75 72 20 61 6e 64  umably recur and
14be0 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 6c 61   be picked up la
14bf0 74 65 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b  ter (Todo: Think
14c00 20 61 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f   about this)..*/
14c10 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
14c20 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
14c30 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
14c40 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
14c50 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
14c60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14c70 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
14c80 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
14c90 72 74 28 4d 45 4d 44 42 7c 7c 70 50 61 67 65 72  rt(MEMDB||pPager
14ca0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
14cb0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
14cc0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
14cd0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
14ce0 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
14cf0 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c  BHDR %p 0 %d\n",
14d00 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20   pPager, N)).   
14d10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
14d20 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
14d30 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20  pDest, N, 0);.  
14d40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14d50 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
14d60 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
14d70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
14d80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
14d90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
14da0 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
14db0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
14dc0 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73  he disk file ass
14dd0 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
14de0 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49  pPager. .**.** I
14df0 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59  f the PENDING_BY
14e00 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70  TE lies on the p
14e10 61 67 65 20 64 69 72 65 63 74 6c 79 20 61 66 74  age directly aft
14e20 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  er the end of th
14e30 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  e.** file, then 
14e40 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70 61  consider this pa
14e50 67 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  ge part of the f
14e60 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61  ile too. For exa
14e70 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44  mple, if.** PEND
14e80 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74 65  ING_BYTE is byte
14e90 20 34 30 39 36 20 28 74 68 65 20 66 69 72 73 74   4096 (the first
14ea0 20 62 79 74 65 20 6f 66 20 70 61 67 65 20 35 29   byte of page 5)
14eb0 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
14ec0 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20   the.** file is 
14ed0 34 30 39 36 20 62 79 74 65 73 2c 20 35 20 69 73  4096 bytes, 5 is
14ee0 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
14ef0 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73  d of 4..*/.int s
14f00 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
14f10 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
14f20 65 72 29 7b 0a 20 20 69 36 34 20 6e 20 3d 20 30  er){.  i64 n = 0
14f30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
14f40 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
14f50 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
14f60 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
14f70 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
14f80 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
14f90 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d  ze>=0 ){.    n =
14fa0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
14fb0 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
14fc0 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66  assert(pPager->f
14fd0 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61  d->pMethods||pPa
14fe0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
14ff0 20 20 20 20 69 66 28 20 28 70 50 61 67 65 72 2d      if( (pPager-
15000 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 20  >fd->pMethods). 
15010 20 20 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c      && (rc = sql
15020 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
15030 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21  Pager->fd, &n))!
15040 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15050 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
15060 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
15070 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
15080 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26   }.    if( n>0 &
15090 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65  & n<pPager->page
150a0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20  Size ){.      n 
150b0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
150c0 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65        n /= pPage
150d0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
150e0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
150f0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
15100 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
15110 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
15120 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   n;.    }.  }.  
15130 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f  if( n==(PENDING_
15140 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67  BYTE/pPager->pag
15150 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b  eSize) ){.    n+
15160 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 70  +;.  }.  if( n>p
15170 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
15180 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
15190 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72  gno = n;.  }.  r
151a0 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66  eturn n;.}...#if
151b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
151c0 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20  _MEMORYDB./*.** 
151d0 43 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f 72  Clear a PgHistor
151e0 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69  y block.*/.stati
151f0 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74  c void clearHist
15200 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70  ory(PgHistory *p
15210 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  Hist){.  sqlite3
15220 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72  _free(pHist->pOr
15230 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ig);.  sqlite3_f
15240 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
15250 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69  );.  pHist->pOri
15260 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e  g = 0;.  pHist->
15270 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c  pStmt = 0;.}.#el
15280 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72  se.#define clear
15290 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69  History(x).#endi
152a0 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  f../*.** Forward
152b0 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
152c0 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
152d0 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a  ournal(Pager*);.
152e0 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50  ./*.** Unlink pP
152f0 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  g from it's hash
15300 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74   chain. Also set
15310 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
15320 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74   to 0 to indicat
15330 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  e.** that the pa
15340 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ge is not part o
15350 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e  f any hash chain
15360 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
15370 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  ed because the.*
15380 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  * sqlite3PagerMo
15390 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65  vepage() routine
153a0 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67   can leave a pag
153b0 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65  e in the .** pNe
153c0 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65 65  xtFree/pPrevFree
153d0 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f   list that is no
153e0 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20  t a part of any 
153f0 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73  hash-chain..*/.s
15400 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e  tatic void unlin
15410 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65 72  kHashChain(Pager
15420 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
15430 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
15440 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ->pgno==0 ){.   
15450 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
15460 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50  extHash==0 && pP
15470 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  g->pPrevHash==0 
15480 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
15490 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
154a0 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70  extHash ){.    p
154b0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
154c0 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e  PrevHash = pPg->
154d0 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20  pPrevHash;.  }. 
154e0 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48   if( pPg->pPrevH
154f0 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ash ){.    asser
15500 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
15510 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50  [pPg->pgno & (pP
15520 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21  ager->nHash-1)]!
15530 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
15540 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78  >pPrevHash->pNex
15550 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65  tHash = pPg->pNe
15560 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b  xtHash;.  }else{
15570 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67  .    int h = pPg
15580 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  ->pgno & (pPager
15590 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20  ->nHash-1);.    
155a0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
155b0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
155c0 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d  h;.  }.  if( MEM
155d0 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48  DB ){.    clearH
155e0 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f  istory(PGHDR_TO_
155f0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
15600 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  ));.  }.  pPg->p
15610 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e  gno = 0;.  pPg->
15620 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
15630 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
15640 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
15650 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
15660 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c  free list (the l
15670 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
15680 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a   where nRef==0).
15690 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20  ** and from its 
156a0 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63  hash collision c
156b0 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hain..*/.static 
156c0 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28  void unlinkPage(
156d0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
156e0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
156f0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  Pg->pPager;..  /
15700 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 66 72  * Unlink from fr
15710 65 65 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a  ee page list */.
15720 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28    lruListRemove(
15730 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69  pPg);..  /* Unli
15740 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f  nk from the pgno
15750 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
15760 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
15770 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d  (pPager, pPg);.}
15780 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15790 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
157a0 74 72 75 6e 63 61 74 65 20 74 68 65 20 63 61 63  truncate the cac
157b0 68 65 20 77 68 65 6e 20 61 20 64 61 74 61 62 61  he when a databa
157c0 73 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61 74  se.** is truncat
157d0 65 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20 74  ed.  Drop from t
157e0 68 65 20 63 61 63 68 65 20 61 6c 6c 20 70 61 67  he cache all pag
157f0 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73  es whose pgno is
15800 0a 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20  .** larger than 
15810 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
15820 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63  nd is unreferenc
15830 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65  ed..**.** Refere
15840 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65  nced pages large
15850 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
15860 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64  bSize are zeroed
15870 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79  ..**.** Actually
15880 2c 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 74  , at the point t
15890 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
158a0 61 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64 20  alled, it would 
158b0 62 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74  be.** an error t
158c0 6f 20 68 61 76 65 20 61 20 72 65 66 65 72 65 6e  o have a referen
158d0 63 65 64 20 70 61 67 65 2e 20 20 42 75 74 20 72  ced page.  But r
158e0 61 74 68 65 72 20 74 68 61 6e 20 64 65 6c 65 74  ather than delet
158f0 65 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 61  e.** that page a
15900 6e 64 20 67 75 61 72 61 6e 74 65 65 20 61 20 73  nd guarantee a s
15910 75 62 73 65 71 75 65 6e 74 20 73 65 67 66 61 75  ubsequent segfau
15920 6c 74 2c 20 69 74 20 73 65 65 6d 73 20 62 65 74  lt, it seems bet
15930 74 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69  ter.** to zero i
15940 74 20 61 6e 64 20 68 6f 70 65 20 74 68 61 74 20  t and hope that 
15950 77 65 20 65 72 72 6f 72 20 6f 75 74 20 73 61 6e  we error out san
15960 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ely..*/.static v
15970 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61  oid pager_trunca
15980 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a  te_cache(Pager *
15990 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
159a0 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a   *pPg;.  PgHdr *
159b0 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53  *ppPg;.  int dbS
159c0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
159d0 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20  Size;..  ppPg = 
159e0 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20  &pPager->pAll;. 
159f0 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a   while( (pPg = *
15a00 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20  ppPg)!=0 ){.    
15a10 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64  if( pPg->pgno<=d
15a20 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  bSize ){.      p
15a30 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
15a40 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  tAll;.    }else 
15a50 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  if( pPg->nRef>0 
15a60 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
15a70 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
15a80 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
15a90 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
15aa0 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65  ppPg = &pPg->pNe
15ab0 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  xtAll;.    }else
15ac0 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20  {.      *ppPg = 
15ad0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
15ae0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
15af0 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20  GFREE %p %d\n", 
15b00 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
15b10 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  o));.      PAGER
15b20 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
15b30 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74  ger_pgfree_count
15b40 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50  );.      unlinkP
15b50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
15b60 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
15b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
15b80 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70  ee(pPg);.      p
15b90 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a  Pager->nPage--;.
15ba0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
15bb0 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** Try to obtain
15bc0 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c   a lock on a fil
15bd0 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  e.  Invoke the b
15be0 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
15bf0 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63  the lock.** is c
15c00 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61  urrently not ava
15c10 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20  ilable.  Repeat 
15c20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
15c30 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a  allback returns.
15c40 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69  ** false or unti
15c50 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65  l the lock succe
15c60 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eds..**.** Retur
15c70 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
15c80 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72  uccess and an er
15c90 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63  ror code if we c
15ca0 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20  annot obtain.** 
15cb0 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  the lock..*/.sta
15cc0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61  tic int pager_wa
15cd0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72  it_on_lock(Pager
15ce0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f   *pPager, int lo
15cf0 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
15d00 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20  c;..  /* The OS 
15d10 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74  lock values must
15d20 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
15d30 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76  the Pager lock v
15d40 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  alues */.  asser
15d50 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d  t( PAGER_SHARED=
15d60 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
15d70 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
15d80 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56  RESERVED==RESERV
15d90 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
15da0 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55  ert( PAGER_EXCLU
15db0 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f  SIVE==EXCLUSIVE_
15dc0 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  LOCK );..  /* If
15dd0 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72   the file is cur
15de0 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20  rently unlocked 
15df0 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75  then the size mu
15e00 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f  st be unknown */
15e10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
15e20 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
15e30 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72  SHARED || pPager
15e40 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45  ->dbSize<0 || ME
15e50 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  MDB );..  if( pP
15e60 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63  ager->state>=loc
15e70 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20  ktype ){.    rc 
15e80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
15e90 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  else{.    do {. 
15ea0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15eb0 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
15ec0 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  fd, locktype);. 
15ed0 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
15ee0 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73 71  QLITE_BUSY && sq
15ef0 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
15f00 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
15f10 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a  BusyHandler) );.
15f20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15f30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
15f40 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c  Pager->state = l
15f50 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49  ocktype;.      I
15f60 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70  OTRACE(("LOCK %p
15f70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
15f80 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d  locktype)).    }
15f90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
15fa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
15fb0 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  ate the file to 
15fc0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
15fd0 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  ges specified..*
15fe0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
15ff0 65 72 54 72 75 6e 63 61 74 65 28 50 61 67 65 72  erTruncate(Pager
16000 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
16010 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Page){.  int rc;
16020 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
16030 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
16040 53 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20  SHARED || MEMDB 
16050 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
16060 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
16070 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
16080 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
16090 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
160a0 72 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72  rCode;.    retur
160b0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
160c0 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64  nPage>=(unsigned
160d0 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
160e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
160f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
16100 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
16110 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
16120 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65   nPage;.    page
16130 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
16140 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
16150 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16160 20 20 7d 0a 20 20 70 61 67 65 72 45 6e 74 65 72    }.  pagerEnter
16170 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d  (pPager);.  rc =
16180 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
16190 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  ger);.  pagerLea
161a0 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ve(pPager);.  if
161b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
161c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
161d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20  ;.  }..  /* Get 
161e0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
161f0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
16200 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74  e before truncat
16210 69 6e 67 2e 20 2a 2f 0a 20 20 70 61 67 65 72 45  ing. */.  pagerE
16220 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
16230 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
16240 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
16250 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
16260 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
16270 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
16280 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16290 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
162a0 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74  ..  rc = pager_t
162b0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
162c0 6e 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  nPage);.  return
162d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68   rc;.}../*.** Sh
162e0 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
162f0 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
16300 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
16310 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
16320 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
16330 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
16340 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
16350 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
16360 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
16370 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
16380 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
16390 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
163a0 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
163b0 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
163c0 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
163d0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
163e0 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
163f0 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
16400 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
16410 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
16420 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
16430 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
16440 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
16450 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
16460 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
16470 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
16480 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
16490 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
164a0 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
164b0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
164c0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
164d0 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
164e0 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
164f0 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
16500 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
16510 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
16520 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
16530 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16540 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
16550 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65   *pPager){.#ifde
16560 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
16570 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
16580 54 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29  T.  if( !MEMDB )
16590 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  {.    sqlite3_mu
165a0 74 65 78 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c  tex *mutex = sql
165b0 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
165c0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
165d0 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20  ATIC_MEM2);.    
165e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
165f0 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20  ter(mutex);.    
16600 69 66 28 20 70 50 61 67 65 72 2d 3e 70 50 72 65  if( pPager->pPre
16610 76 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  v ){.      pPage
16620 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  r->pPrev->pNext 
16630 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b  = pPager->pNext;
16640 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16650 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69    sqlite3PagerLi
16660 73 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65  st = pPager->pNe
16670 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  xt;.    }.    if
16680 28 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20  ( pPager->pNext 
16690 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
166a0 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
166b0 70 50 61 67 65 72 2d 3e 70 50 72 65 76 3b 0a 20  pPager->pPrev;. 
166c0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
166d0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
166e0 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ex);.  }.#endif.
166f0 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
16700 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
16710 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43  ;.  pPager->errC
16720 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ode = 0;.  pPage
16730 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
16740 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65   = 0;.  pager_re
16750 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70  set(pPager);.  p
16760 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
16770 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
16780 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
16790 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
167a0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4c   PAGERTRACE2("CL
167b0 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  OSE %d\n", PAGER
167c0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49  ID(pPager));.  I
167d0 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  OTRACE(("CLOSE %
167e0 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
167f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16800 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61  >errCode || (pPa
16810 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
16820 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ==0 && pPager->s
16830 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20  tmtOpen==0) );. 
16840 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
16850 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
16860 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
16870 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d  Pager->jfd);.  }
16880 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
16890 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
168a0 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  al);.  if( pPage
168b0 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20  r->stmtOpen ){. 
168c0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
168d0 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b  e(pPager->stfd);
168e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
168f0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
16900 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c  );.  /* Temp fil
16910 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
16920 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20  ally deleted by 
16930 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20  the OS.  ** if( 
16940 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
16950 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74   ){.  **   sqlit
16960 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
16970 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
16980 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71   ** }.  */..  sq
16990 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
169a0 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c  r->aHash);.  sql
169b0 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
169c0 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
169d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
169e0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
169f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
16a00 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
16a10 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
16a20 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
16a30 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
16a40 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67  number for the g
16a50 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a  iven page data..
16a60 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
16a70 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
16a80 62 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74  bPage *p){.  ret
16a90 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23  urn p->pgno;.}.#
16aa0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
16ab0 20 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63   page_ref() func
16ac0 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20  tion increments 
16ad0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
16ae0 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a  unt for a page..
16af0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 69  ** If the page i
16b00 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74  s currently on t
16b10 68 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65  he freelist (the
16b20 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
16b30 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a   is zero) then.*
16b40 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  * remove it from
16b50 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
16b60 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73  *.** For non-tes
16b70 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f  t systems, page_
16b80 72 65 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f  ref() is a macro
16b90 20 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67   that calls _pag
16ba0 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e  e_ref().** onlin
16bb0 65 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e  e of the referen
16bc0 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f  ce count is zero
16bd0 2e 20 20 46 6f 72 20 74 65 73 74 20 73 79 73 74  .  For test syst
16be0 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a  ems, page_ref().
16bf0 2a 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e  ** is a real fun
16c00 63 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65  ction so that we
16c10 20 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f   can set breakpo
16c20 69 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20 69  ints and trace i
16c30 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
16c40 64 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64  d _page_ref(PgHd
16c50 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  r *pPg){.  if( p
16c60 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
16c70 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69     /* The page i
16c80 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74  s currently on t
16c90 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
16ca0 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20  move it. */.    
16cb0 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70 50  lruListRemove(pP
16cc0 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61  g);.    pPg->pPa
16cd0 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ger->nRef++;.  }
16ce0 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a  .  pPg->nRef++;.
16cf0 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
16d00 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
16d10 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
16d20 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48  oid page_ref(PgH
16d30 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66  dr *pPg){.    if
16d40 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
16d50 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65  {.      _page_re
16d60 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  f(pPg);.    }els
16d70 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52  e{.      pPg->nR
16d80 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49  ef++;.      REFI
16d90 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  NFO(pPg);.    }.
16da0 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69    }.#else.# defi
16db0 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20  ne page_ref(P)  
16dc0 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f   ((P)->nRef==0?_
16dd0 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69  page_ref(P):(voi
16de0 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23  d)(P)->nRef++).#
16df0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
16e00 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
16e10 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
16e20 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75   page.  The inpu
16e30 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20  t pointer is.** 
16e40 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
16e50 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  he page data..*/
16e60 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
16e70 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
16e80 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  ){.  pagerEnter(
16e90 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pPg->pPager);.  
16ea0 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
16eb0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 67 2d   pagerLeave(pPg-
16ec0 3e 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  >pPager);.  retu
16ed0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
16ee0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
16ef0 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68  journal.  In oth
16f00 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
16f10 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
16f20 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
16f30 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
16f40 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
16f50 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
16f60 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
16f70 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74  the.** disk.  It
16f80 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
16f90 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69  modify the origi
16fa0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
16fb0 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a  e until after.**
16fc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
16fd0 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49   been synced.  I
16fe0 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
16ff0 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66  atabase is modif
17000 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ied before.** th
17010 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
17020 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20  ced and a power 
17030 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20  failure occurs, 
17040 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75  the unsynced jou
17050 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75  rnal.** data wou
17060 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77  ld be lost and w
17070 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c  e would be unabl
17080 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e to completely 
17090 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20  rollback the.** 
170a0 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
170b0 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
170c0 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63  uption would occ
170d0 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  ur..** .** This 
170e0 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64  routine also upd
170f0 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66 69  ates the nRec fi
17100 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  eld in the heade
17110 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
17120 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e  ..** (See commen
17130 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f  ts on the pager_
17140 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
17150 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
17160 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a  l information.).
17170 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d  ** If the sync m
17180 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f  ode is FULL, two
17190 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75   syncs will occu
171a0 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77 68  r.  First the wh
171b0 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69  ole journal.** i
171c0 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74  s synced, then t
171d0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73  he nRec field is
171e0 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61   updated, then a
171f0 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63   second sync occ
17200 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  urs..**.** For t
17210 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
17220 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  es, we do not ca
17230 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c  re if we are abl
17240 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  e to rollback.**
17250 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20 66   after a power f
17260 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f 20 73 79  ailure, so no sy
17270 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
17280 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
17290 51 55 45 4e 54 49 41 4c 20 66 6c 61 67 20 69 73  QUENTIAL flag is
172a0 20 73 65 74 20 66 6f 72 20 74 68 65 20 70 65 72   set for the per
172b0 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 6f 6e  sistent media on
172c0 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 64 61   which.** the da
172d0 74 61 62 61 73 65 20 69 73 20 73 74 6f 72 65 64  tabase is stored
172e0 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63 28 29 20  , then OsSync() 
172f0 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
17300 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  on the journal.*
17310 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20  * file. In this 
17320 63 61 73 65 20 61 6c 6c 20 74 68 61 74 20 69 73  case all that is
17330 20 72 65 71 75 69 72 65 64 20 69 73 20 74 6f 20   required is to 
17340 75 70 64 61 74 65 20 74 68 65 20 6e 52 65 63 20  update the nRec 
17350 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74 68 65 20  field in.** the 
17360 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
17370 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
17380 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65  ne clears the ne
17390 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20  edSync field of 
173a0 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65  every page curre
173b0 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65  nt held in.** me
173c0 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
173d0 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
173e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
173f0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
17400 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17410 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 53 79 6e 63 20  OK;...  /* Sync 
17420 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  the journal befo
17430 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  re modifying the
17440 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20   main database. 
17450 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68   ** (assuming th
17460 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c  ere is a journal
17470 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f   and it needs to
17480 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a   be synced.).  *
17490 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
174a0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
174b0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
174c0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  pFile ){.      i
174d0 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
174e0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
174f0 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
17500 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fd);.      asser
17510 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
17520 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 20  alOpen );..     
17530 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50 61   /* assert( !pPa
17540 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f  ger->noSync ); /
17550 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20 62  / noSync might b
17560 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72 6f  e set if synchro
17570 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77 61  nous.      ** wa
17580 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66 74  s turned off aft
17590 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
175a0 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e 20  on was started. 
175b0 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a   Ticket #615 */.
175c0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
175d0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
175e0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
175f0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75  pPager->nRec cou
17600 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65 70  nter we are keep
17610 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20 20  ing agrees.     
17620 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 6e     ** with the n
17630 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
17640 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
17650 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
17660 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
17670 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20     i64 jSz;.    
17680 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17690 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
176a0 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20  r->jfd, &jSz);. 
176b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
176c0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
176d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
176e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
176f0 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d  ==jSz );.      }
17700 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
17710 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
17720 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
17730 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ND) ){.        /
17740 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
17750 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
17760 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
17770 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
17780 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
17790 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
177a0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
177b0 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
177c0 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
177d0 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
177e0 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
177f0 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
17800 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
17810 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
17820 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
17830 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  or rollback..   
17840 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
17850 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  ** This is not r
17860 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70  equired if the p
17870 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20  ersistent media 
17880 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20  supports the.   
17890 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50       ** SAFE_APP
178a0 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65  END property. Be
178b0 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61  cause in this ca
178c0 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
178d0 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a  sible .        *
178e0 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61  * for garbage da
178f0 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  ta to be appende
17900 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74  d to the file, t
17910 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20  he nRec field.  
17920 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75        ** is popu
17930 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46  lated with 0xFFF
17940 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a  FFFFF when the j
17950 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
17960 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20   written.       
17970 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65   ** and never ne
17980 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
17990 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
179a0 20 20 20 20 20 20 69 36 34 20 6a 72 6e 6c 4f 66        i64 jrnlOf
179b0 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  f;.        if( p
179c0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
179d0 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
179e0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
179f0 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AL) ){.         
17a00 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59   PAGERTRACE2("SY
17a10 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
17a20 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
17a30 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ger));.         
17a40 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
17a50 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
17a60 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
17a70 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
17a80 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
17a90 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
17aa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
17ab0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
17ac0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
17ad0 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50      jrnlOff = pP
17ae0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
17af0 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
17b00 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20 20  alMagic);.      
17b10 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
17b20 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
17b30 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66 66 2c  pPager, jrnlOff,
17b40 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63   4));.        rc
17b50 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
17b60 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
17b70 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  Off, pPager->nRe
17b80 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
17b90 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
17ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
17bb0 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
17bc0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
17bd0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41  L) ){.        PA
17be0 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43 20  GERTRACE2("SYNC 
17bf0 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
17c00 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
17c10 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52  ));.        IOTR
17c20 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
17c30 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
17c40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17c50 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
17c60 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
17c70 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20  _flags| .       
17c80 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63     (pPager->sync
17c90 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53  _flags==SQLITE_S
17ca0 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f  YNC_FULL?SQLITE_
17cb0 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29  SYNC_DATAONLY:0)
17cc0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
17cd0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
17ce0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
17cf0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
17d00 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
17d10 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
17d20 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
17d30 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61  = 0;..    /* Era
17d40 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  se the needSync 
17d50 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20  flag from every 
17d60 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
17d70 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
17d80 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
17d90 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
17da0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
17db0 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
17dc0 20 20 20 6c 72 75 4c 69 73 74 53 65 74 46 69 72     lruListSetFir
17dd0 73 74 53 79 6e 63 65 64 28 70 50 61 67 65 72 29  stSynced(pPager)
17de0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  ;.  }..#ifndef N
17df0 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68  DEBUG.  /* If th
17e00 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
17e10 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74   flag is clear t
17e20 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65  hen the PgHdr.ne
17e30 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67  edSync.  ** flag
17e40 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c   must also be cl
17e50 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65  ear for all page
17e60 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  s.  Verify that 
17e70 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69  this.  ** invari
17e80 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a  ant is true..  *
17e90 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f  /.  else{.    fo
17ea0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
17eb0 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
17ec0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
17ed0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
17ee0 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
17ef0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
17f00 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69   pPager->lru.pFi
17f10 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65  rstSynced==pPage
17f20 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 20 29 3b  r->lru.pFirst );
17f30 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
17f40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17f50 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69 73  ** Merge two lis
17f60 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e  ts of pages conn
17f70 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20  ected by pDirty 
17f80 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65  and in pgno orde
17f90 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74  r..** Do not bot
17fa0 68 20 66 69 78 69 6e 67 20 74 68 65 20 70 50 72  h fixing the pPr
17fb0 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73  evDirty pointers
17fc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
17fd0 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69 73  r *merge_pagelis
17fe0 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67 48  t(PgHdr *pA, PgH
17ff0 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64 72  dr *pB){.  PgHdr
18000 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b   result, *pTail;
18010 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73 75  .  pTail = &resu
18020 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20  lt;.  while( pA 
18030 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28  && pB ){.    if(
18040 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67   pA->pgno<pB->pg
18050 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61 69  no ){.      pTai
18060 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a  l->pDirty = pA;.
18070 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 41        pTail = pA
18080 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d  ;.      pA = pA-
18090 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c  >pDirty;.    }el
180a0 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d  se{.      pTail-
180b0 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20  >pDirty = pB;.  
180c0 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a      pTail = pB;.
180d0 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 70        pB = pB->p
180e0 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  Dirty;.    }.  }
180f0 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20  .  if( pA ){.   
18100 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
18110 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   pA;.  }else if(
18120 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69 6c   pB ){.    pTail
18130 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20  ->pDirty = pB;. 
18140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 69   }else{.    pTai
18150 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  l->pDirty = 0;. 
18160 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75   }.  return resu
18170 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  lt.pDirty;.}../*
18180 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69 73  .** Sort the lis
18190 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 63  t of pages in ac
181a0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
181b0 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61 72   pgno.  Pages ar
181c0 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62  e.** connected b
181d0 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  y pDirty pointer
181e0 73 2e 20 20 54 68 65 20 70 50 72 65 76 44 69 72  s.  The pPrevDir
181f0 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a  ty pointers are.
18200 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79 20  ** corrupted by 
18210 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64  this sort..*/.#d
18220 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
18230 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23 64 65  KET_ALLOC 25.#de
18240 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b  fine N_SORT_BUCK
18250 45 54 20 20 20 20 20 20 20 32 35 0a 23 69 66 64  ET       25.#ifd
18260 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
18270 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67   int sqlite3_pag
18280 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74  er_n_sort_bucket
18290 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66 20 4e   = 0;.  #undef N
182a0 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20 20 23  _SORT_BUCKET.  #
182b0 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55  define N_SORT_BU
182c0 43 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c 69 74  CKET \.   (sqlit
182d0 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
182e0 62 75 63 6b 65 74 3f 73 71 6c 69 74 65 33 5f 70  bucket?sqlite3_p
182f0 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b  ager_n_sort_buck
18300 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  et:N_SORT_BUCKET
18310 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66 0a 73  _ALLOC).#endif.s
18320 74 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f 72  tatic PgHdr *sor
18330 74 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  t_pagelist(PgHdr
18340 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72 20   *pIn){.  PgHdr 
18350 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  *a[N_SORT_BUCKET
18360 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20 69  _ALLOC], *p;.  i
18370 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28 61  nt i;.  memset(a
18380 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29 3b  , 0, sizeof(a));
18390 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20 29 7b  .  while( pIn ){
183a0 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20 20  .    p = pIn;.  
183b0 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72 74    pIn = p->pDirt
183c0 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79  y;.    p->pDirty
183d0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
183e0 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b  0; i<N_SORT_BUCK
183f0 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ET-1; i++){.    
18400 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29 7b    if( a[i]==0 ){
18410 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20  .        a[i] = 
18420 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  p;.        break
18430 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18440 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72 67 65         p = merge
18450 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20  _pagelist(a[i], 
18460 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d  p);.        a[i]
18470 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
18480 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 4e    }.    if( i==N
18490 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20 29  _SORT_BUCKET-1 )
184a0 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76 65 72  {.      /* Cover
184b0 61 67 65 3a 20 54 6f 20 67 65 74 20 68 65 72 65  age: To get here
184c0 2c 20 74 68 65 72 65 20 6e 65 65 64 20 74 6f 20  , there need to 
184d0 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42 55 43  be 2^(N_SORT_BUC
184e0 4b 45 54 29 20 0a 20 20 20 20 20 20 2a 2a 20 65  KET) .      ** e
184f0 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69  lements in the i
18500 6e 70 75 74 20 6c 69 73 74 2e 20 54 68 69 73 20  nput list. This 
18510 69 73 20 70 6f 73 73 69 62 6c 65 2c 20 62 75 74  is possible, but
18520 20 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a 20 20   impractical..  
18530 20 20 20 20 2a 2a 20 54 65 73 74 69 6e 67 20 74      ** Testing t
18540 68 69 73 20 6c 69 6e 65 20 69 73 20 74 68 65 20  his line is the 
18550 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61 6c 20  point of global 
18560 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a  variable.      *
18570 2a 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  * sqlite3_pager_
18580 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e 0a 20  n_sort_bucket.. 
18590 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 5b       */.      a[
185a0 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c  i] = merge_pagel
185b0 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20  ist(a[i], p);.  
185c0 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b    }.  }.  p = a[
185d0 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  0];.  for(i=1; i
185e0 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20  <N_SORT_BUCKET; 
185f0 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65  i++){.    p = me
18600 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c 20  rge_pagelist(p, 
18610 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74  a[i]);.  }.  ret
18620 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
18630 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20  Given a list of 
18640 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64  pages (connected
18650 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
18660 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72  irty pointer) wr
18670 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65  ite.** every one
18680 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20   of those pages 
18690 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
186a0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72  ase file and mar
186b0 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73  k them all.** as
186c0 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   clean..*/.stati
186d0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
186e0 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
186f0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65   *pList){.  Page
18700 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 50 67 48  r *pPager;.  PgH
18710 64 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 3b  dr *p;.  int rc;
18720 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ..  if( pList==0
18730 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
18740 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  _OK;.  pPager = 
18750 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a  pList->pPager;..
18760 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
18770 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
18780 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45  either a RESERVE
18790 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
187a0 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
187b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
187c0 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
187d0 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  dy an EXCLUSIVE 
187e0 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  lock, the follow
187f0 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74  ing.  ** calls t
18800 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  o sqlite3OsLock(
18810 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20  ) are no-ops..  
18820 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74  **.  ** Moving t
18830 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53  he lock from RES
18840 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49  ERVED to EXCLUSI
18850 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f  VE actually invo
18860 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20  lves going.  ** 
18870 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72  through an inter
18880 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45  mediate state PE
18890 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49  NDING.   A PENDI
188a0 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73  NG lock prevents
188b0 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72   new.  ** reader
188c0 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67  s from attaching
188d0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
188e0 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63   but is unsuffic
188f0 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20  ient for us to. 
18900 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20   ** write.  The 
18910 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e  idea of a PENDIN
18920 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65  G lock is to pre
18930 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73  vent new readers
18940 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e   from.  ** comin
18950 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61  g in while we wa
18960 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  it for existing 
18970 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72  readers to clear
18980 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c  ..  **.  ** Whil
18990 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
189a0 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73  n the RESERVED s
189b0 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e  tate, the origin
189c0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
189d0 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67  .  ** is unchang
189e0 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f  ed and we can ro
189f0 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  llback without h
18a00 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63  aving to playbac
18a10 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  k the.  ** journ
18a20 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  al into the orig
18a30 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
18a40 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61  le.  Once we tra
18a50 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20  nsition to.  ** 
18a60 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65  EXCLUSIVE, it me
18a70 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
18a80 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
18a90 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72  hanged and any r
18aa0 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c  ollback.  ** wil
18ab0 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  l require a jour
18ac0 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20  nal playback..  
18ad0 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
18ae0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
18af0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
18b00 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
18b10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18b20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
18b30 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f  .  pList = sort_
18b40 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29 3b  pagelist(pList);
18b50 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20  .  for(p=pList; 
18b60 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  p; p=p->pDirty){
18b70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
18b80 64 69 72 74 79 20 29 3b 0a 20 20 20 20 70 2d 3e  dirty );.    p->
18b90 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dirty = 0;.  }. 
18ba0 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b   while( pList ){
18bb0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
18bc0 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
18bd0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
18be0 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20  en it now. */.  
18bf0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66    if( !pPager->f
18c00 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
18c10 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
18c20 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
18c30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18c40 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70  3PagerOpentemp(p
18c50 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
18c60 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
18c70 3e 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20  >zFilename,.    
18c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c90 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
18ca0 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20  er->vfsFlags);. 
18cb0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
18cc0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
18cd0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
18ce0 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
18cf0 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
18d00 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
18d10 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
18d20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
18d30 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
18d40 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
18d50 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c 6c  ncate() was call
18d60 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
18d70 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
18d80 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
18d90 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
18da0 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
18db0 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
18dc0 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
18dd0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
18de0 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c  if( pList->pgno<
18df0 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
18e00 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
18e10 73 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67  set = (pList->pg
18e20 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
18e30 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
18e40 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d     char *pData =
18e50 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
18e60 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c  PGHDR_TO_DATA(pL
18e70 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ist), pList->pgn
18e80 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 50 41 47  o, 6);.      PAG
18e90 45 52 54 52 41 43 45 34 28 22 53 54 4f 52 45 20  ERTRACE4("STORE 
18ea0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
18eb0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
18ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
18ed0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
18ee0 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72  ist->pgno, pager
18ef0 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
18f00 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
18f10 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e  (("PGOUT %p %d\n
18f20 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69 73 74  ", pPager, pList
18f30 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
18f40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
18f50 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
18f60 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
18f70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
18f80 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
18f90 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
18fa0 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
18fb0 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
18fc0 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
18fd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
18fe0 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  st->pgno==1 ){. 
18ff0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
19000 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
19010 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73  s, &pData[24], s
19020 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
19030 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
19040 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65    }.    }.#ifnde
19050 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73  f NDEBUG.    els
19060 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
19070 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE3("NOSTORE %d
19080 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
19090 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
190a0 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
190b0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
190c0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
190d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
190e0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
190f0 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d  List->pageHash =
19100 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
19110 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20  pList);.#endif. 
19120 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
19130 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20  ->pDirty;.  }.  
19140 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19150 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65  ;.}../*.** Colle
19160 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20 70  ct every dirty p
19170 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79  age into a dirty
19180 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74   list and.** ret
19190 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
191a0 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 61   the head of tha
191b0 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67  t list.  All pag
191c0 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63  es are.** collec
191d0 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 79  ted even if they
191e0 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73   are still in us
191f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  e..*/.static PgH
19200 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c  dr *pager_get_al
19210 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50 61  l_dirty_pages(Pa
19220 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
19230 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
19240 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Dirty;.}../*.** 
19250 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
19260 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
19270 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76  urnal on the giv
19280 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68  en pager..** A h
19290 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e  ot journal is on
192a0 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  e that needs to 
192b0 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  be played back..
192c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
192d0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
192e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
192f0 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
19300 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
19310 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
19320 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
19330 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
19340 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
19350 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
19360 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64  me name.  Just d
19370 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
19380 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
19390 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50   hasHotJournal(P
193a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
193b0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
193c0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
193d0 73 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  s;.  if( !pPager
193e0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72  ->useJournal ) r
193f0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
19400 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
19410 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
19420 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
19430 43 43 45 53 53 5f 45 58 49 53 54 53 29 20 29 7b  CCESS_EXISTS) ){
19440 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
19450 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
19460 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
19470 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20  ock(pPager->fd) 
19480 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
19490 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
194a0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
194b0 28 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20  (pPager)==0 ){. 
194c0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
194d0 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
194e0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
194f0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
19500 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
19510 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
19520 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70   Try to find a p
19530 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
19540 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65 63   that can be rec
19550 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ycled. .**.** Th
19560 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72  is routine may r
19570 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
19580 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  RR, SQLITE_FULL 
19590 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74  or SQLITE_OK. It
195a0 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65   .** does not se
195b0 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72  t the pPager->er
195c0 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a  rCode variable..
195d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
195e0 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65  ger_recycle(Page
195f0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
19600 20 2a 2a 70 70 50 67 29 7b 0a 20 20 50 67 48 64   **ppPg){.  PgHd
19610 72 20 2a 70 50 67 3b 0a 20 20 2a 70 70 50 67 20  r *pPg;.  *ppPg 
19620 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  = 0;..  /* It is
19630 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c   illegal to call
19640 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   this function u
19650 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
19660 6f 62 6a 65 63 74 0a 20 20 2a 2a 20 70 6f 69 6e  object.  ** poin
19670 74 65 64 20 74 6f 20 62 79 20 70 50 61 67 65 72  ted to by pPager
19680 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e   has at least on
19690 65 20 66 72 65 65 20 70 61 67 65 20 28 70 61 67  e free page (pag
196a0 65 20 77 69 74 68 20 6e 52 65 66 3d 3d 30 29 2e  e with nRef==0).
196b0 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
196c0 21 4d 45 4d 44 42 29 3b 0a 20 20 61 73 73 65 72  !MEMDB);.  asser
196d0 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  t(pPager->lru.pF
196e0 69 72 73 74 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  irst);..  /* Fin
196f0 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79  d a page to recy
19700 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63  cle.  Try to loc
19710 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20  ate a page that 
19720 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65  does not.  ** re
19730 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61  quire us to do a
19740 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65  n fsync() on the
19750 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20   journal..  */. 
19760 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 6c   pPg = pPager->l
19770 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3b  ru.pFirstSynced;
19780 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75  ..  /* If we cou
19790 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61  ld not find a pa
197a0 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
197b0 20 72 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e   require an fsyn
197c0 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  c().  ** on the 
197d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
197e0 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  n fsync the jour
197f0 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20  nal file.  This 
19800 69 73 20 61 0a 20 20 2a 2a 20 76 65 72 79 20 73  is a.  ** very s
19810 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73  low operation, s
19820 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74  o we work hard t
19830 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74  o avoid it.  But
19840 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20   sometimes.  ** 
19850 69 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70  it can't be help
19860 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
19870 50 67 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  Pg==0 && pPager-
19880 3e 6c 72 75 2e 70 46 69 72 73 74 29 7b 0a 20 20  >lru.pFirst){.  
19890 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
198a0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
198b0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
198c0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 69 6e 74 20  r->fd);.    int 
198d0 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
198e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
198f0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
19900 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19910 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
19920 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d  ->fullSync && 0=
19930 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
19940 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
19950 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69  ){.      /* If i
19960 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
19970 2c 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f  , write a new jo
19980 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74  urnal header int
19990 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a  o the.      ** j
199a0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
199b0 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f  s is done to avo
199c0 69 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e  id ever modifyin
199d0 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  g a journal.    
199e0 20 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74    ** header that
199f0 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20   is involved in 
19a00 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  the rollback of 
19a10 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
19a20 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79        ** already
19a30 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
19a40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69   the database (i
19a50 6e 20 63 61 73 65 20 74 68 65 20 68 65 61 64 65  n case the heade
19a60 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72  r is.      ** tr
19a70 61 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e  ashed when the n
19a80 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64  Rec field is upd
19a90 61 74 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  ated)..      */.
19aa0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
19ab0 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  ec = 0;.      as
19ac0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
19ad0 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a  urnalOff > 0 );.
19ae0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
19af0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d  ager->doNotSync=
19b00 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
19b10 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
19b20 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
19b30 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
19b40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
19b50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19b60 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e    pPg = pPager->
19b70 6c 72 75 2e 70 46 69 72 73 74 3b 0a 20 20 7d 0a  lru.pFirst;.  }.
19b80 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
19b90 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nRef==0 );..  /*
19ba0 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
19bb0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
19bc0 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69  file if it is di
19bd0 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rty..  */.  if( 
19be0 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  pPg->dirty ){.  
19bf0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73    int rc;.    as
19c00 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53  sert( pPg->needS
19c10 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61  ync==0 );.    ma
19c20 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
19c30 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
19c40 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74  ;.    pPg->pDirt
19c50 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  y = 0;.    rc = 
19c60 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
19c70 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20  list( pPg );.   
19c80 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
19c90 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
19ca0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19cb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
19cc0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
19cd0 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a  Pg->dirty==0 );.
19ce0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
19cf0 65 20 77 65 20 61 72 65 20 72 65 63 79 63 6c 69  e we are recycli
19d00 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ng is marked as 
19d10 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20  alwaysRollback, 
19d20 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68  then.  ** set th
19d30 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52  e global alwaysR
19d40 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68  ollback flag, th
19d50 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  us disabling the
19d60 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
19d70 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
19d80 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
19d90 72 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  r the rest of th
19da0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
19db0 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73    ** It is neces
19dc0 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20  sary to do this 
19dd0 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
19de0 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
19df0 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68  llback.  ** migh
19e00 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74  t be reloaded at
19e10 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75   a later time bu
19e20 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  t at that point 
19e30 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65  we won't remembe
19e40 72 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77  r.  ** that is w
19e50 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73  as marked always
19e60 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20  Rollback.  This 
19e70 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70  means that all p
19e80 61 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62  ages must.  ** b
19e90 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61  e marked as alwa
19ea0 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  ysRollback from 
19eb0 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a  here on out..  *
19ec0 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77  /.  if( pPg->alw
19ed0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20  aysRollback ){. 
19ee0 20 20 20 49 4f 54 52 41 43 45 28 28 22 41 4c 57     IOTRACE(("ALW
19ef0 41 59 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c  AYS_ROLLBACK %p\
19f00 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
19f10 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
19f20 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d  ollback = 1;.  }
19f30 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68  ..  /* Unlink th
19f40 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20  e old page from 
19f50 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e  the free list an
19f60 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  d the hash table
19f70 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61  .  */.  unlinkPa
19f80 67 65 28 70 50 67 29 3b 0a 20 20 61 73 73 65 72  ge(pPg);.  asser
19f90 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20  t( pPg->pgno==0 
19fa0 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50  );..  *ppPg = pP
19fb0 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  g;.  return SQLI
19fc0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
19fd0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
19fe0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
19ff0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1a000 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
1a010 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c 75 6f  o free superfluo
1a020 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61  us dynamically a
1a030 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a  llocated memory.
1a040 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65 20 70  ** held by the p
1a050 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d 65 6d  ager system. Mem
1a060 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 61 6e  ory in use by an
1a070 79 20 53 51 4c 69 74 65 20 70 61 67 65 72 20 61  y SQLite pager a
1a080 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74  llocated.** by t
1a090 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
1a0a0 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74 65 33  d may be sqlite3
1a0b0 5f 66 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a  _free()ed..**.**
1a0c0 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d   nReq is the num
1a0d0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1a0e0 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e  memory required.
1a0f0 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20   Once this much 
1a100 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65  has.** been rele
1a110 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69  ased, the functi
1a120 6f 6e 20 72 65 74 75 72 6e 73 2e 20 54 68 65 20  on returns. The 
1a130 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1a140 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
1a150 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66   .** of bytes of
1a160 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64   memory released
1a170 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a180 50 61 67 65 72 52 65 6c 65 61 73 65 4d 65 6d 6f  PagerReleaseMemo
1a190 72 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20 20  ry(int nReq){.  
1a1a0 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d 20  int nReleased = 
1a1b0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  0;          /* B
1a1c0 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72  ytes of memory r
1a1d0 65 6c 65 61 73 65 64 20 73 6f 20 66 61 72 20 2a  eleased so far *
1a1e0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1a1f0 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 20  x *mutex;       
1a200 2f 2a 20 54 68 65 20 4d 45 4d 32 20 6d 75 74 65  /* The MEM2 mute
1a210 78 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50  x */.  Pager *pP
1a220 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
1a230 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
1a240 67 20 6f 76 65 72 20 70 61 67 65 72 73 20 2a 2f  g over pagers */
1a250 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1a260 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 41 63 71  TE_OK;..  /* Acq
1a270 75 69 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 2d  uire the memory-
1a280 6d 61 6e 61 67 65 6d 65 6e 74 20 6d 75 74 65 78  management mutex
1a290 0a 20 20 2a 2f 0a 20 20 6d 75 74 65 78 20 3d 20  .  */.  mutex = 
1a2a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
1a2b0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1a2c0 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20  _STATIC_MEM2);. 
1a2d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1a2e0 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 0a 20 20  nter(mutex);..  
1a2f0 2f 2a 20 53 69 67 6e 61 6c 20 61 6c 6c 20 64 61  /* Signal all da
1a300 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1a310 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 6d  ns that memory m
1a320 61 6e 61 67 65 6d 65 6e 74 20 77 61 6e 74 73 0a  anagement wants.
1a330 20 20 2a 2a 20 74 6f 20 68 61 76 65 20 61 63 63    ** to have acc
1a340 65 73 73 20 74 6f 20 74 68 65 20 70 61 67 65 72  ess to the pager
1a350 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50  s..  */.  for(pP
1a360 61 67 65 72 3d 73 71 6c 69 74 65 33 50 61 67 65  ager=sqlite3Page
1a370 72 4c 69 73 74 3b 20 70 50 61 67 65 72 3b 20 70  rList; pPager; p
1a380 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e  Pager=pPager->pN
1a390 65 78 74 29 7b 0a 20 20 20 20 20 70 50 61 67 65  ext){.     pPage
1a3a0 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 31 3b  r->iInUseMM = 1;
1a3b0 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72  .  }..  while( r
1a3c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1a3d0 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65  (nReq<0 || nRele
1a3e0 61 73 65 64 3c 6e 52 65 71 29 20 29 7b 0a 20 20  ased<nReq) ){.  
1a3f0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1a400 20 20 50 67 48 64 72 20 2a 70 52 65 63 79 63 6c    PgHdr *pRecycl
1a410 65 64 3b 0a 20 0a 20 20 20 20 2f 2a 20 54 72 79  ed;. .    /* Try
1a420 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
1a430 74 6f 20 72 65 63 79 63 6c 65 20 74 68 61 74 20  to recycle that 
1a440 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
1a450 20 61 20 73 79 6e 63 28 29 2e 20 49 66 0a 20 20   a sync(). If.  
1a460 20 20 2a 2a 20 74 68 69 73 20 69 73 20 6e 6f 74    ** this is not
1a470 20 70 6f 73 73 69 62 6c 65 2c 20 66 69 6e 64 20   possible, find 
1a480 6f 6e 65 20 74 68 61 74 20 64 6f 65 73 20 72 65  one that does re
1a490 71 75 69 72 65 20 61 20 73 79 6e 63 28 29 2e 0a  quire a sync()..
1a4a0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
1a4b0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
1a4c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
1a4d0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
1a4e0 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20  STATIC_LRU));.  
1a4f0 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 4c    pPg = sqlite3L
1a500 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73  ruPageList.pFirs
1a510 74 53 79 6e 63 65 64 3b 0a 20 20 20 20 77 68 69  tSynced;.    whi
1a520 6c 65 28 20 70 50 67 20 26 26 20 28 70 50 67 2d  le( pPg && (pPg-
1a530 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70 50 67  >needSync || pPg
1a540 2d 3e 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65  ->pPager->iInUse
1a550 44 42 29 20 29 7b 0a 20 20 20 20 20 20 70 50 67  DB) ){.      pPg
1a560 20 3d 20 70 50 67 2d 3e 67 66 72 65 65 2e 70 4e   = pPg->gfree.pN
1a570 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ext;.    }.    i
1a580 66 28 20 21 70 50 67 20 29 7b 0a 20 20 20 20 20  f( !pPg ){.     
1a590 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 4c 72   pPg = sqlite3Lr
1a5a0 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74  uPageList.pFirst
1a5b0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
1a5c0 50 67 20 26 26 20 70 50 67 2d 3e 70 50 61 67 65  Pg && pPg->pPage
1a5d0 72 2d 3e 69 49 6e 55 73 65 44 42 20 29 7b 0a 20  r->iInUseDB ){. 
1a5e0 20 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67         pPg = pPg
1a5f0 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74 3b 0a 20  ->gfree.pNext;. 
1a600 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a610 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1a620 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74  eave(sqlite3_mut
1a630 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
1a640 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55  MUTEX_STATIC_LRU
1a650 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ));..    /* If p
1a660 50 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  Pg==0, then the 
1a670 62 6c 6f 63 6b 20 61 62 6f 76 65 20 68 61 73 20  block above has 
1a680 66 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 61  failed to find a
1a690 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20   page to.    ** 
1a6a0 72 65 63 79 63 6c 65 2e 20 49 6e 20 74 68 69 73  recycle. In this
1a6b0 20 63 61 73 65 20 72 65 74 75 72 6e 20 65 61 72   case return ear
1a6c0 6c 79 20 2d 20 6e 6f 20 66 75 72 74 68 65 72 20  ly - no further 
1a6d0 6d 65 6d 6f 72 79 20 77 69 6c 6c 0a 20 20 20 20  memory will.    
1a6e0 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
1a6f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
1a700 70 50 67 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  pPg ) break;..  
1a710 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e    pPager = pPg->
1a720 70 50 61 67 65 72 3b 0a 20 20 20 20 61 73 73 65  pPager;.    asse
1a730 72 74 28 21 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt(!pPg->needSyn
1a740 63 20 7c 7c 20 70 50 67 3d 3d 70 50 61 67 65 72  c || pPg==pPager
1a750 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29 3b 0a 20  ->lru.pFirst);. 
1a760 20 20 20 61 73 73 65 72 74 28 70 50 67 2d 3e 6e     assert(pPg->n
1a770 65 65 64 53 79 6e 63 20 7c 7c 20 70 50 67 3d 3d  eedSync || pPg==
1a780 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
1a790 73 74 53 79 6e 63 65 64 29 3b 0a 20 20 0a 20 20  stSynced);.  .  
1a7a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63    rc = pager_rec
1a7b0 79 63 6c 65 28 70 50 61 67 65 72 2c 20 26 70 52  ycle(pPager, &pR
1a7c0 65 63 79 63 6c 65 64 29 3b 0a 20 20 20 20 61 73  ecycled);.    as
1a7d0 73 65 72 74 28 70 52 65 63 79 63 6c 65 64 3d 3d  sert(pRecycled==
1a7e0 70 50 67 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  pPg || rc!=SQLIT
1a7f0 45 5f 4f 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  E_OK);.    if( r
1a800 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a810 20 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20 66        /* We've f
1a820 6f 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20 66  ound a page to f
1a830 72 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ree. At this poi
1a840 6e 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20  nt the page has 
1a850 62 65 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 72  been .      ** r
1a860 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
1a870 70 61 67 65 20 68 61 73 68 2d 74 61 62 6c 65 2c  page hash-table,
1a880 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 73   free-list and s
1a890 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20 20 20  ynced-list .    
1a8a0 20 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e 63    ** (pFirstSync
1a8b0 65 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c 6c  ed). It is still
1a8c0 20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67 65   in the all page
1a8d0 73 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a  s (pAll) list. .
1a8e0 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20        ** Remove 
1a8f0 69 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73  it from this lis
1a900 74 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67  t before freeing
1a910 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1a920 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20   ** Todo: Check 
1a930 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d 74 20  the Pager.pStmt 
1a940 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72  list to make sur
1a950 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20 49 74  e this is Ok. It
1a960 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61   .      ** proba
1a970 62 6c 79 20 69 73 20 74 68 6f 75 67 68 2e 0a 20  bly is though.. 
1a980 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67       */.      Pg
1a990 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20  Hdr *pTmp;.     
1a9a0 20 61 73 73 65 72 74 28 20 70 50 67 20 29 3b 0a   assert( pPg );.
1a9b0 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70        if( pPg==p
1a9c0 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20  Pager->pAll ){. 
1a9d0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1a9e0 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78  pAll = pPg->pNex
1a9f0 74 41 6c 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  tAll;.      }els
1aa00 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20  e{.        for( 
1aa10 70 54 6d 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c  pTmp=pPager->pAl
1aa20 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c  l; pTmp->pNextAl
1aa30 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70 54 6d  l!=pPg; pTmp=pTm
1aa40 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a  p->pNextAll ){}.
1aa50 20 20 20 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e          pTmp->pN
1aa60 65 78 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e  extAll = pPg->pN
1aa70 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  extAll;.      }.
1aa80 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64 20        nReleased 
1aa90 2b 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 73  += (.          s
1aaa0 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50  izeof(*pPg) + pP
1aab0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20  ager->pageSize. 
1aac0 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
1aad0 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d  f(u32) + pPager-
1aae0 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20  >nExtra.        
1aaf0 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66    + MEMDB*sizeof
1ab00 28 50 67 48 69 73 74 6f 72 79 29 20 0a 20 20 20  (PgHistory) .   
1ab10 20 20 20 29 3b 0a 20 20 20 20 20 20 49 4f 54 52     );.      IOTR
1ab20 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20  ACE(("PGFREE %p 
1ab30 25 64 20 2a 5c 6e 22 2c 20 70 50 61 67 65 72 2c  %d *\n", pPager,
1ab40 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
1ab50 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
1ab60 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
1ab70 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  ree_count);.    
1ab80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1ab90 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Pg);.      pPage
1aba0 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->nPage--;.    
1abb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
1abc0 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  An error occured
1abd0 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
1abe0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1abf0 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20 20 2a  file or .      *
1ac00 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67  * journal in pag
1ac10 65 72 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68  er_recycle(). Th
1ac20 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72  e error is not r
1ac30 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a  eturned to the .
1ac40 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
1ac50 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
1ac60 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74  . Instead, set t
1ac70 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  he Pager.errCode
1ac80 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20   variable..     
1ac90 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 77 69   ** The error wi
1aca0 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
1acb0 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72 20 75  o the user (or u
1acc0 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63 61 73  sers, in the cas
1acd0 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61  e .      ** of a
1ace0 20 73 68 61 72 65 64 20 70 61 67 65 72 20 63 61   shared pager ca
1acf0 63 68 65 29 20 6f 66 20 74 68 65 20 70 61 67 65  che) of the page
1ad00 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  r for which the 
1ad10 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20  error occured.. 
1ad20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
1ad30 73 65 72 74 28 0a 20 20 20 20 20 20 20 20 20 20  sert(.          
1ad40 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
1ad50 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 20  E_IOERR ||.     
1ad60 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
1ad70 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20  FULL ||.        
1ad80 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53    rc==SQLITE_BUS
1ad90 59 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  Y.      );.     
1ada0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1adb0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
1adc0 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20  SERVED );.      
1add0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
1ade0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a 20  er, rc);.    }. 
1adf0 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74   }..  /* Clear t
1ae00 68 65 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  he memory manage
1ae10 6d 65 6e 74 20 66 6c 61 67 73 20 61 6e 64 20 72  ment flags and r
1ae20 65 6c 65 61 73 65 20 74 68 65 20 6d 75 74 65 78  elease the mutex
1ae30 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 67  .  */.  for(pPag
1ae40 65 72 3d 73 71 6c 69 74 65 33 50 61 67 65 72 4c  er=sqlite3PagerL
1ae50 69 73 74 3b 20 70 50 61 67 65 72 3b 20 70 50 61  ist; pPager; pPa
1ae60 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78  ger=pPager->pNex
1ae70 74 29 7b 0a 20 20 20 20 20 70 50 61 67 65 72 2d  t){.     pPager-
1ae80 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30 3b 0a 20  >iInUseMM = 0;. 
1ae90 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1aea0 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b  ex_leave(mutex);
1aeb0 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68  ..  /* Return th
1aec0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1aed0 73 20 72 65 6c 65 61 73 65 64 0a 20 20 2a 2f 0a  s released.  */.
1aee0 20 20 72 65 74 75 72 6e 20 6e 52 65 6c 65 61 73    return nReleas
1aef0 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ed;.}.#endif /* 
1af00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
1af10 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20  MORY_MANAGEMENT 
1af20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  */../*.** Read t
1af30 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
1af40 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68  ge pPg out of th
1af50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1af60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1af70 65 61 64 44 62 50 61 67 65 28 50 61 67 65 72 20  eadDbPage(Pager 
1af80 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
1af90 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pPg, Pgno pgno){
1afa0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 36 34  .  int rc;.  i64
1afb0 20 6f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72   offset;.  asser
1afc0 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20  t( MEMDB==0 );. 
1afd0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
1afe0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50  fd->pMethods||pP
1aff0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
1b000 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1b010 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
1b020 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b030 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1b040 41 44 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  AD;.  }.  offset
1b050 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
1b060 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
1b070 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
1b080 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1b090 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  fd, PGHDR_TO_DAT
1b0a0 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
1b0b0 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
1b0c0 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1b0d0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
1b0e0 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50  addb_count);.  P
1b0f0 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
1b100 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52  ->nRead);.  IOTR
1b110 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64  ACE(("PGIN %p %d
1b120 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
1b130 6f 29 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d  o));.  if( pgno=
1b140 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  =1 ){.    memcpy
1b150 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
1b160 56 65 72 73 2c 20 26 28 28 75 38 2a 29 50 47 48  Vers, &((u8*)PGH
1b170 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29  DR_TO_DATA(pPg))
1b180 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  [24],.          
1b190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1b0 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65      sizeof(pPage
1b1c0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
1b1d0 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50  .  }.  CODEC1(pP
1b1e0 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
1b1f0 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70  ATA(pPg), pPg->p
1b200 67 6e 6f 2c 20 33 29 3b 0a 20 20 50 41 47 45 52  gno, 3);.  PAGER
1b210 54 52 41 43 45 34 28 22 46 45 54 43 48 20 25 64  TRACE4("FETCH %d
1b220 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
1b230 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
1b240 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1b250 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1b260 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
1b270 68 28 70 50 67 29 29 3b 0a 20 20 72 65 74 75 72  h(pPg));.  retur
1b280 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1b290 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1b2a0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
1b2b0 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  n the shared loc
1b2c0 6b 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  k required befor
1b2d0 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65  e.** data may be
1b2e0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
1b2f0 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
1b300 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 68  he shared lock h
1b310 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  as already.** be
1b320 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 69  en obtained, thi
1b330 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1b340 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d  no-op..**.** Imm
1b350 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
1b360 62 74 61 69 6e 69 6e 67 20 74 68 65 20 73 68 61  btaining the sha
1b370 72 65 64 20 6c 6f 63 6b 20 28 69 66 20 72 65 71  red lock (if req
1b380 75 69 72 65 64 29 2c 20 74 68 69 73 20 66 75 6e  uired), this fun
1b390 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20  ction.** checks 
1b3a0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
1b3b0 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69  l file. If one i
1b3c0 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72  s found, an emer
1b3d0 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a  gency rollback.*
1b3e0 2a 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 69  * is performed i
1b3f0 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73  mmediately..*/.s
1b400 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
1b410 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20  haredLock(Pager 
1b420 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1b430 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1b440 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1b450 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
1b460 43 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  CK ){.    sqlite
1b470 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
1b480 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20  ager->pVfs;.    
1b490 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
1b4a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1b4b0 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20  er->nRef==0 );. 
1b4c0 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
1b4d0 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a  ->noReadlock ){.
1b4e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1b4f0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
1b500 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
1b510 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
1b520 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1b540 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
1b550 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
1b560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
1b570 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1b580 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  tate>=SHARED_LOC
1b590 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a  K );.      }.  .
1b5a0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f        /* If a jo
1b5b0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
1b5c0 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
1b5d0 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
1b5e0 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   on the.      **
1b5f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
1b600 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e  then it either n
1b610 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
1b620 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65  d back or delete
1b630 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
1b640 20 20 69 66 28 20 68 61 73 48 6f 74 4a 6f 75 72    if( hasHotJour
1b650 6e 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  nal(pPager) ){. 
1b660 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e         /* Get an
1b670 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1b680 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1b690 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f  file. At this po
1b6a0 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20  int it is.      
1b6b0 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74    ** important t
1b6c0 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  hat a RESERVED l
1b6d0 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69  ock is not obtai
1b6e0 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ned on the way t
1b6f0 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
1b700 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
1b710 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
1b720 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
1b730 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
1b740 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1b750 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
1b760 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
1b770 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
1b780 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  t the.        **
1b790 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66   database is saf
1b7a0 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20  e to read while 
1b7b0 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
1b7c0 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74  still rolling it
1b7d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63   .        ** bac
1b7e0 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20  k..        ** . 
1b7f0 20 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73         ** Becaus
1b800 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  e the intermedia
1b810 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  te RESERVED lock
1b820 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65   is not requeste
1b830 64 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  d, the.        *
1b840 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73  * second process
1b850 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69   will get to thi
1b860 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63  s point in the c
1b870 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a  ode and fail to.
1b880 20 20 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69          ** obtai
1b890 6e 20 69 74 27 73 20 6f 77 6e 20 45 58 43 4c 55  n it's own EXCLU
1b8a0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
1b8b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1b8c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1b8d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1b8e0 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
1b8f0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
1b900 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1b910 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b920 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f            pager_
1b930 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
1b940 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1b950 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
1b960 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
1b970 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
1b980 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1b990 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 0a 20  R_EXCLUSIVE;. . 
1b9a0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74         /* Open t
1b9b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
1b9c0 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65  eading only.  Re
1b9d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
1b9e0 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   if.        ** w
1b9f0 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
1ba00 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
1ba10 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 20   file. .        
1ba20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
1ba30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
1ba40 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
1ba50 62 65 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66  be locked itself
1ba60 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  .  The.        *
1ba70 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
1ba80 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c  s never open unl
1ba90 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ess the main dat
1baa0 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 73  abase file holds
1bab0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 77 72  .        ** a wr
1bac0 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65  ite lock, so the
1bad0 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 20  re is never any 
1bae0 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72  chance of two or
1baf0 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 20 2a 2a   more.        **
1bb00 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69   processes openi
1bb10 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ng the journal a
1bb20 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
1bb30 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1bb40 20 20 20 20 2a 2a 20 4f 70 65 6e 20 74 68 65 20      ** Open the 
1bb50 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
1bb60 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54  /write access. T
1bb70 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
1bb80 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78  n .        ** ex
1bb90 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
1bba0 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ode the file des
1bbb0 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
1bbc0 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20  kept open and.  
1bbd0 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c        ** possibl
1bbe0 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61  y used for a tra
1bbf0 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f  nsaction later o
1bc00 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65  n. On some syste
1bc10 6d 73 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20  ms, the.        
1bc20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20  ** OsTruncate() 
1bc30 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78 63  call used in exc
1bc40 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
1bc50 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65 73  de also requires
1bc60 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72 65  .        ** a re
1bc70 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61  ad/write file ha
1bc80 6e 64 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ndle..        */
1bc90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1bca0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1bcb0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73     if( sqlite3Os
1bcc0 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61  Access(pVfs, pPa
1bcd0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53  ger->zJournal, S
1bce0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1bcf0 53 54 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20  STS) ){.        
1bd00 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a    int fout = 0;.
1bd10 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c            int fl
1bd20 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
1bd30 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
1bd40 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
1bd50 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
1bd60 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1bd70 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
1bd80 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1bd90 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
1bda0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1bdb0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
1bdc0 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20  lags, &fout);.  
1bdd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1bde0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1bdf0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d   pPager->jfd->pM
1be00 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 20 20  ethods );.      
1be10 20 20 20 20 69 66 28 20 66 6f 75 74 26 53 51 4c      if( fout&SQL
1be20 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
1be30 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Y ){.           
1be40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1be50 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  Y;.            s
1be60 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
1be70 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
1be80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1be90 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
1bea0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1beb0 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75           pager_u
1bec0 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
1bed0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1bee0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  (rc==SQLITE_NOME
1bef0 4d 3f 72 63 3a 53 51 4c 49 54 45 5f 42 55 53 59  M?rc:SQLITE_BUSY
1bf00 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1bf10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1bf20 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  rnalOpen = 1;.  
1bf30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1bf40 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
1bf50 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
1bf60 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
1bf70 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
1bf80 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
1bf90 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1bfa0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
1bfb0 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 6c  . .        /* Pl
1bfc0 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
1bfd0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
1bfe0 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
1bff0 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 20  e write.        
1c000 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
1c010 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
1c020 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ock..        */.
1c030 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1c040 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
1c050 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
1c060 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c070 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1c080 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
1c090 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
1c0a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c0b0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
1c0c0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
1c0d0 52 45 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  RED || .        
1c0e0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 78 63      (pPager->exc
1c0f0 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
1c100 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45  ager->state>PAGE
1c110 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  R_SHARED).      
1c120 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20    );.      }..  
1c130 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1c140 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pAll ){.        
1c150 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f  /* The shared-lo
1c160 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ck has just been
1c170 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65   acquired on the
1c180 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
1c190 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68         ** and th
1c1a0 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
1c1b0 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
1c1c0 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69  he (from a previ
1c1d0 6f 75 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  ous.        ** r
1c1e0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1c1f0 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63  nsaction).  Chec
1c200 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
1c210 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20  database.       
1c220 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64   ** has been mod
1c230 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64  ified.  If the d
1c240 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e  atabase has chan
1c250 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20  ged, flush the. 
1c260 20 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e         ** cache.
1c270 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1c280 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20      ** Database 
1c290 63 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63  changes is detec
1c2a0 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  ted by looking a
1c2b0 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e  t 15 bytes begin
1c2c0 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ning.        ** 
1c2d0 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74  at offset 24 int
1c2e0 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  o the file.  The
1c2f0 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73   first 4 of thes
1c300 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20  e 16 bytes are. 
1c310 20 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62         ** a 32-b
1c320 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20  it counter that 
1c330 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
1c340 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e  ith each change.
1c350 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a    The.        **
1c360 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
1c370 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
1c380 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
1c390 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20  ge when.        
1c3a0 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e  ** a codec is in
1c3b0 20 75 73 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a   use..        **
1c3c0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65   .        ** The
1c3d0 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e  re is a vanishin
1c3e0 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65  gly small chance
1c3f0 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77   that a change w
1c400 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  ill not be .    
1c410 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e      ** detected.
1c420 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20    The chance of 
1c430 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68  an undetected ch
1c440 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c  ange is so small
1c450 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
1c460 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65   it can be negle
1c470 63 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  cted..        */
1c480 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 64 62  .        char db
1c490 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28  FileVers[sizeof(
1c4a0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1c4b0 72 73 29 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  rs)];.        sq
1c4c0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1c4d0 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  unt(pPager);..  
1c4e0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1c4f0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
1c500 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 50         return pP
1c510 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1c520 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1c530 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
1c540 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Size>0 ){.      
1c550 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
1c560 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
1c570 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
1c580 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
1c590 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1c5a0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1c5b0 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72  ->fd, &dbFileVer
1c5c0 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
1c5d0 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20  Vers), 24);.    
1c5e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1c5f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c600 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1c610 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1c620 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c630 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62         memset(db
1c640 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a  FileVers, 0, siz
1c650 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
1c660 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1c670 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
1c680 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1c690 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
1c6a0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
1c6b0 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  s))!=0 ){.      
1c6c0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1c6d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1c6e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1c6f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1c700 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
1c710 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  de || pPager->st
1c720 61 74 65 3c 3d 50 41 47 45 52 5f 53 48 41 52 45  ate<=PAGER_SHARE
1c730 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  D );.    if( pPa
1c740 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1c750 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
1c760 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1c770 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
1c780 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1c790 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1c7a0 20 41 6c 6c 6f 63 61 74 65 20 61 20 50 67 48 64   Allocate a PgHd
1c7b0 72 20 6f 62 6a 65 63 74 2e 20 20 20 45 69 74 68  r object.   Eith
1c7c0 65 72 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  er create a new 
1c7d0 6f 6e 65 20 6f 72 20 72 65 75 73 65 0a 2a 2a 20  one or reuse.** 
1c7e0 61 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e 65 20  an existing one 
1c7f0 74 68 61 74 20 69 73 20 6e 6f 74 20 6f 74 68 65  that is not othe
1c800 72 77 69 73 65 20 69 6e 20 75 73 65 2e 0a 2a 2a  rwise in use..**
1c810 0a 2a 2a 20 41 20 6e 65 77 20 50 67 48 64 72 20  .** A new PgHdr 
1c820 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
1c830 61 74 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74  ated if any of t
1c840 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1c850 0a 2a 2a 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  .** true:.**.** 
1c860 20 20 20 20 28 31 29 20 20 57 65 20 68 61 76 65      (1)  We have
1c870 20 6e 6f 74 20 65 78 63 65 65 64 65 64 20 6f 75   not exceeded ou
1c880 72 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 63 61  r maximum alloca
1c890 74 65 64 20 63 61 63 68 65 20 73 69 7a 65 0a 2a  ted cache size.*
1c8a0 2a 20 20 20 20 20 20 20 20 20 20 61 73 20 73 65  *          as se
1c8b0 74 20 62 79 20 74 68 65 20 22 50 52 41 47 4d 41  t by the "PRAGMA
1c8c0 20 63 61 63 68 65 5f 73 69 7a 65 22 20 63 6f 6d   cache_size" com
1c8d0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mand..**.**     
1c8e0 28 32 29 20 20 54 68 65 72 65 20 61 72 65 20 6e  (2)  There are n
1c8f0 6f 20 75 6e 75 73 65 64 20 50 67 48 64 72 20 6f  o unused PgHdr o
1c900 62 6a 65 63 74 73 20 61 76 61 69 6c 61 62 6c 65  bjects available
1c910 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 2a   at this time..*
1c920 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 54 68  *.**     (3)  Th
1c930 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
1c940 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ry database..**.
1c950 2a 2a 20 20 20 20 20 28 34 29 20 20 54 68 65 72  **     (4)  Ther
1c960 65 20 61 72 65 20 6e 6f 20 50 67 48 64 72 20 6f  e are no PgHdr o
1c970 62 6a 65 63 74 73 20 74 68 61 74 20 64 6f 20 6e  bjects that do n
1c980 6f 74 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ot require a jou
1c990 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
1c9a0 20 66 69 6c 65 20 73 79 6e 63 20 61 6e 64 20 61   file sync and a
1c9b0 20 73 79 6e 63 20 6f 66 20 74 68 65 20 6a 6f 75   sync of the jou
1c9c0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 75 72  rnal file is cur
1c9d0 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20  rently.**       
1c9e0 20 20 20 70 72 6f 68 69 62 69 74 65 64 2e 0a 2a     prohibited..*
1c9f0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1ca00 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  reuse an existin
1ca10 67 20 50 67 48 64 72 2e 20 20 49 6e 20 6f 74 68  g PgHdr.  In oth
1ca20 65 72 20 77 6f 72 64 73 2c 20 72 65 75 73 65 20  er words, reuse 
1ca30 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 50  an.** existing P
1ca40 67 48 64 72 20 69 66 20 61 6c 6c 20 6f 66 20 74  gHdr if all of t
1ca50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1ca60 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   true:.**.**    
1ca70 20 28 31 29 20 20 57 65 20 68 61 76 65 20 72 65   (1)  We have re
1ca80 61 63 68 65 64 20 6f 72 20 65 78 63 65 65 64 65  ached or exceede
1ca90 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 63 61  d the maximum ca
1caa0 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20  che size.**     
1cab0 20 20 20 20 20 61 6c 6c 6f 77 65 64 20 62 79 20       allowed by 
1cac0 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69  "PRAGMA cache_si
1cad0 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ze"..**.**     (
1cae0 32 29 20 20 54 68 65 72 65 20 69 73 20 61 20 50  2)  There is a P
1caf0 67 48 64 72 20 61 76 61 69 6c 61 62 6c 65 20 77  gHdr available w
1cb00 69 74 68 20 50 67 48 64 72 2d 3e 6e 52 65 66 3d  ith PgHdr->nRef=
1cb10 3d 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29  =0.**.**     (3)
1cb20 20 20 57 65 20 61 72 65 20 6e 6f 74 20 69 6e 20    We are not in 
1cb30 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
1cb40 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20  abase.**.**     
1cb50 28 34 29 20 20 45 69 74 68 65 72 20 74 68 65 72  (4)  Either ther
1cb60 65 20 69 73 20 61 6e 20 61 76 61 69 6c 61 62 6c  e is an availabl
1cb70 65 20 50 67 48 64 72 20 74 68 61 74 20 64 6f 65  e PgHdr that doe
1cb80 73 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20 20 20  s not need.**   
1cb90 20 20 20 20 20 20 20 74 6f 20 62 65 20 73 79 6e         to be syn
1cba0 63 65 64 20 74 6f 20 64 69 73 6b 20 6f 72 20 65  ced to disk or e
1cbb0 6c 73 65 20 64 69 73 6b 20 73 79 6e 63 69 6e 67  lse disk syncing
1cbc0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
1cbd0 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65            allowe
1cbe0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1cbf0 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61   pagerAllocatePa
1cc00 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
1cc10 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b  , PgHdr **ppPg){
1cc20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1cc30 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a  TE_OK;.  PgHdr *
1cc40 70 50 67 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  pPg;..  /* Creat
1cc50 65 20 61 20 6e 65 77 20 50 67 48 64 72 20 69 66  e a new PgHdr if
1cc60 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 75 72   any of the four
1cc70 20 63 6f 6e 64 69 74 69 6f 6e 73 20 64 65 66 69   conditions defi
1cc80 6e 65 64 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20  ned .  ** above 
1cc90 61 72 65 20 6d 65 74 3a 20 2a 2f 0a 20 20 69 66  are met: */.  if
1cca0 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c  ( pPager->nPage<
1ccb0 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 0a 20  pPager->mxPage. 
1ccc0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6c 72 75    || pPager->lru
1ccd0 2e 70 46 69 72 73 74 3d 3d 30 20 0a 20 20 20 7c  .pFirst==0 .   |
1cce0 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c 20 28 70  | MEMDB.   || (p
1ccf0 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73  Pager->lru.pFirs
1cd00 74 53 79 6e 63 65 64 3d 3d 30 20 26 26 20 70 50  tSynced==0 && pP
1cd10 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29  ager->doNotSync)
1cd20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  .  ){.    if( pP
1cd30 61 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61  ager->nPage>=pPa
1cd40 67 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20  ger->nHash ){.  
1cd50 20 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65      pager_resize
1cd60 5f 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67  _hash_table(pPag
1cd70 65 72 2c 0a 20 20 20 20 20 20 20 20 20 70 50 61  er,.         pPa
1cd80 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f  ger->nHash<256 ?
1cd90 20 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e   256 : pPager->n
1cda0 48 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 69  Hash*2);.      i
1cdb0 66 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  f( pPager->nHash
1cdc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1cdd0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1cde0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
1cdf0 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75  ager_allocate_ou
1ce00 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1ce10 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28  .    pagerLeave(
1ce20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 67  pPager);.    pPg
1ce30 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1ce40 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20  c( sizeof(*pPg) 
1ce50 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  + pPager->pageSi
1ce60 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ze.             
1ce70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
1ce80 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70   sizeof(u32) + p
1ce90 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20  Pager->nExtra.  
1cea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ceb0 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44            + MEMD
1cec0 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f  B*sizeof(PgHisto
1ced0 72 79 29 20 29 3b 0a 20 20 20 20 70 61 67 65 72  ry) );.    pager
1cee0 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
1cef0 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
1cf00 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1cf10 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1cf20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63  goto pager_alloc
1cf30 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ate_out;.    }. 
1cf40 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30     memset(pPg, 0
1cf50 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b  , sizeof(*pPg));
1cf60 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
1cf70 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
1cf80 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1cf90 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69  , pPager), 0, si
1cfa0 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29  zeof(PgHistory))
1cfb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
1cfc0 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
1cfd0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
1cfe0 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41  All = pPager->pA
1cff0 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ll;.    pPager->
1d000 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20  pAll = pPg;.    
1d010 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b  pPager->nPage++;
1d020 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1d030 20 52 65 63 79 63 6c 65 20 61 6e 20 65 78 69 73   Recycle an exis
1d040 74 69 6e 67 20 70 61 67 65 20 77 69 74 68 20 61  ting page with a
1d050 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e   zero ref-count.
1d060 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
1d070 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65  er_recycle(pPage
1d080 72 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66  r, &pPg);.    if
1d090 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
1d0a0 59 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  Y ){.      rc = 
1d0b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
1d0c0 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20  CKED;.    }.    
1d0d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d0e0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
1d0f0 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f  pager_allocate_o
1d100 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ut;.    }.    as
1d110 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1d120 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ate>=SHARED_LOCK
1d130 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70   );.    assert(p
1d140 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 67  Pg);.  }.  *ppPg
1d150 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72 5f 61   = pPg;..pager_a
1d160 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20 20 72  llocate_out:.  r
1d170 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1d180 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  ** Make sure we 
1d190 68 61 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  have the content
1d1a0 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49 66   for a page.  If
1d1b0 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a 2a   the page was.**
1d1c0 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75   previously acqu
1d1d0 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74  ired with noCont
1d1e0 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  ent==1, then the
1d1f0 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a 2a 20   content was.** 
1d200 6a 75 73 74 20 69 6e 69 74 69 61 6c 69 7a 65 64  just initialized
1d210 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74 65 61   to zeros instea
1d220 64 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64 20  d of being read 
1d230 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42 75  from disk..** Bu
1d240 74 20 6e 6f 77 20 77 65 20 6e 65 65 64 20 74 68  t now we need th
1d250 65 20 72 65 61 6c 20 64 61 74 61 20 6f 66 66 20  e real data off 
1d260 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d 61 6b  of disk.  So mak
1d270 65 20 73 75 72 65 20 77 65 0a 2a 2a 20 68 61 76  e sure we.** hav
1d280 65 20 69 74 2e 20 20 52 65 61 64 20 69 74 20 69  e it.  Read it i
1d290 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 68  n if we do not h
1d2a0 61 76 65 20 69 74 20 61 6c 72 65 61 64 79 2e 0a  ave it already..
1d2b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1d2c0 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28  ger_get_content(
1d2d0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
1d2e0 66 28 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64  f( pPg->needRead
1d2f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
1d300 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2d   readDbPage(pPg-
1d310 3e 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 50  >pPager, pPg, pP
1d320 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  g->pgno);.    if
1d330 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d340 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  ){.      pPg->ne
1d350 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20  edRead = 0;.    
1d360 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
1d370 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1d380 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1d390 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
1d3a0 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a  cquire a page..*
1d3b0 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b  *.** A read lock
1d3c0 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   on the disk fil
1d3d0 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68  e is obtained wh
1d3e0 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67  en the first pag
1d3f0 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a  e is acquired. .
1d400 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63  ** This read loc
1d410 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65  k is dropped whe
1d420 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  n the last page 
1d430 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  is released..**.
1d440 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d450 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61  works for any pa
1d460 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ge number greate
1d470 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68  r than 0.  If th
1d480 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
1d490 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  le is smaller th
1d4a0 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
1d4b0 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61   page, then no a
1d4c0 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65  ctual disk.** re
1d4d0 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ad occurs and th
1d4e0 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  e memory image o
1d4f0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e  f the page is in
1d500 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20  itialized to.** 
1d510 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20  all zeros.  The 
1d520 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e  extra data appen
1d530 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73  ded to a page is
1d540 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69   always initiali
1d550 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20  zed.** to zeros 
1d560 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
1d570 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
1d580 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a  into memory..**.
1d590 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
1d5a0 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
1d5b0 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
1d5c0 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
1d5d0 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
1d5e0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
1d5f0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1d600 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
1d610 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
1d620 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
1d630 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  erLookup().  Bot
1d640 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
1d650 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65  nd Lookup() atte
1d660 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
1d670 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
1d680 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
1d690 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
1d6a0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
1d6b0 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
1d6c0 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
1d6d0 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
1d6e0 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f  it in whereas Lo
1d6f0 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
1d700 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
1d710 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
1d720 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
1d730 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
1d740 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
1d750 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
1d760 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
1d770 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
1d780 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
1d790 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  ce Lookup() neve
1d7a0 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
1d7b0 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
1d7c0 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
1d7d0 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
1d7e0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  les..**.** If no
1d7f0 43 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c 73 65  Content is false
1d800 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  , the page conte
1d810 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c 79  nts are actually
1d820 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e   read from disk.
1d830 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
1d840 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61   is true, it mea
1d850 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
1d860 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  t care about the
1d870 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20   contents.** of 
1d880 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
1d890 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f 74   time, so do not
1d8a0 20 64 6f 20 61 20 64 69 73 6b 20 72 65 61 64 2e   do a disk read.
1d8b0 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
1d8c0 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65  he.** page conte
1d8d0 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 2e 20 20  nt with zeros.  
1d8e0 42 75 74 20 6d 61 72 6b 20 74 68 65 20 66 61 63  But mark the fac
1d8f0 74 20 74 68 61 74 20 77 65 20 68 61 76 65 20 6e  t that we have n
1d900 6f 74 20 72 65 61 64 20 74 68 65 0a 2a 2a 20 63  ot read the.** c
1d910 6f 6e 74 65 6e 74 20 62 79 20 73 65 74 74 69 6e  ontent by settin
1d920 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  g the PgHdr.need
1d930 52 65 61 64 20 66 6c 61 67 2e 20 20 4c 61 74 65  Read flag.  Late
1d940 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71 6c  r on, if .** sql
1d950 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1d960 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
1d970 69 73 20 70 61 67 65 20 6f 72 20 69 66 20 74 68  is page or if th
1d980 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
1d990 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 77 69   called again wi
1d9a0 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 2c  th noContent==0,
1d9b0 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
1d9c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20   the content is 
1d9d0 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74 68  needed.** and th
1d9e0 65 20 64 69 73 6b 20 72 65 61 64 20 73 68 6f 75  e disk read shou
1d9f0 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
1da00 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69   point..*/.stati
1da10 63 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69  c int pagerAcqui
1da20 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  re(.  Pager *pPa
1da30 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
1da40 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
1da50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1da60 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
1da70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1da80 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
1da90 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
1daa0 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
1dab0 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
1dac0 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
1dad0 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  /.  int noConten
1dae0 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  t       /* Do no
1daf0 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67  t bother reading
1db00 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
1db10 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  sk if true */.){
1db20 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
1db30 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1db40 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1db50 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
1db60 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e  || pPager->nRef>
1db70 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b 0a  0 || pgno==1 );.
1db80 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75  .  /* The maximu
1db90 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  m page number is
1dba0 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51   2^31. Return SQ
1dbb0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
1dbc0 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62  a page.  ** numb
1dbd0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
1dbe0 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69  this, or zero, i
1dbf0 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
1dc00 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47  /.  if( pgno>PAG
1dc10 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70  ER_MAX_PGNO || p
1dc20 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
1dc30 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1dc40 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
1dc50 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1dc60 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
1dc70 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
1dc80 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79  have not hit any
1dc90 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73   critical errors
1dca0 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74  ..  */ .  assert
1dcb0 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
1dcc0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
1dcd0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1dce0 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
1dcf0 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
1dd00 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULL ){.    retur
1dd10 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
1dd20 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  e;.  }..  /* If 
1dd30 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1dd40 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c  t page accessed,
1dd50 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52   then get a SHAR
1dd60 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  ED lock.  ** on 
1dd70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1dd80 65 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f  e. pagerSharedLo
1dd90 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
1dda0 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61 62  if .  ** a datab
1ddb0 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ase lock is alre
1ddc0 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20  ady held..  */. 
1ddd0 20 72 63 20 3d 20 70 61 67 65 72 53 68 61 72 65   rc = pagerShare
1dde0 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  dLock(pPager);. 
1ddf0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1de00 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1de10 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
1de20 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1de30 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
1de40 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72  ;..  pPg = pager
1de50 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
1de60 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
1de70 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
1de80 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
1de90 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70   is not in the p
1dea0 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
1deb0 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20    int nMax;.    
1dec0 69 6e 74 20 68 3b 0a 20 20 20 20 50 41 47 45 52  int h;.    PAGER
1ded0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d  _INCR(pPager->nM
1dee0 69 73 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  iss);.    rc = p
1def0 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65  agerAllocatePage
1df00 28 70 50 61 67 65 72 2c 20 26 70 50 67 29 3b 0a  (pPager, &pPg);.
1df10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1df20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1df30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1df40 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d  .    pPg->pgno =
1df50 20 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72   pgno;.    asser
1df60 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70 67 6e  t( !MEMDB || pgn
1df70 6f 3e 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  o>pPager->stmtSi
1df80 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ze );.    if( pP
1df90 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1dfa0 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70   && (int)pgno<=p
1dfb0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1dfc0 65 20 29 7b 0a 23 69 66 20 30 0a 20 20 20 20 20  e ){.#if 0.     
1dfd0 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d   sqlite3CheckMem
1dfe0 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ory(pPager->aInJ
1dff0 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b  ournal, pgno/8);
1e000 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 73  .#endif.      as
1e010 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1e020 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20  urnalOpen );.   
1e030 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
1e040 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e  l = (pPager->aIn
1e050 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20  Journal[pgno/8] 
1e060 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29  & (1<<(pgno&7)))
1e070 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  !=0;.      pPg->
1e080 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
1e090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1e0a0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
1e0b0 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
1e0c0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
1e0d0 7d 0a 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  }..    makeClean
1e0e0 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e  (pPg);.    pPg->
1e0f0 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45  nRef = 1;.    RE
1e100 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 20  FINFO(pPg);..   
1e110 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b   pPager->nRef++;
1e120 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1e130 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20  >nExtra>0 ){.   
1e140 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
1e150 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50  TO_EXTRA(pPg, pP
1e160 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72  ager), 0, pPager
1e170 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  ->nExtra);.    }
1e180 0a 20 20 20 20 6e 4d 61 78 20 3d 20 73 71 6c 69  .    nMax = sqli
1e190 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1e1a0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  t(pPager);.    i
1e1b0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1e1c0 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  de ){.      sqli
1e1d0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1e1e0 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  g);.      rc = p
1e1f0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1e200 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1e210 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50  .    }..    /* P
1e220 6f 70 75 6c 61 74 65 20 74 68 65 20 70 61 67 65  opulate the page
1e230 20 77 69 74 68 20 64 61 74 61 2c 20 65 69 74 68   with data, eith
1e240 65 72 20 62 79 20 72 65 61 64 69 6e 67 20 66 72  er by reading fr
1e250 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  om the database.
1e260 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20      ** file, or 
1e270 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 65  by setting the e
1e280 6e 74 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65  ntire page to ze
1e290 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ro..    */.    i
1e2a0 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e  f( nMax<(int)pgn
1e2b0 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 28 6e  o || MEMDB || (n
1e2c0 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61  oContent && !pPa
1e2d0 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
1e2e0 61 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 69 66  ack) ){.      if
1e2f0 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d  ( pgno>pPager->m
1e300 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  xPgno ){.       
1e310 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1e320 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ef(pPg);.       
1e330 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1e340 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ULL;.      }.   
1e350 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
1e360 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c  TO_DATA(pPg), 0,
1e370 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1e380 65 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  e);.      pPg->n
1e390 65 65 64 52 65 61 64 20 3d 20 6e 6f 43 6f 6e 74  eedRead = noCont
1e3a0 65 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ent && !pPager->
1e3b0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 0a  alwaysRollback;.
1e3c0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1e3d0 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70  ZERO %p %d\n", p
1e3e0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
1e3f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e400 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
1e410 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 67 6e  pPager, pPg, pgn
1e420 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
1e430 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
1e440 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
1e450 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1e460 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20        pPg->pgno 
1e470 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
1e480 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1e490 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  Pg);.        ret
1e4a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1e4b0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52        pPg->needR
1e4c0 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  ead = 0;.    }..
1e4d0 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20      /* Link the 
1e4e0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
1e4f0 67 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  ge hash table */
1e500 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f 20 26 20  .    h = pgno & 
1e510 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
1e520 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1e530 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  gno!=0 );.    pP
1e540 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
1e550 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b  Pager->aHash[h];
1e560 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
1e570 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20  sh[h] = pPg;.   
1e580 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48   if( pPg->pNextH
1e590 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ash ){.      ass
1e5a0 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48  ert( pPg->pNextH
1e5b0 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  ash->pPrevHash==
1e5c0 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  0 );.      pPg->
1e5d0 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
1e5e0 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20  Hash = pPg;.    
1e5f0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1e600 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
1e610 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
1e620 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1e630 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  pPg);.#endif.  }
1e640 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
1e650 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
1e660 69 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  is in the page c
1e670 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  ache. */.    ass
1e680 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 52 65 66  ert(pPager->nRef
1e690 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29 3b 0a  >0 || pgno==1);.
1e6a0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
1e6b0 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20  Pager->nHit);.  
1e6c0 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65 6e 74    if( !noContent
1e6d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1e6e0 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74  ager_get_content
1e6f0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  (pPg);.      if(
1e700 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
1e710 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1e720 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  }.    }.    page
1e730 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20  _ref(pPg);.  }. 
1e740 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a   *ppPage = pPg;.
1e750 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e760 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  OK;.}.int sqlite
1e770 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20  3PagerAcquire(. 
1e780 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
1e790 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
1e7a0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
1e7b0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1e7c0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
1e7d0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
1e7e0 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
1e7f0 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
1e800 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
1e810 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1e820 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
1e830 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
1e840 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74     /* Do not bot
1e850 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74  her reading cont
1e860 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66  ent from disk if
1e870 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
1e880 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74  t rc;.  pagerEnt
1e890 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63  er(pPager);.  rc
1e8a0 20 3d 20 70 61 67 65 72 41 63 71 75 69 72 65 28   = pagerAcquire(
1e8b0 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 70  pPager, pgno, pp
1e8c0 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
1e8d0 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
1e8e0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
1e8f0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41   rc;.}.../*.** A
1e900 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
1e910 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
1e920 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
1e930 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
1e940 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
1e950 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
1e960 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1e970 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
1e980 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
1e990 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a   not in cache..*
1e9a0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
1e9b0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e  lite3PagerGet().
1e9c0 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65    The difference
1e9d0 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
1e9e0 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c  utine.** and sql
1e9f0 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69  ite3PagerGet() i
1ea00 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
1ea10 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
1ea20 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
1ea30 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
1ea40 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
1ea50 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
1ea60 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
1ea70 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
1ea80 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
1ea90 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
1eaa0 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
1eab0 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
1eac0 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65  pened..*/.DbPage
1ead0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f   *sqlite3PagerLo
1eae0 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
1eaf0 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
1eb00 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30    PgHdr *pPg = 0
1eb10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1eb20 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
1eb30 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a  rt( pgno!=0 );..
1eb40 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
1eb50 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
1eb60 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
1eb70 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  _UNLOCK ){.    a
1eb80 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
1eb90 70 41 6c 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e  pAll || pPager->
1eba0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b  exclusiveMode );
1ebb0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
1ebc0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
1ebd0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
1ebe0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
1ebf0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
1ec00 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  g */.  }else if(
1ec10 20 28 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f   (pPg = pager_lo
1ec20 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
1ec30 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 61  o))!=0 ){.    pa
1ec40 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d  ge_ref(pPg);.  }
1ec50 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
1ec60 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
1ec70 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  pPg;.}../*.** Re
1ec80 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a  lease a page..**
1ec90 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
1eca0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
1ecb0 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70  to the page drop
1ecc0 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
1ecd0 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64  he.** page is ad
1ece0 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c  ded to the LRU l
1ecf0 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72  ist.  When all r
1ed00 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c  eferences to all
1ed10 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65   pages.** are re
1ed20 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61  leased, a rollba
1ed30 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ck occurs and th
1ed40 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
1ed50 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d  tabase is.** rem
1ed60 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oved..*/.int sql
1ed70 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44  ite3PagerUnref(D
1ed80 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 0a 20 20  bPage *pPg){..  
1ed90 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
1eda0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
1edb0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20   for this page. 
1edc0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1edd0 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  g->nRef>0 );.  p
1ede0 61 67 65 72 45 6e 74 65 72 28 70 50 67 2d 3e 70  agerEnter(pPg->p
1edf0 50 61 67 65 72 29 3b 0a 20 20 70 50 67 2d 3e 6e  Pager);.  pPg->n
1ee00 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f  Ref--;.  REFINFO
1ee10 28 70 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f  (pPg);..  CHECK_
1ee20 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
1ee30 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   When the number
1ee40 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
1ee50 6f 20 61 20 70 61 67 65 20 72 65 61 63 68 20 30  o a page reach 0
1ee60 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20  , call the.  ** 
1ee70 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61  destructor and a
1ee80 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  dd the page to t
1ee90 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a  he freelist..  *
1eea0 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  /.  if( pPg->nRe
1eeb0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65  f==0 ){.    Page
1eec0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1eed0 3e 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 6c 72  >pPager;..    lr
1eee0 75 4c 69 73 74 41 64 64 28 70 50 67 29 3b 0a 20  uListAdd(pPg);. 
1eef0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
1ef00 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
1ef10 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73      pPager->xDes
1ef20 74 72 75 63 74 6f 72 28 70 50 67 2c 20 70 50 61  tructor(pPg, pPa
1ef30 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1ef40 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
1ef50 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72  When all pages r
1ef60 65 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73  each the freelis
1ef70 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64  t, drop the read
1ef80 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a   lock from.    *
1ef90 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
1efa0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
1efb0 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a  pPager->nRef--;.
1efc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1efd0 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20  er->nRef>=0 );. 
1efe0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
1eff0 52 65 66 3d 3d 30 20 26 26 20 28 21 70 50 61 67  Ref==0 && (!pPag
1f000 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
1f010 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e || pPager->jou
1f020 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20  rnalOff>0) ){.  
1f030 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
1f040 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
1f050 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
1f060 70 61 67 65 72 4c 65 61 76 65 28 70 50 67 2d 3e  pagerLeave(pPg->
1f070 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
1f080 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1f090 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a  /*.** Create a j
1f0a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
1f0b0 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73  pPager.  There s
1f0c0 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
1f0d0 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f   a RESERVED.** o
1f0e0 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
1f0f0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1f100 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
1f110 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1f120 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
1f130 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
1f140 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e  rything.  Return
1f150 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
1f160 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a  nd release the.*
1f170 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20  * write lock if 
1f180 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
1f190 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
1f1a0 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
1f1b0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
1f1c0 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ger){.  sqlite3_
1f1d0 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
1f1e0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
1f1f0 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
1f200 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
1f210 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
1f220 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  SIVE|SQLITE_OPEN
1f230 5f 43 52 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74  _CREATE);..  int
1f240 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21   rc;.  assert( !
1f250 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
1f260 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1f270 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
1f280 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1f290 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1f2a0 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
1f2b0 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
1f2c0 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
1f2d0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
1f2e0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  rnal==0 );.  sql
1f2f0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1f300 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61  nt(pPager);.  pa
1f310 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
1f320 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ;.  pPager->aInJ
1f330 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
1f340 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 50 61 67  MallocZero( pPag
1f350 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31  er->dbSize/8 + 1
1f360 20 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72   );.  pagerEnter
1f370 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
1f380 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1f390 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  al==0 ){.    rc 
1f3a0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1f3b0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
1f3c0 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
1f3d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
1f3e0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
1f3f0 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51      flags |= (SQ
1f400 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
1f410 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f  ONCLOSE|SQLITE_O
1f420 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
1f430 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1f440 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45  flags |= (SQLITE
1f450 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
1f460 41 4c 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  AL);.  }.#ifdef 
1f470 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
1f480 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 72 63 20  OMIC_WRITE.  rc 
1f490 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
1f4a0 4f 70 65 6e 28 0a 20 20 20 20 20 20 70 56 66 73  Open(.      pVfs
1f4b0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
1f4c0 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
1f4d0 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66   flags, jrnlBuff
1f4e0 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20  erSize(pPager). 
1f4f0 20 29 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d   );.#else.  rc =
1f500 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
1f510 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
1f520 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
1f530 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23  fd, flags, 0);.#
1f540 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
1f550 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1f560 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d   pPager->jfd->pM
1f570 65 74 68 6f 64 73 20 29 3b 0a 20 20 70 50 61 67  ethods );.  pPag
1f580 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1f590 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
1f5a0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
1f5b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1f5c0 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21  r = 0;.  if( rc!
1f5d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f5e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f5f0 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
1f600 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
1f610 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
1f620 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
1f630 7d 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  }.    goto faile
1f640 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
1f650 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  l;.  }.  pPager-
1f660 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
1f670 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
1f680 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
1f690 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
1f6a0 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
1f6b0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1f6c0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
1f6d0 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20  nRec = 0;.  if( 
1f6e0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1f6f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
1f700 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
1f710 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
1f720 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
1f730 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  }.  pPager->orig
1f740 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
1f750 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d  >dbSize;..  rc =
1f760 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
1f770 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
1f780 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
1f790 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c  oopen && rc==SQL
1f7a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1f7b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1f7c0 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72 29  tmtBegin(pPager)
1f7d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
1f7e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
1f7f0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
1f800 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1f810 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
1f820 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
1f830 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f840 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1f850 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
1f860 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1f870 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  ..failed_to_open
1f880 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69  _journal:.  sqli
1f890 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
1f8a0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >aInJournal);.  
1f8b0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1f8c0 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  al = 0;.  return
1f8d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63   rc;.}../*.** Ac
1f8e0 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
1f8f0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1f900 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73  se.  The lock is
1f910 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a   removed when.**
1f920 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20   the any of the 
1f930 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e  following happen
1f940 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  :.**.**   *  sql
1f950 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1f960 68 61 73 65 54 77 6f 28 29 20 69 73 20 63 61 6c  haseTwo() is cal
1f970 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
1f980 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1f990 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  k() is called..*
1f9a0 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61  *   *  sqlite3Pa
1f9b0 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20 63 61  gerClose() is ca
1f9c0 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
1f9d0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1f9e0 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  ) is called to o
1f9f0 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64  n every outstand
1fa00 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ing page..**.** 
1fa10 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65  The first parame
1fa20 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ter to this rout
1fa30 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ine is a pointer
1fa40 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67   to any open pag
1fa50 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
1fa60 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68  base file.  Noth
1fa70 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75  ing changes abou
1fa80 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20  t the page - it 
1fa90 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74  is used merely t
1faa0 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70  o.** acquire a p
1fab0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
1fac0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
1fad0 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20  d as proof that 
1fae0 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65  there is.** alre
1faf0 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
1fb00 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
1fb10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
1fb20 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  d parameter indi
1fb30 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73  cates how much s
1fb40 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f  pace in bytes to
1fb50 20 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a   reserve for a.*
1fb60 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
1fb70 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68   file-name at th
1fb80 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
1fb90 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69  ournal when it i
1fba0 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s created..**.**
1fbb0 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   A journal file 
1fbc0 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69  is opened if thi
1fbd0 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  s is not a tempo
1fbe0 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20  rary file.  For 
1fbf0 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c  temporary.** fil
1fc00 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20  es, the opening 
1fc10 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1fc20 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20  ile is deferred 
1fc30 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61  until there is a
1fc40 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64  n.** actual need
1fc50 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
1fc60 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
1fc70 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1fc80 69 73 20 61 6c 72 65 61 64 79 20 72 65 73 65 72  is already reser
1fc90 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c  ved for writing,
1fca0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1fcb0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
1fcc0 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75  If exFlag is tru
1fcd0 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  e, go ahead and 
1fce0 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  get an EXCLUSIVE
1fcf0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
1fd00 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  e.** immediately
1fd10 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74   instead of wait
1fd20 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79  ing until we try
1fd30 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61   to flush the ca
1fd40 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46  che.  The.** exF
1fd50 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69  lag is ignored i
1fd60 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
1fd70 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  is already activ
1fd80 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1fd90 33 50 61 67 65 72 42 65 67 69 6e 28 44 62 50 61  3PagerBegin(DbPa
1fda0 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46  ge *pPg, int exF
1fdb0 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  lag){.  Pager *p
1fdc0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1fdd0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
1fde0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 61 67  SQLITE_OK;.  pag
1fdf0 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
1fe00 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
1fe10 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65  nRef>0 );.  asse
1fe20 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1fe30 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
1fe40 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1fe50 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
1fe60 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ARED ){.    asse
1fe70 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
1fe80 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
1fe90 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1fea0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1feb0 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
1fec0 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65  IVE;.      pPage
1fed0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
1fee0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1fef0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ff00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
1ff10 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
1ff20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
1ff30 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1ff40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ff50 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
1ff60 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45   = PAGER_RESERVE
1ff70 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  D;.        if( e
1ff80 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  xFlag ){.       
1ff90 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
1ffa0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
1ffb0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
1ffc0 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  K);.        }.  
1ffd0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1ffe0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1fff0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 4c 65  .        pagerLe
20000 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
20010 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
20030 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
20040 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47 45   = 0;.      PAGE
20050 52 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43  RTRACE2("TRANSAC
20060 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  TION %d\n", PAGE
20070 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
20080 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
20090 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70  useJournal && !p
200a0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
200b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
200c0 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
200d0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
200e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
200f0 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
20100 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
20110 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
20120 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
20130 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74  s happens when t
20140 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
20150 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
20160 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20 20 2a   mode last.    *
20170 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f  * time a (read o
20180 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63  r write) transac
20190 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73  tion was success
201a0 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a  fully concluded.
201b0 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63      ** by this c
201c0 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65  onnection. Inste
201d0 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74  ad of deleting t
201e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
201f0 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b  it was .    ** k
20200 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 74 72 75  ept open and tru
20210 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74 65  ncated to 0 byte
20220 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
20230 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52  sert( pPager->nR
20240 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ec==0 );.    ass
20250 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69  ert( pPager->ori
20260 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  gDbSize==0 );.  
20270 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20280 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
20290 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
202a0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
202b0 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 4c  ger);.    pagerL
202c0 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
202d0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
202e0 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61  rnal = sqlite3Ma
202f0 6c 6c 6f 63 5a 65 72 6f 28 20 70 50 61 67 65 72  llocZero( pPager
20300 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
20310 3b 0a 20 20 20 20 70 61 67 65 72 45 6e 74 65 72  ;.    pagerEnter
20320 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
20330 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ( !pPager->aInJo
20340 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
20350 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
20360 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20370 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44     pPager->origD
20380 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
20390 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63  dbSize;.      rc
203a0 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
203b0 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
203c0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
203d0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
203e0 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Open || pPager->
203f0 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20  journalOff>0 || 
20400 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
20410 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
20420 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
20430 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  rc;.}../*.** Mak
20440 65 20 61 20 70 61 67 65 20 64 69 72 74 79 2e 20  e a page dirty. 
20450 20 53 65 74 20 69 74 73 20 64 69 72 74 79 20 66   Set its dirty f
20460 6c 61 67 20 61 6e 64 20 61 64 64 20 69 74 20 74  lag and add it t
20470 6f 20 74 68 65 20 64 69 72 74 79 0a 2a 2a 20 70  o the dirty.** p
20480 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  age list..*/.sta
20490 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 44 69 72  tic void makeDir
204a0 74 79 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ty(PgHdr *pPg){.
204b0 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
204c0 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ==0 ){.    Pager
204d0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
204e0 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d  pPager;.    pPg-
204f0 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20  >dirty = 1;.    
20500 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  pPg->pDirty = pP
20510 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20 20  ager->pDirty;.  
20520 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 44    if( pPager->pD
20530 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50  irty ){.      pP
20540 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 50  ager->pDirty->pP
20550 72 65 76 44 69 72 74 79 20 3d 20 70 50 67 3b 0a  revDirty = pPg;.
20560 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70      }.    pPg->p
20570 50 72 65 76 44 69 72 74 79 20 3d 20 30 3b 0a 20  PrevDirty = 0;. 
20580 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
20590 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a  y = pPg;.  }.}..
205a0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67  /*.** Make a pag
205b0 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20  e clean.  Clear 
205c0 69 74 73 20 64 69 72 74 79 20 62 69 74 20 61 6e  its dirty bit an
205d0 64 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  d remove it from
205e0 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61   the.** dirty pa
205f0 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ge list..*/.stat
20600 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61  ic void makeClea
20610 6e 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  n(PgHdr *pPg){. 
20620 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
20630 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74  ){.    pPg->dirt
20640 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  y = 0;.    if( p
20650 50 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20  Pg->pDirty ){.  
20660 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
20670 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69  >pDirty->pPrevDi
20680 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  rty==pPg );.    
20690 20 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70    pPg->pDirty->p
206a0 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67 2d  PrevDirty = pPg-
206b0 3e 70 50 72 65 76 44 69 72 74 79 3b 0a 20 20 20  >pPrevDirty;.   
206c0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
206d0 70 50 72 65 76 44 69 72 74 79 20 29 7b 0a 20 20  pPrevDirty ){.  
206e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
206f0 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69  >pPrevDirty->pDi
20700 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  rty==pPg );.    
20710 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74    pPg->pPrevDirt
20720 79 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d  y->pDirty = pPg-
20730 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c  >pDirty;.    }el
20740 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
20750 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  ( pPg->pPager->p
20760 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20  Dirty==pPg );.  
20770 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
20780 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70  >pDirty = pPg->p
20790 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  Dirty;.    }.  }
207a0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  .}.../*.** Mark 
207b0 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
207c0 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70  riteable.  The p
207d0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
207e0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
207f0 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74  .** if it is not
20800 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20   there already. 
20810 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
20820 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
20830 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68  ore making.** ch
20840 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e  anges to a page.
20850 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
20860 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
20870 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
20880 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20  e pager creates 
20890 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  a new.** journal
208a0 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
208b0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
208c0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
208d0 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a  If the RESERVED.
208e0 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  ** lock could no
208f0 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74  t be acquired, t
20900 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
20910 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  rns SQLITE_BUSY.
20920 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
20930 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68   routine must ch
20940 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74  eck for that ret
20950 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65  urn value and be
20960 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a   careful not to.
20970 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  ** change any pa
20980 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68  ge data until th
20990 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
209a0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
209b0 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
209c0 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f  al file could no
209d0 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63  t be written bec
209e0 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73  ause the disk is
209f0 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74   full,.** then t
20a00 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
20a10 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rns SQLITE_FULL 
20a20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65  and does an imme
20a30 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  diate rollback..
20a40 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  ** All subsequen
20a50 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73  t write attempts
20a60 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c   also return SQL
20a70 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74  ITE_FULL until t
20a80 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c  here.** is a cal
20a90 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
20aa0 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c  rCommit() or sql
20ab0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
20ac0 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e  k() to.** reset.
20ad0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
20ae0 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72  ager_write(PgHdr
20af0 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a   *pPg){.  void *
20b00 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f  pData = PGHDR_TO
20b10 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 50 61  _DATA(pPg);.  Pa
20b20 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
20b30 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
20b40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20b50 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
20b60 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69   errors.  */.  i
20b70 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
20b80 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  de ){ .    retur
20b90 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
20ba0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
20bb0 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  ger->readOnly ){
20bc0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
20bd0 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20  TE_PERM;.  }..  
20be0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
20bf0 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20  >setMaster );.. 
20c00 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
20c10 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
20c20 70 61 67 65 20 77 61 73 20 70 72 65 76 69 6f 75  page was previou
20c30 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74  sly acquired wit
20c40 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20  h noContent==1, 
20c50 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  that means.  ** 
20c60 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c 6c 79  we didn't really
20c70 20 72 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6e   read in the con
20c80 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
20c90 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  .  This can happ
20ca0 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78 61  en.  ** (for exa
20cb0 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65 20 70  mple) when the p
20cc0 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 76  age is being mov
20cd0 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
20ce0 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f  st.  But.  ** no
20cf0 77 20 77 65 20 61 72 65 20 28 70 65 72 68 61 70  w we are (perhap
20d00 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61  s) moving the pa
20d10 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20 66 72  ge off of the fr
20d20 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20  eelist for.  ** 
20d30 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e 65 65  reuse and we nee
20d40 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72  d to know its or
20d50 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73  iginal content s
20d60 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20  o that content. 
20d70 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f 72 65   ** can be store
20d80 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  d in the rollbac
20d90 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64  k journal.  So d
20da0 6f 20 74 68 65 20 72 65 61 64 20 61 74 20 74 68  o the read at th
20db0 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20  is.  ** time..  
20dc0 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
20dd0 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29  get_content(pPg)
20de0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
20df0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
20e00 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
20e10 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
20e20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
20e30 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
20e40 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
20e50 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
20e60 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
20e70 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d  t away..  */.  m
20e80 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
20e90 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72   if( pPg->inJour
20ea0 6e 61 6c 20 26 26 20 28 70 61 67 65 49 6e 53 74  nal && (pageInSt
20eb0 61 74 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c 20  atement(pPg) || 
20ec0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
20ed0 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61  e==0) ){.    pPa
20ee0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
20ef0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20  = 1;.  }else{.. 
20f00 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20     /* If we get 
20f10 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
20f20 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
20f30 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
20f40 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74   ** written to t
20f50 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
20f60 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b  ournal or the ck
20f70 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
20f80 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e  .    ** or both.
20f90 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
20fa0 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
20fb0 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  e that the trans
20fc0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65  action journal e
20fd0 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a  xists and.    **
20fe0 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74   create it if it
20ff0 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a   does not..    *
21000 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
21010 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
21020 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20  ER_UNLOCK );.   
21030 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
21040 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b  erBegin(pPg, 0);
21050 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
21060 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21070 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
21080 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
21090 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
210a0 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
210b0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
210c0 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
210d0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
210e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
210f0 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
21100 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
21110 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21120 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
21130 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
21140 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
21150 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72  lOpen || !pPager
21160 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
21170 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
21180 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20  yCache = 1;.  . 
21190 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61     /* The transa
211a0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
211b0 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
211c0 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20  have a RESERVED 
211d0 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  or an.    ** EXC
211e0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
211f0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
21200 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
21210 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
21220 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61  o.    ** the tra
21230 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
21240 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
21250 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
21260 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67   */.    if( !pPg
21270 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
21280 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
21290 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a  al || MEMDB) ){.
212a0 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70        if( (int)p
212b0 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
212c0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
212d0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  {.        int sz
212e0 50 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  Pg;.        if( 
212f0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
21300 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
21310 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
21320 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
21330 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  ;.          PAGE
21340 52 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c  RTRACE3("JOURNAL
21350 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
21360 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
21370 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
21380 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
21390 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29  Hist->pOrig==0 )
213a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73  ;.          pHis
213b0 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74  t->pOrig = sqlit
213c0 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65  e3_malloc( pPage
213d0 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  r->pageSize );. 
213e0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69           if( pHi
213f0 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20  st->pOrig ){.   
21400 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
21410 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47  pHist->pOrig, PG
21420 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
21430 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
21440 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ze);.          }
21450 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
21460 20 20 20 20 20 20 20 20 20 20 75 33 32 20 63 6b            u32 ck
21470 73 75 6d 2c 20 73 61 76 65 64 3b 0a 20 20 20 20  sum, saved;.    
21480 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
21490 61 32 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20  a2, *pEnd;..    
214a0 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
214b0 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
214c0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
214d0 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
214e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
214f0 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
21500 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
21510 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
21520 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20   verifies.      
21530 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
21540 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20  o not. */.      
21550 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
21560 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
21570 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
21580 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32            pData2
21590 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
215a0 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
215b0 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20  no, 7);.        
215c0 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f    cksum = pager_
215d0 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
215e0 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20  8*)pData2);.    
215f0 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 44 61        pEnd = pDa
21600 74 61 32 20 2b 20 70 50 61 67 65 72 2d 3e 70 61  ta2 + pPager->pa
21610 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  geSize;.        
21620 20 20 70 44 61 74 61 32 20 2d 3d 20 34 3b 0a 20    pData2 -= 4;. 
21630 20 20 20 20 20 20 20 20 20 73 61 76 65 64 20 3d           saved =
21640 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b 0a 20 20   *(u32*)pEnd;.  
21650 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
21660 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a  s(pEnd, cksum);.
21670 20 20 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d            szPg =
21680 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
21690 65 2b 38 3b 0a 20 20 20 20 20 20 20 20 20 20 70  e+8;.          p
216a0 75 74 33 32 62 69 74 73 28 70 44 61 74 61 32 2c  ut32bits(pData2,
216b0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
216c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
216d0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
216e0 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  r->jfd, pData2, 
216f0 73 7a 50 67 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  szPg, pPager->jo
21700 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 20  urnalOff);.     
21710 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
21720 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25  OUT %p %d %lld %
21730 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
21740 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  g->pgno,.       
21750 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
21760 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
21770 73 7a 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20  szPg));.        
21780 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
21790 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
217a0 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  j_count);.      
217b0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
217c0 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a  nalOff += szPg;.
217d0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
217e0 52 41 43 45 35 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE5("JOURNAL %
217f0 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
21800 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29  nc=%d hash(%08x)
21810 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
21820 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
21830 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
21840 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70  pPg->needSync, p
21850 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
21860 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  g));.          *
21870 28 75 33 32 2a 29 70 45 6e 64 20 3d 20 73 61 76  (u32*)pEnd = sav
21880 65 64 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  ed;..          /
21890 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  * An error has o
218a0 63 63 75 72 65 64 20 77 72 69 74 69 6e 67 20 74  ccured writing t
218b0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
218c0 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20  le. The .       
218d0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
218e0 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64  n will be rolled
218f0 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79   back by the lay
21900 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  er above..      
21910 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
21920 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21930 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
21940 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
21950 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
21960 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
21970 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ++;.          as
21980 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
21990 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
219a0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
219b0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d  >aInJournal[pPg-
219c0 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
219d0 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
219e0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65          pPg->nee
219f0 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
21a00 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20  >noSync;.       
21a10 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
21a20 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
21a30 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
21a40 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e  aInStmt[pPg->pgn
21a50 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
21a60 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
21a70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
21a80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21a90 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
21aa0 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f  nc = !pPager->jo
21ab0 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20  urnalStarted && 
21ac0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
21ad0 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
21ae0 41 43 45 34 28 22 41 50 50 45 4e 44 20 25 64 20  ACE4("APPEND %d 
21af0 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
21b00 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
21b10 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
21b20 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
21b30 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
21b40 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
21b50 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
21b60 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ync ){.        p
21b70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
21b80 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
21b90 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
21ba0 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a  l = 1;.    }.  .
21bb0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
21bc0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
21bd0 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
21be0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69  page is not in i
21bf0 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77  t,.    ** then w
21c00 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
21c10 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61   page to the sta
21c20 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
21c30 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a   Note that.    *
21c40 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
21c50 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64  journal format d
21c60 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20  iffers from the 
21c70 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c  standard journal
21c80 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69   format.    ** i
21c90 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20  n that it omits 
21ca0 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e  the checksums an
21cb0 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20  d the header..  
21cc0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
21cd0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a  ger->stmtInUse .
21ce0 20 20 20 20 20 26 26 20 21 70 61 67 65 49 6e 53       && !pageInS
21cf0 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a 20  tatement(pPg) . 
21d00 20 20 20 20 26 26 20 28 69 6e 74 29 70 50 67 2d      && (int)pPg-
21d10 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  >pgno<=pPager->s
21d20 74 6d 74 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a  tmtSize .    ){.
21d30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
21d40 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  g->inJournal || 
21d50 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70  (int)pPg->pgno>p
21d60 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
21d70 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d  e );.      if( M
21d80 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
21d90 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
21da0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
21db0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
21dc0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
21dd0 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29  Hist->pStmt==0 )
21de0 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d  ;.        pHist-
21df0 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33  >pStmt = sqlite3
21e00 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  _malloc( pPager-
21e10 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
21e20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
21e30 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
21e40 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d     memcpy(pHist-
21e50 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f  >pStmt, PGHDR_TO
21e60 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
21e70 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
21e80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21e90 20 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54   PAGERTRACE3("ST
21ea0 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
21eb0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
21ec0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
21ed0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  pgno);.        p
21ee0 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
21ef0 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20  list(pPg);.     
21f00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21f10 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61  i64 offset = pPa
21f20 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2a 28 34  ger->stmtNRec*(4
21f30 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
21f40 65 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  e);.        char
21f50 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43   *pData2 = CODEC
21f60 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
21f70 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34   pPg->pgno, 7)-4
21f80 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62  ;.        put32b
21f90 69 74 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d  its(pData2, pPg-
21fa0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
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 2b 34 2c 20 6f 66  ->pageSize+4, of
21ff0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 50  fset);.        P
22000 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54  AGERTRACE3("STMT
22010 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
22020 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
22030 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
22040 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
22050 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22060 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
22070 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
22080 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
22090 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20  >stmtNRec++;.   
220a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
220b0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20  ger->aInStmt!=0 
220c0 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
220d0 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
220e0 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
220f0 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
22100 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
22110 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
22120 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
22130 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
22140 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
22150 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
22160 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50  ARED );.  if( pP
22170 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e  ager->dbSize<(in
22180 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  t)pPg->pgno ){. 
22190 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
221a0 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
221b0 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26     if( !MEMDB &&
221c0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
221d0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50  =PENDING_BYTE/pP
221e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
221f0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
22200 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a  dbSize++;.    }.
22210 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
22220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
22230 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
22240 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70  to mark a data-p
22250 61 67 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e  age as writable.
22260 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67   It uses .** pag
22270 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70  er_write() to op
22280 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  en a journal fil
22290 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e (if it is not 
222a0 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a  already open).**
222b0 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 70   and write the p
222c0 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68  age *pData to th
222d0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
222e0 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
222f0 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
22300 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f  ction and pager_
22310 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20  write() is that 
22320 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
22330 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68   also deals with
22340 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
22350 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72  e where 2 or mor
22360 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f  e pages.** fit o
22370 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  n a single disk 
22380 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  sector. In this 
22390 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69  case all co-resi
223a0 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75  dent pages.** mu
223b0 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  st have been wri
223c0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
223d0 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
223e0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e  returning..*/.in
223f0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
22400 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
22410 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
22420 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
22430 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
22440 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
22450 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
22460 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  er;.  Pgno nPage
22470 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61  PerSector = (pPa
22480 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f  ger->sectorSize/
22490 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
224a0 29 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72  );..  pagerEnter
224b0 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
224c0 21 4d 45 4d 44 42 20 26 26 20 6e 50 61 67 65 50  !MEMDB && nPageP
224d0 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20  erSector>1 ){.  
224e0 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e    Pgno nPageCoun
224f0 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
22500 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
22510 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
22520 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e   file */.    Pgn
22530 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20  o pg1;          
22540 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
22550 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
22560 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
22570 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  d on. */.    int
22580 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
22590 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
225a0 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69   of pages starti
225b0 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75  ng at pg1 to jou
225c0 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rnal */.    int 
225d0 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64  ii;.    int need
225e0 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Sync = 0;..    /
225f0 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53  * Set the doNotS
22600 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54  ync flag to 1. T
22610 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77  his is because w
22620 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61  e cannot allow a
22630 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
22640 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69  header to be wri
22650 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65  tten between the
22660 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64   pages journaled
22670 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
22680 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
22690 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
226a0 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  NotSync==0 );.  
226b0 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
226c0 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a  ync = 1;..    /*
226d0 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75   This trick assu
226e0 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68  mes that both th
226f0 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
22700 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a  sector-size are.
22710 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
22720 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74  r power of 2. It
22730 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70   sets variable p
22740 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69  g1 to the identi
22750 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  fier.    ** of t
22760 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
22770 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
22780 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20  is located on.. 
22790 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20     */.    pg1 = 
227a0 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
227b0 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
227c0 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20  r-1)) + 1;..    
227d0 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 73 71 6c  nPageCount = sql
227e0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
227f0 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  nt(pPager);.    
22800 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50  if( pPg->pgno>nP
22810 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
22820 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e    nPage = (pPg->
22830 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20  pgno - pg1)+1;. 
22840 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67     }else if( (pg
22850 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  1+nPagePerSector
22860 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  -1)>nPageCount )
22870 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
22880 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31  nPageCount+1-pg1
22890 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
228a0 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
228b0 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d  PerSector;.    }
228c0 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67  .    assert(nPag
228d0 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e>0);.    assert
228e0 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29  (pg1<=pPg->pgno)
228f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67  ;.    assert((pg
22900 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67  1+nPage)>pPg->pg
22910 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69  no);..    for(ii
22920 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20  =0; ii<nPage && 
22930 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
22940 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  i++){.      Pgno
22950 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20   pg = pg1+ii;.  
22960 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
22970 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
22980 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
22990 7c 7c 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f  || pg==pPg->pgno
229a0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70   || .          p
229b0 67 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  g>pPager->origDb
229c0 53 69 7a 65 20 7c 7c 20 21 28 70 50 61 67 65 72  Size || !(pPager
229d0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 2f  ->aInJournal[pg/
229e0 38 5d 26 28 31 3c 3c 28 70 67 26 37 29 29 29 0a  8]&(1<<(pg&7))).
229f0 20 20 20 20 20 20 29 20 7b 0a 20 20 20 20 20 20        ) {.      
22a00 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f    if( pg!=PAGER_
22a10 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
22a20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
22a30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
22a40 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70  t(pPager, pg, &p
22a50 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
22a60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22a70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
22a80 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
22a90 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
22aa0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
22ab0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
22ac0 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64              need
22ad0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
22ae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22af0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
22b00 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
22b10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22b20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
22b30 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67  if( (pPage = pag
22b40 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
22b50 2c 20 70 67 29 29 20 29 7b 0a 20 20 20 20 20 20  , pg)) ){.      
22b60 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 65 65    if( pPage->nee
22b70 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  dSync ){.       
22b80 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
22b90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22ba0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
22bb0 20 49 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65   If the PgHdr.ne
22bc0 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73  edSync flag is s
22bd0 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68  et for any of th
22be0 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20  e nPage pages . 
22bf0 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
22c00 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e  t pg1, then it n
22c10 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66  eeds to be set f
22c20 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20  or all of them. 
22c30 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77  Because.    ** w
22c40 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66  riting to any of
22c50 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67   these nPage pag
22c60 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68  es may damage th
22c70 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20  e others, the.  
22c80 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
22c90 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73  e must contain s
22ca0 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f  ync()ed copies o
22cb0 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20  f all of them.  
22cc0 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20    ** before any 
22cd0 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77  of them can be w
22ce0 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
22cf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
22d00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
22d10 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
22d20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
22d30 50 61 67 65 20 26 26 20 6e 65 65 64 53 79 6e 63  Page && needSync
22d40 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
22d50 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20   PgHdr *pPage = 
22d60 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
22d70 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20  ger, pg1+ii);.  
22d80 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
22d90 29 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e  ) pPage->needSyn
22da0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
22db0 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
22dc0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  er->needSync);. 
22dd0 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
22de0 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
22df0 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50  ync==1 );.    pP
22e00 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20  ager->doNotSync 
22e10 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
22e20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
22e30 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  te(pDbPage);.  }
22e40 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
22e50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
22e60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
22e70 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
22e80 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68  page given in th
22e90 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70  e argument was p
22ea0 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64  reviously passed
22eb0 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
22ec0 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20  gerWrite().  In 
22ed0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
22ee0 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
22ef0 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
22f00 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
22f10 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   the page..*/.#i
22f20 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74  fndef NDEBUG.int
22f30 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
22f40 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20  riteable(DbPage 
22f50 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
22f60 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65  pPg->dirty;.}.#e
22f70 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
22f80 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
22f90 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74  ./*.** Replace t
22fa0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
22fb0 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68  single page with
22fc0 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
22fd0 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a   in the third.**
22fe0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
22ff0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 76  t sqlite3PagerOv
23000 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70  erwrite(Pager *p
23010 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
23020 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  , void *pData){.
23030 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
23040 69 6e 74 20 72 63 3b 0a 0a 20 20 70 61 67 65 72  int rc;..  pager
23050 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
23060 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
23070 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67  erGet(pPager, pg
23080 6e 6f 2c 20 26 70 50 67 29 3b 0a 20 20 69 66 28  no, &pPg);.  if(
23090 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
230a0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
230b0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
230c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
230d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
230e0 20 20 6d 65 6d 63 70 79 28 73 71 6c 69 74 65 33    memcpy(sqlite3
230f0 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 67  PagerGetData(pPg
23100 29 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  ), pData, pPager
23110 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
23120 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61   }.    sqlite3Pa
23130 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
23140 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28   }.  pagerLeave(
23150 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
23160 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
23170 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
23180 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
23190 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
231a0 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  t it is not nece
231b0 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74  ssary to.** writ
231c0 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  e the informatio
231d0 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61  n on page pPg ba
231e0 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20  ck to the disk, 
231f0 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74  even though.** t
23200 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62  hat page might b
23210 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
23220 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65  y..**.** The ove
23230 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20  rlying software 
23240 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73  layer calls this
23250 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c   routine when al
23260 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a  l of the data.**
23270 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
23280 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54  ge is unused.  T
23290 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74  he pager marks t
232a0 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
232b0 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64   so.** that it d
232c0 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74  oes not get writ
232d0 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ten to disk..**.
232e0 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68  ** Tests show th
232f0 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  at this optimiza
23300 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77  tion, together w
23310 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ith the.** sqlit
23320 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
23330 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72  ack() below, mor
23340 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68  e than double th
23350 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61  e speed.** of la
23360 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61  rge INSERT opera
23370 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75  tions and quadru
23380 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66  ple the speed of
23390 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a   large DELETEs..
233a0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
233b0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
233c0 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79  d, set the alway
233d0 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74  sRollback flag t
233e0 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65  o true..** Subse
233f0 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
23400 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
23410 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68  ollback() for th
23420 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77  e same page.** w
23430 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20 62  ill thereafter b
23440 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73  e ignored.  This
23450 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
23460 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d   avoid a problem
23470 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67 65  .** where a page
23480 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61 64   with data is ad
23490 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
234a0 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70  ist during one p
234b0 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e  art of.** a tran
234c0 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d  saction then rem
234d0 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  oved from the fr
234e0 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20  eelist during a 
234f0 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66  later part.** of
23500 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61   the same transa
23510 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64  ction and reused
23520 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
23530 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69  purpose.  When i
23540 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64  t.** is first ad
23550 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
23560 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ist, this routin
23570 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68  e is called.  Wh
23580 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68  en reused,.** th
23590 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  e sqlite3PagerDo
235a0 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75  ntRollback() rou
235b0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
235c0 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
235d0 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  .** page contain
235e0 73 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c  s critical data,
235f0 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
23600 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74  o be sure it get
23610 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  s.** rolled back
23620 20 69 6e 20 73 70 69 74 65 20 6f 66 20 74 68 65   in spite of the
23630 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
23640 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c  tRollback() call
23650 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23660 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
23670 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29  DbPage *pDbPage)
23680 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
23690 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
236a0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
236b0 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20  >pPager;..  if( 
236c0 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a  MEMDB ) return;.
236d0 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
236e0 67 65 72 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77  ger);.  pPg->alw
236f0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  aysRollback = 1;
23700 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
23710 79 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74  y && !pPager->st
23720 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61  mtInUse ){.    a
23730 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
23740 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
23750 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ED );.    if( pP
23760 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69  ager->dbSize==(i
23770 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20  nt)pPg->pgno && 
23780 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
23790 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze<pPager->dbSiz
237a0 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
237b0 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74   this pages is t
237c0 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
237d0 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  the file and the
237e0 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a   file has grown.
237f0 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20        ** during 
23800 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
23810 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f  saction, then do
23820 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61   NOT mark the pa
23830 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20  ge as clean..   
23840 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64     ** When the d
23850 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f  atabase file gro
23860 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65  ws, we must make
23870 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c   sure that the l
23880 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ast page.      *
23890 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61  * gets written a
238a0 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20  t least once so 
238b0 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69  that the disk fi
238c0 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63  le will be the c
238d0 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  orrect.      ** 
238e0 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20  size. If you do 
238f0 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70  not write this p
23900 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65  age and the size
23910 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20   of the file.   
23920 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73     ** on the dis
23930 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20  k ends up being 
23940 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20  too small, that 
23950 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
23960 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  base.      ** co
23970 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20  rruption during 
23980 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63  the next transac
23990 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
239a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
239b0 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e  PAGERTRACE3("DON
239c0 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20  T_WRITE page %d 
239d0 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  of %d\n", pPg->p
239e0 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
239f0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  ger));.      IOT
23a00 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20  RACE(("CLEAN %p 
23a10 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
23a20 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20  Pg->pgno)).     
23a30 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
23a40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
23a50 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20  HECK_PAGES.     
23a60 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
23a70 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
23a80 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
23a90 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65   }.  }.  pagerLe
23aa0 61 76 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  ave(pPager);.}..
23ab0 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
23ac0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
23ad0 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
23ae0 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20  t if a rollback 
23af0 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73  occurs,.** it is
23b00 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
23b10 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
23b20 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ta on the given 
23b30 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  page.  This.** m
23b40 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
23b50 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ger does not hav
23b60 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  e to record the 
23b70 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68  given page in th
23b80 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  e.** rollback jo
23b90 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
23ba0 77 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  we have not yet 
23bb0 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74 68  actually read th
23bc0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69  e content of thi
23bd0 73 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74 68  s page (if.** th
23be0 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64  e PgHdr.needRead
23bf0 20 66 6c 61 67 20 69 73 20 73 65 74 29 20 74 68   flag is set) th
23c00 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
23c10 61 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69 73  acts as a promis
23c20 65 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c  e.** that we wil
23c30 6c 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20  l never need to 
23c40 72 65 61 64 20 74 68 65 20 70 61 67 65 20 63 6f  read the page co
23c50 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75 74  ntent in the fut
23c60 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e  ure..** so the n
23c70 65 65 64 52 65 61 64 20 66 6c 61 67 20 63 61 6e  eedRead flag can
23c80 20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 74   be cleared at t
23c90 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f  his point..*/.vo
23ca0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  id sqlite3PagerD
23cb0 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61  ontRollback(DbPa
23cc0 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  ge *pPg){.  Page
23cd0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
23ce0 3e 70 50 61 67 65 72 3b 0a 0a 20 20 70 61 67 65  >pPager;..  page
23cf0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
23d00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
23d10 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
23d20 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28  ESERVED );.  if(
23d30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
23d40 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  Open==0 ) return
23d50 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77  ;.  if( pPg->alw
23d60 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70  aysRollback || p
23d70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
23d80 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29  lback || MEMDB )
23d90 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21   return;.  if( !
23da0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
23db0 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
23dc0 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
23dd0 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73  DbSize ){.    as
23de0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
23df0 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
23e00 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
23e10 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f  urnal[pPg->pgno/
23e20 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
23e30 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d  gno&7);.    pPg-
23e40 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
23e50 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61      pPg->needRea
23e60 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  d = 0;.    if( p
23e70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
23e80 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
23e90 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
23ea0 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
23eb0 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
23ec0 7d 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  }.    PAGERTRACE
23ed0 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b  3("DONT_ROLLBACK
23ee0 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
23ef0 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
23f00 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
23f10 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 47 41      IOTRACE(("GA
23f20 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c 20  RBAGE %p %d\n", 
23f30 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
23f40 6f 29 29 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  o)).  }.  if( pP
23f50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
23f60 0a 20 20 20 26 26 20 21 70 61 67 65 49 6e 53 74  .   && !pageInSt
23f70 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a 20 20  atement(pPg) .  
23f80 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
23f90 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
23fa0 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 61  Size .  ){.    a
23fb0 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
23fc0 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50  urnal || (int)pP
23fd0 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
23fe0 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
23ff0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24000 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a  ->aInStmt!=0 );.
24010 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
24020 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
24030 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
24040 6f 26 37 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  o&7);.  }.  page
24050 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
24060 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
24070 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
24080 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   to increment th
24090 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
240a0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a  change-counter,.
240b0 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79 74  ** stored at byt
240c0 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65  e 24 of the page
240d0 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  r file..*/.stati
240e0 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72  c int pager_incr
240f0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
24100 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
24110 74 20 69 73 44 69 72 65 63 74 29 7b 0a 20 20 50  t isDirect){.  P
24120 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20  gHdr *pPgHdr;.  
24130 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
24140 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
24150 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
24160 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65   !pPager->change
24170 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20 20 20  CountDone ){.   
24180 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20   /* Open page 1 
24190 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  of the file for 
241a0 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  writing. */.    
241b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
241c0 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20  rGet(pPager, 1, 
241d0 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66  &pPgHdr);.    if
241e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
241f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
24200 20 20 69 66 28 20 21 69 73 44 69 72 65 63 74 20    if( !isDirect 
24210 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
24220 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
24230 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 69  pPgHdr);.      i
24240 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24250 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
24260 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72    }..    /* Incr
24270 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
24280 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
24290 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
242a0 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63  yte 24. */.    c
242b0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20  hange_counter = 
242c0 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
242d0 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46  (u8*)pPager->dbF
242e0 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 63 68  ileVers);.    ch
242f0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ange_counter++;.
24300 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28      put32bits(((
24310 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44  char*)PGHDR_TO_D
24320 41 54 41 28 70 50 67 48 64 72 29 29 2b 32 34 2c  ATA(pPgHdr))+24,
24330 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
24340 3b 0a 0a 20 20 20 20 69 66 28 20 69 73 44 69 72  ;..    if( isDir
24350 65 63 74 20 26 26 20 70 50 61 67 65 72 2d 3e 66  ect && pPager->f
24360 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
24370 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20       const void 
24380 2a 7a 42 75 66 20 3d 20 50 47 48 44 52 5f 54 4f  *zBuf = PGHDR_TO
24390 5f 44 41 54 41 28 70 50 67 48 64 72 29 3b 0a 20  _DATA(pPgHdr);. 
243a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
243b0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
243c0 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65  >fd, zBuf, pPage
243d0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b  r->pageSize, 0);
243e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
243f0 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20  elease the page 
24400 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20  reference. */.  
24410 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
24420 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20  ref(pPgHdr);.   
24430 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
24440 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20  ountDone = 1;.  
24450 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
24460 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
24470 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
24480 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61  or the pager pPa
24490 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  ger. zMaster poi
244a0 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a  nts to the name.
244b0 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ** of a master j
244c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
244d0 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
244e0 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69  en into the indi
244f0 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61  vidual.** journa
24500 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20  l file. zMaster 
24510 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69  may be NULL, whi
24520 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  ch is interprete
24530 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  d as no master.*
24540 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e  * journal (a sin
24550 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
24560 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
24570 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
24580 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a  sures that the j
24590 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
245a0 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  , all dirty page
245b0 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  s written.** to 
245c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
245d0 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
245e0 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
245f0 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74  The only thing t
24600 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74  hat.** remains t
24610 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
24620 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64  nsaction is to d
24630 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
24640 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61  l file (or.** ma
24650 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
24660 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e  e if specified).
24670 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
24680 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c   if zMaster==NUL
24690 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  L, this does not
246a0 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65   overwrite a pre
246b0 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70  vious value.** p
246c0 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69  assed to an sqli
246d0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
246e0 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a  aseOne() call..*
246f0 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
24700 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d  r nTrunc is non-
24710 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
24720 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72 75  ager file is tru
24730 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72  ncated to.** nTr
24740 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73 20  unc pages (this 
24750 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d  is used by auto-
24760 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73  vacuum databases
24770 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
24780 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
24790 65 4f 6e 65 28 50 61 67 65 72 20 2a 70 50 61 67  eOne(Pager *pPag
247a0 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
247b0 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54  zMaster, Pgno nT
247c0 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20  runc){.  int rc 
247d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
247e0 50 41 47 45 52 54 52 41 43 45 34 28 22 44 41 54  PAGERTRACE4("DAT
247f0 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65  ABASE SYNC: File
24800 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e  =%s zMaster=%s n
24810 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20  Trunc=%d\n", .  
24820 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c      pPager->zFil
24830 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20  ename, zMaster, 
24840 6e 54 72 75 6e 63 29 3b 0a 20 20 70 61 67 65 72  nTrunc);.  pager
24850 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 0a  Enter(pPager);..
24860 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
24870 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c  an in-memory db,
24880 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76   or no pages hav
24890 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
248a0 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20  o, or this.  ** 
248b0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  function has alr
248c0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
248d0 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
248e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
248f0 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
24900 5f 53 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44  _SYNCED && !MEMD
24910 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72  B && pPager->dir
24920 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50  tyCache ){.    P
24930 67 48 64 72 20 2a 70 50 67 3b 0a 0a 23 69 66 64  gHdr *pPg;..#ifd
24940 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
24950 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
24960 20 20 2f 2a 20 54 68 65 20 61 74 6f 6d 69 63 2d    /* The atomic-
24970 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
24980 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  on can be used i
24990 66 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 20  f all of the.   
249a0 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72   ** following ar
249b0 65 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a 0a 20  e true:.    **. 
249c0 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 66     **    + The f
249d0 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f  ile-system suppo
249e0 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  rts the atomic-w
249f0 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f  rite property fo
24a00 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c  r.    **      bl
24a10 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67  ocks of size pag
24a20 65 2d 73 69 7a 65 2c 20 61 6e 64 0a 20 20 20 20  e-size, and.    
24a30 2a 2a 20 20 20 20 2b 20 54 68 69 73 20 63 6f 6d  **    + This com
24a40 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20  mit is not part 
24a50 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
24a60 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64  transaction, and
24a70 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 45 78 61  .    **    + Exa
24a80 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61  ctly one page ha
24a90 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  s been modified 
24aa0 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65  and store in the
24ab0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
24ac0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
24ad0 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
24ae0 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20 74 68   can be used, th
24af0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
24b00 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 0a 20  ile will never. 
24b10 20 20 20 2a 2a 20 62 65 20 63 72 65 61 74 65 64     ** be created
24b20 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61   for this transa
24b30 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ction..    */.  
24b40 20 20 69 6e 74 20 75 73 65 41 74 6f 6d 69 63 57    int useAtomicW
24b50 72 69 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20  rite = (.       
24b60 20 21 7a 4d 61 73 74 65 72 20 26 26 20 0a 20 20   !zMaster && .  
24b70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
24b80 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75  urnalOff==jrnlBu
24b90 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
24ba0 20 26 26 20 0a 20 20 20 20 20 20 20 20 6e 54 72   && .        nTr
24bb0 75 6e 63 3d 3d 30 20 26 26 20 0a 20 20 20 20 20  unc==0 && .     
24bc0 20 20 20 28 30 3d 3d 70 50 61 67 65 72 2d 3e 70     (0==pPager->p
24bd0 44 69 72 74 79 20 7c 7c 20 30 3d 3d 70 50 61 67  Dirty || 0==pPag
24be0 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 44 69 72  er->pDirty->pDir
24bf0 74 79 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ty).    );.    i
24c00 66 28 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74  f( useAtomicWrit
24c10 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70  e ){.      /* Up
24c20 64 61 74 65 20 74 68 65 20 6e 52 65 63 20 66 69  date the nRec fi
24c30 65 6c 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eld in the journ
24c40 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
24c50 20 20 69 6e 74 20 6f 66 66 73 65 74 20 3d 20 70    int offset = p
24c60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
24c70 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
24c80 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20  nalMagic);.     
24c90 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
24ca0 6e 52 65 63 3d 3d 31 29 3b 0a 20 20 20 20 20 20  nRec==1);.      
24cb0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
24cc0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6f 66  (pPager->jfd, of
24cd0 66 73 65 74 2c 20 70 50 61 67 65 72 2d 3e 6e 52  fset, pPager->nR
24ce0 65 63 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55  ec);..      /* U
24cf0 70 64 61 74 65 20 74 68 65 20 64 62 20 66 69 6c  pdate the db fil
24d00 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
24d10 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
24d20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79  call will modify
24d30 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  .      ** the in
24d40 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
24d50 74 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  tation of page 1
24d60 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
24d70 75 70 64 61 74 65 64 0a 20 20 20 20 20 20 2a 2a  updated.      **
24d80 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
24d90 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 70  and then write p
24da0 61 67 65 20 31 20 64 69 72 65 63 74 6c 79 20 74  age 1 directly t
24db0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  o the database. 
24dc0 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 42 65       ** file. Be
24dd0 63 61 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f  cause of the ato
24de0 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72  mic-write proper
24df0 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66  ty of the host f
24e00 69 6c 65 2d 73 79 73 74 65 6d 2c 20 0a 20 20 20  ile-system, .   
24e10 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 73 61     ** this is sa
24e20 66 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  fe..      */.   
24e30 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
24e40 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
24e50 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
24e60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
24e70 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
24e80 6c 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  lCreate(pPager->
24e90 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  jfd);.      if( 
24ea0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
24eb0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
24ec0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
24ed0 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 29  useAtomicWrite )
24ee0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
24ef0 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
24f00 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61  nal file name ha
24f10 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
24f20 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20  ritten to the.  
24f30 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
24f40 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20  e, then no sync 
24f50 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  is required. Thi
24f60 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69  s happens when i
24f70 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74  t is.    ** writ
24f80 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72  ten, then the pr
24f90 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75  ocess fails to u
24fa0 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
24fb0 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20  SERVED to an.   
24fc0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
24fd0 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d  ck. The next tim
24fe0 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72  e the process tr
24ff0 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ies to commit th
25000 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
25010 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d  tion the m-j nam
25020 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  e will have alre
25030 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
25040 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
25050 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
25060 74 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ter ){.      ass
25070 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
25080 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
25090 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
250a0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
250b0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
250c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
250d0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
250e0 65 78 69 74 3b 0a 23 69 66 6e 64 65 66 20 53 51  exit;.#ifndef SQ
250f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
25100 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 6e  CUUM.      if( n
25110 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
25120 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74      /* If this t
25130 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d  ransaction has m
25140 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ade the database
25150 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61   smaller, then a
25160 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20 20  ll pages.       
25170 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72   ** being discar
25180 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63  ded by the trunc
25190 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72  ation must be wr
251a0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
251b0 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
251c0 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
251d0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b  .        Pgno i;
251e0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 6b  .        int iSk
251f0 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47  ip = PAGER_MJ_PG
25200 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  NO(pPager);.    
25210 20 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e      for( i=nTrun
25220 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e  c+1; i<=pPager->
25230 6f 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20  origDbSize; i++ 
25240 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
25250 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f   !(pPager->aInJo
25260 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20 28 31 3c  urnal[i/8] & (1<
25270 3c 28 69 26 37 29 29 29 20 26 26 20 69 21 3d 69  <(i&7))) && i!=i
25280 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Skip ){.        
25290 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
252a0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
252b0 20 69 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20   i, &pPg);.     
252c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
252d0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
252e0 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
252f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
25300 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
25310 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
25320 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
25330 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  f(pPg);.        
25340 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25350 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
25360 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  c_exit;.        
25370 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a 20    }.        } . 
25380 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
25390 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61      rc = writeMa
253a0 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
253b0 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
253c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
253d0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
253e0 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72 63  c_exit;.      rc
253f0 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
25400 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
25410 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25420 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
25430 65 78 69 74 3b 0a 0a 23 69 66 6e 64 65 66 20 53  exit;..#ifndef S
25440 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
25450 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54  ACUUM.    if( nT
25460 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  runc!=0 ){.     
25470 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
25480 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  erTruncate(pPage
25490 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20  r, nTrunc);.    
254a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
254b0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
254c0 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  exit;.    }.#end
254d0 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  if..    /* Write
254e0 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
254f0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
25500 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67   file */.    pPg
25510 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c   = pager_get_all
25520 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61  _dirty_pages(pPa
25530 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  ger);.    rc = p
25540 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
25550 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ist(pPg);.    if
25560 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25570 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
25580 70 50 67 20 26 26 20 21 70 50 67 2d 3e 64 69 72  pPg && !pPg->dir
25590 74 79 20 29 7b 20 70 50 67 20 3d 20 70 50 67 2d  ty ){ pPg = pPg-
255a0 3e 70 44 69 72 74 79 3b 20 7d 0a 20 20 20 20 20  >pDirty; }.     
255b0 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
255c0 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 67 6f 74  = pPg;.      got
255d0 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
255e0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
255f0 44 69 72 74 79 20 3d 20 30 3b 0a 0a 20 20 20 20  Dirty = 0;..    
25600 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  /* Sync the data
25610 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
25620 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
25630 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
25640 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
25650 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  c(pPager->fd, pP
25660 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
25670 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54  );.    }.    IOT
25680 52 41 43 45 28 28 22 44 42 53 59 4e 43 20 25 70  RACE(("DBSYNC %p
25690 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20  \n", pPager)).. 
256a0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
256b0 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b   = PAGER_SYNCED;
256c0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d 45 4d  .  }else if( MEM
256d0 44 42 20 26 26 20 6e 54 72 75 6e 63 21 3d 30 20  DB && nTrunc!=0 
256e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
256f0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
25700 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29  (pPager, nTrunc)
25710 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74  ;.  }..sync_exit
25720 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
25730 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
25740 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72   ){.    /* pager
25750 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
25760 74 65 72 28 29 20 6d 61 79 20 61 74 74 65 6d 70  ter() may attemp
25770 74 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 65  t to obtain an e
25780 78 63 6c 75 73 69 76 65 0a 20 20 20 20 20 2a 20  xclusive.     * 
25790 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20 74 68  lock to spill th
257a0 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 74 75  e cache and retu
257b0 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  rn IOERR_BLOCKED
257c0 2e 20 42 75 74 20 73 69 6e 63 65 20 0a 20 20 20  . But since .   
257d0 20 20 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20    * there is no 
257e0 63 68 61 6e 63 65 20 74 68 65 20 63 61 63 68 65  chance the cache
257f0 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   is inconsistent
25800 2c 20 69 74 27 73 0a 20 20 20 20 20 2a 20 62 65  , it's.     * be
25810 74 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 53  tter to return S
25820 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20  QLITE_BUSY..    
25830 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
25840 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20  ITE_BUSY;.  }.  
25850 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
25860 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
25870 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  .}.../*.** Commi
25880 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f  t all changes to
25890 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
258a0 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  d release the wr
258b0 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ite lock..**.** 
258c0 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61  If the commit fa
258d0 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
258e0 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61  on, a rollback a
258f0 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a  ttempt is made.*
25900 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
25910 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
25920 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
25930 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f  worked, SQLITE_O
25940 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
25950 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25960 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
25970 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65  Two(Pager *pPage
25980 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
25990 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69  PgHdr *pPg;..  i
259a0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
259b0 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
259c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
259d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
259e0 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
259f0 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
25a00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
25a10 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  ROR;.  }.  pager
25a20 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
25a30 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4f   PAGERTRACE2("CO
25a40 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
25a50 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
25a60 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
25a70 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
25a80 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
25a90 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68  (pPager);.    wh
25aa0 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20  ile( pPg ){.    
25ab0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
25ac0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
25ad0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
25ae0 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
25af0 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20  ory(pHist);.    
25b00 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
25b10 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
25b20 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
25b30 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20    pHist->inStmt 
25b40 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
25b50 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
25b60 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76      pHist->pPrev
25b70 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e  Stmt = pHist->pN
25b80 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
25b90 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44     pPg = pPg->pD
25ba0 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irty;.    }.    
25bb0 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
25bc0 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   0;.#ifndef NDEB
25bd0 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  UG.    for(pPg=p
25be0 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
25bf0 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
25c00 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69  All){.      PgHi
25c10 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
25c20 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
25c30 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
25c40 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61   assert( !pPg->a
25c50 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b  lwaysRollback );
25c60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
25c70 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a  pHist->pOrig );.
25c80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
25c90 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  Hist->pStmt );. 
25ca0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
25cb0 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
25cc0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
25cd0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
25ce0 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
25cf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
25d00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25d10 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
25d20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
25d30 63 68 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  che );.  assert(
25d40 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
25d50 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20  PAGER_SYNCED || 
25d60 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
25d70 63 68 65 20 29 3b 0a 20 20 72 63 20 3d 20 70 61  che );.  rc = pa
25d80 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
25d90 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ion(pPager);.  r
25da0 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
25db0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 70  pPager, rc);.  p
25dc0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
25dd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
25de0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
25df0 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20  k all changes.  
25e00 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c  The database fal
25e10 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ls back to PAGER
25e20 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a  _SHARED mode..**
25e30 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   All in-memory c
25e40 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72  ache pages rever
25e50 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69  t to their origi
25e60 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74  nal data content
25e70 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  s..** The journa
25e80 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  l is deleted..**
25e90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
25ea0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c   cannot fail unl
25eb0 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ess some other p
25ec0 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f  rocess is not fo
25ed0 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63  llowing.** the c
25ee0 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70  orrect locking p
25ef0 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73  rotocol or unles
25f00 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  s some other.** 
25f10 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
25f20 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68  ng trash into th
25f30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
25f40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20  SQLITE_CORRUPT) 
25f50 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70  or.** unless a p
25f60 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61  rior malloc() fa
25f70 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d  iled (SQLITE_NOM
25f80 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74  EM).  Appropriat
25f90 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73  e error.** codes
25fa0 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f   are returned fo
25fb0 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61  r all these occa
25fc0 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73  sions.  Otherwis
25fd0 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  e,.** SQLITE_OK 
25fe0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
25ff0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
26000 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
26010 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
26020 63 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  c;.  PAGERTRACE2
26030 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  ("ROLLBACK %d\n"
26040 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
26050 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
26060 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
26070 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65  .    for(p=pPage
26080 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d  r->pAll; p; p=p-
26090 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
260a0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
260b0 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
260c0 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ( !p->alwaysRoll
260d0 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66  back );.      if
260e0 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20  ( !p->dirty ){. 
260f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
26100 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47  ((PgHistory *)PG
26110 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
26120 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29  Pager))->pOrig )
26130 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
26140 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a  ( !((PgHistory *
26150 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  )PGHDR_TO_HIST(p
26160 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d  , pPager))->pStm
26170 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  t );.        con
26180 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  tinue;.      }..
26190 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47        pHist = PG
261a0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
261b0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
261c0 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29  ( pHist->pOrig )
261d0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
261e0 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
261f0 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  ), pHist->pOrig,
26200 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
26210 65 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  e);.        PAGE
26220 52 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43  RTRACE3("ROLLBAC
26230 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c  K-PAGE %d of %d\
26240 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
26250 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
26260 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26270 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
26280 22 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61  "PAGE %d is clea
26290 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70  n on %d\n", p->p
262a0 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
262b0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ger));.      }. 
262c0 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
262d0 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20  y(pHist);.      
262e0 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  p->dirty = 0;.  
262f0 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c      p->inJournal
26300 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
26310 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
26320 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65       pHist->pPre
26330 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70  vStmt = pHist->p
26340 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
26350 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
26360 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
26370 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
26380 69 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65 72  initer(p, pPager
26390 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
263a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
263b0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
263c0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
263d0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  Stmt = 0;.    pP
263e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
263f0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
26400 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75  e;.    pager_tru
26410 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
26420 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
26430 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
26440 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
26450 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
26460 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
26470 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
26480 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
26490 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
264a0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20  ->dirtyCache || 
264b0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
264c0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
264d0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
264e0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
264f0 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
26500 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
26510 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
26520 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
26530 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
26540 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
26550 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  L ){.    if( pPa
26560 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
26570 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
26580 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62       pager_playb
26590 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
265a0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 4c      }.    pagerL
265b0 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
265c0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
265d0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
265e0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
265f0 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
26600 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  D ){.    int rc2
26610 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
26620 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
26630 2c 20 30 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  , 0);.    rc2 = 
26640 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
26650 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
26660 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26670 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
26680 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20   = rc2;.    }.  
26690 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
266a0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
266b0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  Pager, 0);.  }. 
266c0 20 2f 2a 20 70 61 67 65 72 5f 72 65 73 65 74 28   /* pager_reset(
266d0 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 70 50  pPager); */.  pP
266e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
266f0 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  1;..  /* If an e
26700 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
26710 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77  ng a ROLLBACK, w
26720 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
26730 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72 0a  trust the pager.
26740 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63    ** cache. So c
26750 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28  all pager_error(
26760 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74  ) on the way out
26770 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72   to make any err
26780 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74  or .  ** persist
26790 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ent..  */.  rc =
267a0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
267b0 67 65 72 2c 20 72 63 29 3b 0a 20 20 70 61 67 65  ger, rc);.  page
267c0 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
267d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
267e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
267f0 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
26800 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
26810 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
26820 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
26830 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
26840 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
26850 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
26860 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
26870 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65  nly(Pager *pPage
26880 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
26890 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d  ger->readOnly;.}
268a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
268b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
268c0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
268d0 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
268e0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
268f0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
26900 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
26910 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64  r->nRef;.}..#ifd
26920 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
26930 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26940 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
26950 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
26960 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  is only..*/.int 
26970 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61  *sqlite3PagerSta
26980 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
26990 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
269a0 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20  a[11];.  a[0] = 
269b0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20  pPager->nRef;.  
269c0 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[1] = pPager->n
269d0 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70  Page;.  a[2] = p
269e0 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20  Pager->mxPage;. 
269f0 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
26a00 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d  dbSize;.  a[4] =
26a10 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a   pPager->state;.
26a20 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d    a[5] = pPager-
26a30 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d  >errCode;.  a[6]
26a40 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b   = pPager->nHit;
26a50 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72  .  a[7] = pPager
26a60 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20  ->nMiss;.  a[8] 
26a70 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f  = 0;  /* Used to
26a80 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66   be pPager->nOvf
26a90 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50  l */.  a[9] = pP
26aa0 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61  ager->nRead;.  a
26ab0 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  [10] = pPager->n
26ac0 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20  Write;.  return 
26ad0 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  a;.}.#endif../*.
26ae0 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65  ** Set the state
26af0 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f  ment rollback po
26b00 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  int..**.** This 
26b10 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62  routine should b
26b20 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  e called with th
26b30 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
26b40 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a  urnal already.**
26b50 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74   open.  A new st
26b60 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
26b70 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20  is created that 
26b80 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72  can be used to r
26b90 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67  ollback.** chang
26ba0 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53  es of a single S
26bb0 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69  QL command withi
26bc0 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73  n a larger trans
26bd0 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
26be0 63 20 69 6e 74 20 70 61 67 65 72 53 74 6d 74 42  c int pagerStmtB
26bf0 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
26c00 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
26c10 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
26c20 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20  ->stmtInUse );. 
26c30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
26c40 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
26c50 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ARED );.  assert
26c60 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
26c70 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52  >=0 );.  PAGERTR
26c80 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e  ACE2("STMT-BEGIN
26c90 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
26ca0 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
26cb0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
26cc0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
26cd0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
26ce0 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
26cf0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72  r->dbSize;.    r
26d00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26d10 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
26d20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
26d30 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
26d40 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b  tmtAutoopen = 1;
26d50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
26d60 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
26d70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
26d80 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 61  rnalOpen );.  pa
26d90 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
26da0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  ;.  pPager->aInS
26db0 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  tmt = sqlite3Mal
26dc0 6c 6f 63 5a 65 72 6f 28 20 70 50 61 67 65 72 2d  locZero( pPager-
26dd0 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
26de0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
26df0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
26e00 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20  ger->aInStmt==0 
26e10 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  ){.    /* sqlite
26e20 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
26e30 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
26e40 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  ; */.    return 
26e50 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
26e60 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
26e70 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
26e80 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
26e90 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
26ea0 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66  stmtJSize);.  if
26eb0 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74  ( rc ) goto stmt
26ec0 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
26ed0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
26ee0 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50  >stmtJSize == pP
26ef0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
26f00 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61   );.#endif.  pPa
26f10 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
26f20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
26f30 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  Off;.  pPager->s
26f40 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  tmtSize = pPager
26f50 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67  ->dbSize;.  pPag
26f60 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d  er->stmtHdrOff =
26f70 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74   0;.  pPager->st
26f80 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  mtCksum = pPager
26f90 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69  ->cksumInit;.  i
26fa0 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  f( !pPager->stmt
26fb0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
26fc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
26fd0 6e 74 65 6d 70 28 70 50 61 67 65 72 2d 3e 70 56  ntemp(pPager->pV
26fe0 66 73 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64  fs, pPager->stfd
26ff0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
27000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27010 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53     SQLITE_OPEN_S
27020 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  UBJOURNAL);.    
27030 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74  if( rc ) goto st
27040 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b  mt_begin_failed;
27050 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
27060 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70  tOpen = 1;.    p
27070 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
27080 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
27090 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31  r->stmtInUse = 1
270a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
270b0 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67  E_OK;. .stmt_beg
270c0 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  in_failed:.  if(
270d0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
270e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
270f0 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e  free(pPager->aIn
27100 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65  Stmt);.    pPage
27110 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a  r->aInStmt = 0;.
27120 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
27130 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  .}.int sqlite3Pa
27140 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67  gerStmtBegin(Pag
27150 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
27160 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e  nt rc;.  pagerEn
27170 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ter(pPager);.  r
27180 63 20 3d 20 70 61 67 65 72 53 74 6d 74 42 65 67  c = pagerStmtBeg
27190 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61  in(pPager);.  pa
271a0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
271b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
271c0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
271d0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69   statement..*/.i
271e0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
271f0 74 6d 74 43 6f 6d 6d 69 74 28 50 61 67 65 72 20  tmtCommit(Pager 
27200 2a 70 50 61 67 65 72 29 7b 0a 20 20 70 61 67 65  *pPager){.  page
27210 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
27220 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
27230 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50  mtInUse ){.    P
27240 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
27250 74 3b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  t;.    PAGERTRAC
27260 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20  E2("STMT-COMMIT 
27270 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
27280 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28  Pager));.    if(
27290 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
272a0 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75   /* sqlite3OsTru
272b0 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 74  ncate(pPager->st
272c0 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20  fd, 0); */.     
272d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 20 70   sqlite3_free( p
272e0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29  Pager->aInStmt )
272f0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
27300 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  aInStmt = 0;.   
27310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
27320 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53  r(pPg=pPager->pS
27330 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  tmt; pPg; pPg=pN
27340 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ext){.        Pg
27350 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
27360 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
27370 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
27380 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 48 69       pNext = pHi
27390 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  st->pNextStmt;. 
273a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
273b0 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a  Hist->inStmt );.
273c0 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69          pHist->i
273d0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
273e0 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53     pHist->pPrevS
273f0 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65  tmt = pHist->pNe
27400 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
27410 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
27420 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
27430 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
27440 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
27450 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  }.    }.    pPag
27460 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
27470 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
27480 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
27490 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
274a0 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
274b0 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
274c0 20 30 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65   0;.  pagerLeave
274d0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
274e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
274f0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
27500 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
27510 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
27520 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67  StmtRollback(Pag
27530 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
27540 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e  nt rc;.  pagerEn
27550 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
27560 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
27570 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 41 47 45  nUse ){.    PAGE
27580 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f  RTRACE2("STMT-RO
27590 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
275a0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
275b0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
275c0 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
275d0 67 3b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  g;.      PgHisto
275e0 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20  ry *pHist;.     
275f0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
27600 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67  >pStmt; pPg; pPg
27610 3d 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d  =pHist->pNextStm
27620 74 29 7b 0a 20 20 20 20 20 20 20 20 70 48 69 73  t){.        pHis
27630 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
27640 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
27650 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
27660 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
27670 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
27680 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
27690 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70   pHist->pStmt, p
276a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
276b0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
276c0 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e  te3_free(pHist->
276d0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
276e0 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
276f0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
27700 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
27710 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
27720 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20  ger->stmtSize;. 
27730 20 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63       pager_trunc
27740 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72  ate_cache(pPager
27750 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
27760 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
27770 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
27780 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
27790 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
277a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
277b0 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61  erStmtCommit(pPa
277c0 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
277d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
277e0 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  K;.  }.  pPager-
277f0 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
27800 30 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  0;.  pagerLeave(
27810 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
27820 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
27830 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
27840 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
27850 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
27860 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
27870 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
27880 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
27890 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
278a0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  r->zFilename;.}.
278b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
278c0 65 20 56 46 53 20 73 74 72 75 63 74 75 72 65 20  e VFS structure 
278d0 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  for the pager..*
278e0 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  /.const sqlite3_
278f0 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67 65  vfs *sqlite3Page
27900 72 56 66 73 28 50 61 67 65 72 20 2a 70 50 61 67  rVfs(Pager *pPag
27910 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
27920 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f  ager->pVfs;.}../
27930 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
27940 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20  file handle for 
27950 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27960 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
27970 77 69 74 68 20 74 68 65 20 70 61 67 65 72 2e 20  with the pager. 
27980 20 54 68 69 73 20 6d 69 67 68 74 20 72 65 74 75   This might retu
27990 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66  rn NULL if the f
279a0 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79  ile has.** not y
279b0 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a  et been opened..
279c0 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  */.sqlite3_file 
279d0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c  *sqlite3PagerFil
279e0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
279f0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
27a00 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r->fd;.}../*.** 
27a10 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65 63  Return the direc
27a20 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74 61  tory of the data
27a30 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
27a40 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
27a50 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50 61  3PagerDirname(Pa
27a60 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
27a70 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
27a80 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a  Directory;.}../*
27a90 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
27aa0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
27ab0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27ac0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
27ad0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75  *sqlite3PagerJou
27ae0 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a  rnalname(Pager *
27af0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
27b00 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  n pPager->zJourn
27b10 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  al;.}../*.** Ret
27b20 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e  urn true if fsyn
27b30 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69  c() calls are di
27b40 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20  sabled for this 
27b50 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46  pager.  Return F
27b60 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63  ALSE.** if fsync
27b70 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64  ()s are executed
27b80 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e   normally..*/.in
27b90 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f  t sqlite3PagerNo
27ba0 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  sync(Pager *pPag
27bb0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
27bc0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a  ager->noSync;.}.
27bd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
27be0 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53  AS_CODEC./*.** S
27bf0 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72  et the codec for
27c00 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76   this pager.*/.v
27c10 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
27c20 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65  SetCodec(.  Page
27c30 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69  r *pPager,.  voi
27c40 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
27c50 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
27c60 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64  t),.  void *pCod
27c70 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65  ecArg.){.  pPage
27c80 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64  r->xCodec = xCod
27c90 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43  ec;.  pPager->pC
27ca0 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63  odecArg = pCodec
27cb0 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  Arg;.}.#endif..#
27cc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
27cd0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
27ce0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67  .** Move the pag
27cf0 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f  e pPg to locatio
27d00 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69  n pgno in the fi
27d10 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  le. .**.** There
27d20 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65   must be no refe
27d30 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
27d40 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f  ge previously lo
27d50 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f  cated at.** pgno
27d60 20 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20   (which we call 
27d70 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74  pPgOld) though t
27d80 68 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f  hat page is allo
27d90 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20  wed to be.** in 
27da0 63 61 63 68 65 2e 20 20 49 66 20 74 68 65 20 70  cache.  If the p
27db0 61 67 65 20 70 72 65 76 69 6f 75 73 20 6c 6f 63  age previous loc
27dc0 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20  ated at pgno is 
27dd0 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
27de0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
27df0 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f  ournal, it is no
27e00 74 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62  t put there by b
27e10 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  y this routine..
27e20 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73  **.** References
27e30 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67   to the page pPg
27e40 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55   remain valid. U
27e50 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d  pdating any.** m
27e60 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61  eta-data associa
27e70 74 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e  ted with pPg (i.
27e80 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  e. data stored i
27e90 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74  n the nExtra byt
27ea0 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  es.** allocated 
27eb0 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70  along with the p
27ec0 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70  age) is the resp
27ed0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
27ee0 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
27ef0 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  A transaction mu
27f00 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65  st be active whe
27f10 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
27f20 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65  s called. It use
27f30 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69  d to be.** requi
27f40 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65  red that a state
27f50 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
27f60 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c   was not active,
27f70 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69   but this restri
27f80 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
27f90 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54  n removed (CREAT
27fa0 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f  E INDEX needs to
27fb0 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65   move a page whe
27fc0 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  n a statement.**
27fd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
27fe0 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20  active)..*/.int 
27ff0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
28000 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  page(Pager *pPag
28010 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c  er, DbPage *pPg,
28020 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
28030 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20 2f  gHdr *pPgOld;  /
28040 2a 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67  * The page being
28050 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f   overwritten. */
28060 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f  .  int h;.  Pgno
28070 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
28080 30 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72  0;..  pagerEnter
28090 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
280a0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
280b0 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  );..  PAGERTRACE
280c0 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20  5("MOVE %d page 
280d0 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29  %d (needSync=%d)
280e0 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c   moves to %d\n",
280f0 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28   .      PAGERID(
28100 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
28110 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
28120 63 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54 52  c, pgno);.  IOTR
28130 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64  ACE(("MOVE %p %d
28140 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
28150 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29  pPg->pgno, pgno)
28160 29 0a 0a 20 20 70 61 67 65 72 5f 67 65 74 5f 63  )..  pager_get_c
28170 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69  ontent(pPg);.  i
28180 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
28190 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63   ){.    needSync
281a0 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Pgno = pPg->pgno
281b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
281c0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  g->inJournal || 
281d0 28 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65 72  (int)pgno>pPager
281e0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
281f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
28200 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73  >dirty );.    as
28210 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
28220 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20  edSync );.  }.. 
28230 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66   /* Unlink pPg f
28240 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68  rom it's hash-ch
28250 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48  ain */.  unlinkH
28260 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
28270 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20   pPg);..  /* If 
28280 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
28290 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70  ns a page with p
282a0 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c  age-number pgno,
282b0 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20   remove it.  ** 
282c0 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63  from it's hash c
282d0 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74  hain. Also, if t
282e0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
282f0 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20  c was set for . 
28300 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65   ** page pgno be
28310 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20  fore the 'move' 
28320 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65  operation, it ne
28330 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e  eds to be retain
28340 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ed .  ** for the
28350 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72   page moved ther
28360 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e  e..  */.  pPg->n
28370 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
28380 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f  PgOld = pager_lo
28390 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
283a0 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64  o);.  if( pPgOld
283b0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
283c0 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20  pPgOld->nRef==0 
283d0 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73  );.    unlinkHas
283e0 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
283f0 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65  PgOld);.    make
28400 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20  Clean(pPgOld);. 
28410 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
28420 20 3d 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53   = pPgOld->needS
28430 79 6e 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ync;.  }else{.  
28440 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
28450 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
28460 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
28470 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  l && (int)pgno<=
28480 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
28490 7a 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 69  ze ){.    pPg->i
284a0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 20 28 70 50 61  nJournal =  (pPa
284b0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
284c0 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
284d0 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 7d  gno&7)))!=0;.  }
284e0 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 2d 3e 69  else{.    pPg->i
284f0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
28500 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
28510 65 65 64 53 79 6e 63 3d 3d 30 20 7c 7c 20 28 69  eedSync==0 || (i
28520 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  nt)pgno>pPager->
28530 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
28540 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74  }..  /* Change t
28550 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
28560 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65 72  or pPg and inser
28570 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e 65  t it into the ne
28580 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f  w hash-chain. */
28590 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
285a0 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67 6e  =0 );.  pPg->pgn
285b0 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20  o = pgno;.  h = 
285c0 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
285d0 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69 66 28 20  nHash-1);.  if( 
285e0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
285f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
28600 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
28610 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
28620 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
28630 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
28640 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70  h = pPg;.  }.  p
28650 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
28660 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
28670 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73  ;.  pPager->aHas
28680 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50  h[h] = pPg;.  pP
28690 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
286a0 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70  ;..  makeDirty(p
286b0 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  Pg);.  pPager->d
286c0 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a  irtyCache = 1;..
286d0 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67    if( needSyncPg
286e0 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  no ){.    /* If 
286f0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20  needSyncPgno is 
28700 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
28710 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28720 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20  needs to be .   
28730 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66   ** sync()ed bef
28740 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
28750 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62  written to datab
28760 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65  ase file page ne
28770 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20  edSyncPgno..    
28780 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f  ** Currently, no
28790 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74   such page exist
287a0 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  s in the page-ca
287b0 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20  che and the .   
287c0 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75   ** Pager.aInJou
287d0 72 6e 61 6c 20 62 69 74 20 68 61 73 20 62 65 65  rnal bit has bee
287e0 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64  n set. This need
287f0 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64  s to be remedied
28800 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20   by loading.    
28810 2a 2a 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ** the page into
28820 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
28830 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65   and setting the
28840 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
28850 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  flag..    **.   
28860 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50   ** The sqlite3P
28870 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d  agerGet() call m
28880 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75  ay cause the jou
28890 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f  rnal to sync. So
288a0 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
288b0 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  e the Pager.need
288c0 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
288d0 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   too..    */.   
288e0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 50 67 48   int rc;.    PgH
288f0 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20  dr *pPgHdr;.    
28900 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
28910 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20  needSync );.    
28920 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
28930 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65  rGet(pPager, nee
28940 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48  dSyncPgno, &pPgH
28950 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
28960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
28970 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67  urn rc;.    pPag
28980 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
28990 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 6e 65  ;.    pPgHdr->ne
289a0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
289b0 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61  pPgHdr->inJourna
289c0 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44  l = 1;.    makeD
289d0 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20  irty(pPgHdr);.  
289e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
289f0 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
28a00 0a 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ..  pagerLeave(p
28a10 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
28a20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
28a30 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
28a40 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
28a50 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65  the data for the
28a60 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
28a70 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
28a80 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44 62  3PagerGetData(Db
28a90 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
28aa0 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41  turn PGHDR_TO_DA
28ab0 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  TA(pPg);.}../*.*
28ac0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
28ad0 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e  er to the Pager.
28ae0 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
28af0 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a  "extra" space .*
28b00 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
28b10 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  g with the speci
28b20 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
28b30 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
28b40 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65 20  GetExtra(DbPage 
28b50 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
28b60 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
28b70 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28  ager;.  return (
28b80 70 50 61 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f  pPager?PGHDR_TO_
28b90 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
28ba0 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r):0);.}../*.** 
28bb0 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b  Get/set the lock
28bc0 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69  ing-mode for thi
28bd0 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74  s pager. Paramet
28be0 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65  er eMode must be
28bf0 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52   one.** of PAGER
28c00 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
28c10 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  RY, PAGER_LOCKIN
28c20 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20  GMODE_NORMAL or 
28c30 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
28c40 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e  GMODE_EXCLUSIVE.
28c50 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
28c60 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c  r is not _QUERY,
28c70 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63   then.** the loc
28c80 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74  king-mode is set
28c90 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70   to the value sp
28ca0 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ecified..**.** T
28cb0 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
28cc0 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45  e is either PAGE
28cd0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
28ce0 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52  RMAL or.** PAGER
28cf0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
28d00 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69  LUSIVE, indicati
28d10 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28  ng the current (
28d20 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64  possibly updated
28d30 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64  ).** locking-mod
28d40 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
28d50 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
28d60 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
28d70 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61   int eMode){.  a
28d80 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41  ssert( eMode==PA
28d90 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
28da0 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20  QUERY.          
28db0 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
28dc0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
28dd0 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20  RMAL.           
28de0 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
28df0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
28e00 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
28e10 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
28e20 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b  GMODE_QUERY<0 );
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 4e 4f 52  _LOCKINGMODE_NOR
28e50 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f  MAL>=0 && PAGER_
28e60 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
28e70 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66  USIVE>=0 );.  if
28e80 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70  ( eMode>=0 && !p
28e90 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
28ea0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
28eb0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 65  xclusiveMode = e
28ec0 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Mode;.  }.  retu
28ed0 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e  rn (int)pPager->
28ee0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d  exclusiveMode;.}
28ef0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
28f00 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  DEBUG./*.** Prin
28f10 74 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61  t a listing of a
28f20 6c 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61  ll referenced pa
28f30 67 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65  ges and their re
28f40 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  f count..*/.void
28f50 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
28f60 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67  dump(Pager *pPag
28f70 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
28f80 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  g;.  for(pPg=pPa
28f90 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
28fa0 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
28fb0 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  l){.    if( pPg-
28fc0 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69  >nRef<=0 ) conti
28fd0 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nue;.    sqlite3
28fe0 44 65 62 75 67 50 72 69 6e 74 66 28 22 50 41 47  DebugPrintf("PAG
28ff0 45 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52  E %3d addr=%p nR
29000 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  ef=%d\n", .     
29010 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48    pPg->pgno, PGH
29020 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
29030 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d   pPg->nRef);.  }
29040 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69  .}.#endif..#endi
29050 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
29060 5f 44 49 53 4b 49 4f 20 2a 2f 0a                 _DISKIO */.