/ Hex Artifact Content
Login

Artifact bb524fe4b501a60762d07d6d0d33fd548b176cf6:


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 39  : pager.c,v 1.39
0350: 36 20 32 30 30 37 2f 31 31 2f 32 38 20 31 36 3a  6 2007/11/28 16:
0360: 31 39 3a 35 36 20 64 72 68 20 45 78 70 20 24 0a  19:56 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  t.h".#include <a
03b0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03c0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03d0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03e0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03f0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0400: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0410: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62  efine sqlite3Deb
0420: 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a  ugPrintf printf.
0430: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0440: 43 45 31 28 58 29 20 20 20 20 20 20 20 73 71 6c  CE1(X)       sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
0460: 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  X).#define PAGER
0470: 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20  TRACE2(X,Y)     
0480: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0490: 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  tf(X,Y).#define 
04a0: 50 41 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c  PAGERTRACE3(X,Y,
04b0: 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  Z)   sqlite3Debu
04c0: 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23  gPrintf(X,Y,Z).#
04d0: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
04e0: 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69  E4(X,Y,Z,W) sqli
04f0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0500: 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20  ,Y,Z,W).#define 
0510: 50 41 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c  PAGERTRACE5(X,Y,
0520: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0530: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0540: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0550: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0560: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0570: 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69  RACE2(X,Y).#defi
0580: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
0590: 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Y,Z).#define PA
05a0: 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c  GERTRACE4(X,Y,Z,
05b0: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
05c0: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
05d0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
05e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
05f0: 6f 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65  o macros are use
0600: 64 20 77 69 74 68 69 6e 20 74 68 65 20 50 41 47  d within the PAG
0610: 45 52 54 52 41 43 45 58 28 29 20 6d 61 63 72 6f  ERTRACEX() macro
0620: 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 70 72  s above.** to pr
0630: 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64 65 73  int out file-des
0640: 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a  criptors. .**.**
0650: 20 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73   PAGERID() takes
0660: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
0670: 50 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20  Pager struct as 
0680: 69 74 27 73 20 61 72 67 75 6d 65 6e 74 2e 20 54  it's argument. T
0690: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
06a0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
06b0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49   is returned. FI
06c0: 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b  LEHANDLEID() tak
06d0: 65 73 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69  es an sqlite3_fi
06e0: 6c 65 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20  le.** struct as 
06f0: 69 74 27 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  it's argument..*
0700: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 49  /.#define PAGERI
0710: 44 28 70 29 20 28 28 69 6e 74 29 28 70 2d 3e 66  D(p) ((int)(p->f
0720: 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45  d)).#define FILE
0730: 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69  HANDLEID(fd) ((i
0740: 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  nt)fd)../*.** Th
0750: 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73 20  e page cache as 
0760: 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79  a whole is alway
0770: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
0780: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
0790: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  tes:.**.**   PAG
07a0: 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20  ER_UNLOCK       
07b0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
07c0: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
07d0: 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20   reading or .** 
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74 68        writing th
0800: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0810: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a    There is no.**
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c 64         data held
0840: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
0850: 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
0860: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0870: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 2e            state.
0880: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53  .**.**   PAGER_S
0890: 48 41 52 45 44 20 20 20 20 20 20 20 20 54 68 65  HARED        The
08a0: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 72   page cache is r
08b0: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
08c0: 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ase..**         
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72                Wr
08e0: 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72  iting is not per
08f0: 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20 63  mitted.  There c
0900: 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  an be.**        
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
0920: 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
0930: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
0940: 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  me database.**  
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68 65       file at the
0970: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   same time..**.*
0980: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
0990: 45 44 20 20 20 20 20 20 54 68 69 73 20 70 72 6f  ED      This pro
09a0: 63 65 73 73 20 68 61 73 20 72 65 73 65 72 76 65  cess has reserve
09b0: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
09c0: 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20  or writing.**   
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20      but has not 
09f0: 79 65 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61  yet made any cha
0a00: 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20  nges.  Only one 
0a10: 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20  process.**      
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a30: 20 61 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72   at a time can r
0a40: 65 73 65 72 76 65 20 74 68 65 20 64 61 74 61 62  eserve the datab
0a50: 61 73 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e  ase.  The origin
0a60: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0a80: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f  base file has no
0a90: 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  t been modified 
0aa0: 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20  so other.**     
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 20 20 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20    processes may 
0ad0: 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
0ae0: 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20   the on-disk.** 
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
0b10: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ile..**.**   PAG
0b20: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20  ER_EXCLUSIVE    
0b30: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0b40: 69 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  is writing the d
0b50: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20  atabase..**     
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 20 20 41 63 63 65 73 73 20 69 73 20 65 78 63 6c    Access is excl
0b80: 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72  usive.  No other
0b90: 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a   processes or.**
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20 63         threads c
0bc0: 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72  an be reading or
0bd0: 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f   writing while o
0be0: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ne.**           
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63              proc
0c00: 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a  ess is writing..
0c10: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59  **.**   PAGER_SY
0c20: 4e 43 45 44 20 20 20 20 20 20 20 20 54 68 65 20  NCED        The 
0c30: 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74  pager moves to t
0c40: 68 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50  his state from P
0c50: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a  AGER_EXCLUSIVE.*
0c60: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0c70: 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61 6c          after al
0c80: 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68 61  l dirty pages ha
0c90: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
0ca0: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
0cd0: 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 62  d the file has b
0ce0: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a  een synced to.**
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c         disk. All
0d10: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f   that remains to
0d20: 20 64 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65   do is to remove
0d30: 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   or.**          
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 75               tru
0d50: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
0d60: 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 74  l file and the t
0d70: 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20  ransaction .**  
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d       will be com
0da0: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
0db0: 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d  e page cache com
0dc0: 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55  es up in PAGER_U
0dd0: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0de0: 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69  t time a.** sqli
0df0: 74 65 33 50 61 67 65 72 47 65 74 28 29 20 6f 63  te3PagerGet() oc
0e00: 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65 20  curs, the state 
0e10: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50  transitions to P
0e20: 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20  AGER_SHARED..** 
0e30: 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20  After all pages 
0e40: 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73  have been releas
0e50: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f  ed using sqlite_
0e60: 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a  page_unref(),.**
0e70: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0e80: 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50  itions back to P
0e90: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0ea0: 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20  e first time.** 
0eb0: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
0ec0: 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
0ed0: 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  ed, the state tr
0ee0: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20  ansitions to.** 
0ef0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20  PAGER_RESERVED. 
0f00: 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69   (Note that sqli
0f10: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
0f20: 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63  can only be.** c
0f30: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73  alled on an outs
0f40: 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69  tanding page whi
0f50: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ch means that th
0f60: 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20  e pager must.** 
0f70: 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52  be in PAGER_SHAR
0f80: 45 44 20 62 65 66 6f 72 65 20 69 74 20 74 72 61  ED before it tra
0f90: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45  nsitions to PAGE
0fa0: 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20  R_RESERVED.).** 
0fb0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 6d  PAGER_RESERVED m
0fc0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20  eans that there 
0fd0: 69 73 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62  is an open rollb
0fe0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  ack journal..** 
0ff0: 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74  The transition t
1000: 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  o PAGER_EXCLUSIV
1010: 45 20 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20  E occurs before 
1020: 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61  any changes.** a
1030: 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
1040: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
1050: 6f 75 67 68 20 77 72 69 74 65 73 20 74 6f 20 74  ough writes to t
1060: 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a  he rollback.** j
1070: 6f 75 72 6e 61 6c 20 6f 63 63 75 72 73 20 77 69  ournal occurs wi
1080: 74 68 20 6a 75 73 74 20 50 41 47 45 52 5f 52 45  th just PAGER_RE
1090: 53 45 52 56 45 44 2e 20 20 41 66 74 65 72 20 61  SERVED.  After a
10a0: 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  n sqlite3PagerRo
10b0: 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73  llback().** or s
10c0: 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
10d0: 74 50 68 61 73 65 54 77 6f 28 29 2c 20 74 68 65  tPhaseTwo(), the
10e0: 20 73 74 61 74 65 20 63 61 6e 20 67 6f 20 62 61   state can go ba
10f0: 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
1100: 45 44 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e  ED,.** or it can
1110: 20 73 74 61 79 20 61 74 20 50 41 47 45 52 5f 45   stay at PAGER_E
1120: 58 43 4c 55 53 49 56 45 20 69 66 20 77 65 20 61  XCLUSIVE if we a
1130: 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  re in exclusive 
1140: 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a  access mode..*/.
1150: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e  #define PAGER_UN
1160: 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66  LOCK      0.#def
1170: 69 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45 44  ine PAGER_SHARED
1180: 20 20 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d        1   /* sam
1190: 65 20 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b  e as SHARED_LOCK
11a0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
11b0: 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 32 20  R_RESERVED    2 
11c0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53    /* same as RES
11d0: 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64  ERVED_LOCK */.#d
11e0: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c  efine PAGER_EXCL
11f0: 55 53 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73  USIVE   4   /* s
1200: 61 6d 65 20 61 73 20 45 58 43 4c 55 53 49 56 45  ame as EXCLUSIVE
1210: 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65  _LOCK */.#define
1220: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
1230: 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74     5../*.** If t
1240: 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  he SQLITE_BUSY_R
1250: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63  ESERVED_LOCK mac
1260: 72 6f 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ro is set to tru
1270: 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  e at compile-tim
1280: 65 2c 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65  e,.** then faile
1290: 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65  d attempts to ge
12a0: 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  t a reserved loc
12b0: 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68  k will invoke th
12c0: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e  e busy callback.
12d0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20  .** This is off 
12e0: 62 79 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20  by default.  To 
12f0: 73 65 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65  see why, conside
1300: 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
1310: 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a  scenario:.** .**
1320: 20 53 75 70 70 6f 73 65 20 74 68 72 65 61 64 20   Suppose thread 
1330: 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
1340: 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20  shared lock and 
1350: 77 61 6e 74 73 20 61 20 72 65 73 65 72 76 65 64  wants a reserved
1360: 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64   lock..** Thread
1370: 20 42 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   B already has a
1380: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61   reserved lock a
1390: 6e 64 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c  nd wants an excl
13a0: 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a  usive lock.  If.
13b0: 2a 2a 20 62 6f 74 68 20 74 68 72 65 61 64 73 20  ** both threads 
13c0: 61 72 65 20 75 73 69 6e 67 20 74 68 65 69 72 20  are using their 
13d0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20  busy callbacks, 
13e0: 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f  it might be a lo
13f0: 6e 67 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f  ng time.** be fo
1400: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72  r one of the thr
1410: 65 61 64 73 20 67 69 76 65 20 75 70 20 61 6e 64  eads give up and
1420: 20 61 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65   allows the othe
1430: 72 20 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a  r to proceed..**
1440: 20 42 75 74 20 69 66 20 74 68 65 20 74 68 72 65   But if the thre
1450: 61 64 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74  ad trying to get
1460: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f   the reserved lo
1470: 63 6b 20 67 69 76 65 73 20 75 70 20 71 75 69 63  ck gives up quic
1480: 6b 6c 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65  kly.** (if it ne
1490: 76 65 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20  ver invokes its 
14a0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74  busy callback) t
14b0: 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69  hen the contenti
14c0: 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65  on will be.** re
14d0: 73 6f 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a  solved quickly..
14e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
14f0: 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
1500: 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51  LOCK.# define SQ
1510: 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56  LITE_BUSY_RESERV
1520: 45 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66  ED_LOCK 0.#endif
1530: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63  ../*.** This mac
1540: 72 6f 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73  ro rounds values
1550: 20 75 70 20 73 6f 20 74 68 61 74 20 69 66 20 74   up so that if t
1560: 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61  he value is an a
1570: 64 64 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20  ddress it.** is 
1580: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1590: 20 61 6e 20 61 64 64 72 65 73 73 20 74 68 61 74   an address that
15a0: 20 69 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61   is aligned to a
15b0: 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72  n 8-byte boundar
15c0: 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f  y..*/.#define FO
15d0: 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29  RCE_ALIGNMENT(X)
15e0: 20 20 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a     (((X)+7)&~7).
15f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1600: 50 67 48 64 72 20 50 67 48 64 72 3b 0a 0a 2f 2a  PgHdr PgHdr;../*
1610: 0a 2a 2a 20 45 61 63 68 20 70 61 67 65 72 20 73  .** Each pager s
1620: 74 6f 72 65 73 20 61 6c 6c 20 63 75 72 72 65 6e  tores all curren
1630: 74 6c 79 20 75 6e 72 65 66 65 72 65 6e 63 65 64  tly unreferenced
1640: 20 70 61 67 65 73 20 69 6e 20 61 20 6c 69 73 74   pages in a list
1650: 20 73 6f 72 74 65 64 0a 2a 2a 20 69 6e 20 6c 65   sorted.** in le
1660: 61 73 74 2d 72 65 63 65 6e 74 6c 79 2d 75 73 65  ast-recently-use
1670: 64 20 28 4c 52 55 29 20 6f 72 64 65 72 20 28 69  d (LRU) order (i
1680: 2e 65 2e 20 74 68 65 20 66 69 72 73 74 20 69 74  .e. the first it
1690: 65 6d 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 68  em on the list h
16a0: 61 73 20 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20  as .** not been 
16b0: 72 65 66 65 72 65 6e 63 65 64 20 69 6e 20 61 20  referenced in a 
16c0: 6c 6f 6e 67 20 74 69 6d 65 2c 20 74 68 65 20 6c  long time, the l
16d0: 61 73 74 20 69 74 65 6d 20 68 61 73 20 62 65 65  ast item has bee
16e0: 6e 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 75 73  n recently.** us
16f0: 65 64 29 2e 20 41 6e 20 69 6e 73 74 61 6e 63 65  ed). An instance
1700: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
1710: 72 65 20 69 73 20 69 6e 63 6c 75 64 65 64 20 61  re is included a
1720: 73 20 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a  s part of each.*
1730: 2a 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  * pager structur
1740: 65 20 66 6f 72 20 74 68 69 73 20 70 75 72 70 6f  e for this purpo
1750: 73 65 20 28 76 61 72 69 61 62 6c 65 20 50 61 67  se (variable Pag
1760: 65 72 2e 6c 72 75 29 2e 0a 2a 2a 0a 2a 2a 20 41  er.lru)..**.** A
1770: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20  dditionally, if 
1780: 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e  memory-managemen
1790: 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c  t is enabled, al
17a0: 6c 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70  l unreferenced p
17b0: 61 67 65 73 20 0a 2a 2a 20 61 72 65 20 73 74 6f  ages .** are sto
17c0: 72 65 64 20 69 6e 20 61 20 67 6c 6f 62 61 6c 20  red in a global 
17d0: 4c 52 55 20 6c 69 73 74 20 28 67 6c 6f 62 61 6c  LRU list (global
17e0: 20 76 61 72 69 61 62 6c 65 20 73 71 6c 69 74 65   variable sqlite
17f0: 33 4c 72 75 50 61 67 65 4c 69 73 74 29 2e 0a 2a  3LruPageList)..*
1800: 2a 0a 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73  *.** In both cas
1810: 65 73 2c 20 74 68 65 20 50 61 67 65 72 4c 72 75  es, the PagerLru
1820: 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65  List.pFirstSynce
1830: 64 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74  d variable point
1840: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 66 69 72 73  s to.** the firs
1850: 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 6f  t page in the co
1860: 72 72 65 73 70 6f 6e 64 69 6e 67 20 6c 69 73 74  rresponding list
1870: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
1880: 65 71 75 69 72 65 20 61 6e 0a 2a 2a 20 66 73 79  equire an.** fsy
1890: 6e 63 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 62  nc() operation b
18a0: 65 66 6f 72 65 20 69 74 27 73 20 6d 65 6d 6f 72  efore it's memor
18b0: 79 20 63 61 6e 20 62 65 20 72 65 63 6c 61 69 6d  y can be reclaim
18c0: 65 64 2e 20 49 66 20 6e 6f 20 73 75 63 68 0a 2a  ed. If no such.*
18d0: 2a 20 70 61 67 65 20 65 78 69 73 74 73 2c 20 50  * page exists, P
18e0: 61 67 65 72 4c 72 75 4c 69 73 74 2e 70 46 69 72  agerLruList.pFir
18f0: 73 74 53 79 6e 63 65 64 20 69 73 20 73 65 74 20  stSynced is set 
1900: 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 74 79 70 65  to NULL..*/.type
1910: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
1920: 4c 72 75 4c 69 73 74 20 50 61 67 65 72 4c 72 75  LruList PagerLru
1930: 4c 69 73 74 3b 0a 73 74 72 75 63 74 20 50 61 67  List;.struct Pag
1940: 65 72 4c 72 75 4c 69 73 74 20 7b 0a 20 20 50 67  erLruList {.  Pg
1950: 48 64 72 20 2a 70 46 69 72 73 74 3b 20 20 20 20  Hdr *pFirst;    
1960: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
1970: 67 65 20 69 6e 20 4c 52 55 20 6c 69 73 74 20 2a  ge in LRU list *
1980: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 61 73 74  /.  PgHdr *pLast
1990: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  ;          /* La
19a0: 73 74 20 70 61 67 65 20 69 6e 20 4c 52 55 20 6c  st page in LRU l
19b0: 69 73 74 20 28 74 68 65 20 6d 6f 73 74 20 72 65  ist (the most re
19c0: 63 65 6e 74 6c 79 20 75 73 65 64 29 20 2a 2f 0a  cently used) */.
19d0: 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 53    PgHdr *pFirstS
19e0: 79 6e 63 65 64 3b 20 20 20 2f 2a 20 46 69 72 73  ynced;   /* Firs
19f0: 74 20 70 61 67 65 20 69 6e 20 6c 69 73 74 20 77  t page in list w
1a00: 69 74 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79  ith PgHdr.needSy
1a10: 6e 63 3d 3d 30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  nc==0 */.};../*.
1a20: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1a30: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
1a40: 69 6e 73 20 74 68 65 20 6e 65 78 74 20 61 6e 64  ins the next and
1a50: 20 70 72 65 76 69 6f 75 73 20 70 6f 69 6e 74 65   previous pointe
1a60: 72 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 69  rs used.** to li
1a70: 6e 6b 20 61 20 50 67 48 64 72 20 73 74 72 75 63  nk a PgHdr struc
1a80: 74 75 72 65 20 69 6e 74 6f 20 61 20 50 61 67 65  ture into a Page
1a90: 72 4c 72 75 4c 69 73 74 20 6c 69 6e 6b 65 64 20  rLruList linked 
1aa0: 6c 69 73 74 2e 20 0a 2a 2f 0a 74 79 70 65 64 65  list. .*/.typede
1ab0: 66 20 73 74 72 75 63 74 20 50 61 67 65 72 4c 72  f struct PagerLr
1ac0: 75 4c 69 6e 6b 20 50 61 67 65 72 4c 72 75 4c 69  uLink PagerLruLi
1ad0: 6e 6b 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72  nk;.struct Pager
1ae0: 4c 72 75 4c 69 6e 6b 20 7b 0a 20 20 50 67 48 64  LruLink {.  PgHd
1af0: 72 20 2a 70 4e 65 78 74 3b 0a 20 20 50 67 48 64  r *pNext;.  PgHd
1b00: 72 20 2a 70 50 72 65 76 3b 0a 7d 3b 0a 0a 2f 2a  r *pPrev;.};../*
1b10: 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f  .** Each in-memo
1b20: 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61  ry image of a pa
1b30: 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  ge begins with t
1b40: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61  he following hea
1b50: 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61  der..** This hea
1b60: 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69  der is only visi
1b70: 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  ble to this page
1b80: 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63  r module.  The c
1b90: 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68  lient.** code th
1ba0: 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73  at calls pager s
1bb0: 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74  ees only the dat
1bc0: 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74  a that follows t
1bd0: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
1be0: 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f   Client code sho
1bf0: 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  uld call sqlite3
1c00: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
1c10: 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  a page prior to 
1c20: 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f  making.** any mo
1c30: 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74  difications to t
1c40: 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66  hat page.  The f
1c50: 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65  irst time sqlite
1c60: 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
1c70: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1c80: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
1c90: 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69 74 74  ntents are writt
1ca0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c  en into the roll
1cb0: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
1cc0: 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72  and PgHdr.inJour
1cd0: 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65  nal and PgHdr.ne
1ce0: 65 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20  edSync are set. 
1cf0: 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20   Later, once.** 
1d00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  the journal page
1d10: 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74   has made it ont
1d20: 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
1d30: 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79  ce, PgHdr.needSy
1d40: 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64  nc.** is cleared
1d50: 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20  .  The modified 
1d60: 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77  page cannot be w
1d70: 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
1d80: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1d90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
1da0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
1db0: 20 70 61 67 65 73 20 68 61 73 20 62 65 65 6e 20   pages has been 
1dc0: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61  synced to disk a
1dd0: 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e  nd the.** PgHdr.
1de0: 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62 65 65  needSync has bee
1df0: 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  n cleared..**.**
1e00: 20 54 68 65 20 50 67 48 64 72 2e 64 69 72 74 79   The PgHdr.dirty
1e10: 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65   flag is set whe
1e20: 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
1e30: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1e40: 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  and.** is cleare
1e50: 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65  d again when the
1e60: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
1e70: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
1e80: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1ea0: 2a 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66  **.** Details of
1eb0: 20 69 6d 70 6f 72 74 61 6e 74 20 73 74 72 75 63   important struc
1ec0: 74 75 72 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a  ture elements:.*
1ed0: 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a  *.** needSync.**
1ee0: 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 69 73 20  .**     If this 
1ef0: 69 73 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65  is true, this me
1f00: 61 6e 73 20 74 68 61 74 20 69 74 20 69 73 20 6e  ans that it is n
1f10: 6f 74 20 73 61 66 65 20 74 6f 20 77 72 69 74 65  ot safe to write
1f20: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20   the page.**    
1f30: 20 63 6f 6e 74 65 6e 74 20 74 6f 20 74 68 65 20   content to the 
1f40: 64 61 74 61 62 61 73 65 20 62 65 63 61 75 73 65  database because
1f50: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f   the original co
1f60: 6e 74 65 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20  ntent needed.** 
1f70: 20 20 20 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b      for rollback
1f80: 20 68 61 73 20 6e 6f 74 20 62 79 20 73 79 6e 63   has not by sync
1f90: 65 64 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 72  ed to the main r
1fa0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
1fb0: 0a 2a 2a 20 20 20 20 20 54 68 65 20 6f 72 69 67  .**     The orig
1fc0: 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79  inal content may
1fd0: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
1fe0: 65 6e 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61  en to the rollba
1ff0: 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  ck journal.**   
2000: 20 20 62 75 74 20 69 74 20 68 61 73 20 6e 6f 74    but it has not
2010: 20 79 65 74 20 62 65 65 6e 20 73 79 6e 63 65 64   yet been synced
2020: 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20  .  So we cannot 
2030: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74  write to the dat
2040: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c  abase.**     fil
2050: 65 20 62 65 63 61 75 73 65 20 70 6f 77 65 72 20  e because power 
2060: 66 61 69 6c 75 72 65 20 6d 69 67 68 74 20 63 61  failure might ca
2070: 75 73 65 20 74 68 65 20 70 61 67 65 20 69 6e 20  use the page in 
2080: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2090: 0a 2a 2a 20 20 20 20 20 74 6f 20 6e 65 76 65 72  .**     to never
20a0: 20 72 65 61 63 68 20 74 68 65 20 64 69 73 6b 2e   reach the disk.
20b0: 20 20 49 74 20 69 73 20 61 73 20 69 66 20 74 68    It is as if th
20c0: 65 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  e write to the j
20d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
20e0: 20 20 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75     does not occu
20f0: 72 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72  r until the jour
2100: 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
2110: 65 64 2e 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20  ed..**     .**  
2120: 20 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20     This flag is 
2130: 66 61 6c 73 65 20 69 66 20 74 68 65 20 70 61 67  false if the pag
2140: 65 20 63 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c  e content exactl
2150: 79 20 6d 61 74 63 68 65 73 20 77 68 61 74 0a 2a  y matches what.*
2160: 2a 20 20 20 20 20 63 75 72 72 65 6e 74 6c 79 20  *     currently 
2170: 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 64 61  exists in the da
2180: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
2190: 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
21a0: 69 73 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66  is also.**     f
21b0: 61 6c 73 65 20 69 66 20 74 68 65 20 6f 72 69 67  alse if the orig
21c0: 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  inal content has
21d0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
21e0: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
21f0: 63 6b 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  ck.**     journa
2200: 6c 20 61 6e 64 20 73 79 6e 63 65 64 2e 20 20 49  l and synced.  I
2210: 66 20 74 68 65 20 70 61 67 65 20 72 65 70 72 65  f the page repre
2220: 73 65 6e 74 73 20 61 20 6e 65 77 20 70 61 67 65  sents a new page
2230: 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 20 20 20   that has.**    
2240: 20 62 65 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f   been added onto
2250: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2260: 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
2270: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20  the current.**  
2280: 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20     transaction, 
2290: 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61  the needSync fla
22a0: 67 20 69 73 20 74 72 75 65 20 75 6e 74 69 6c 20  g is true until 
22b0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
22c0: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a  abase.**     siz
22d0: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
22e0: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
22f0: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
2300: 0a 2a 2a 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c  .**.** inJournal
2310: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20  .**.**     This 
2320: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
2330: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 68 61 73  riginal page has
2340: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e   been written in
2350: 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20  to the main.**  
2360: 20 20 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72     rollback jour
2370: 6e 61 6c 2e 20 20 54 68 69 73 20 69 73 20 61 6c  nal.  This is al
2380: 77 61 79 73 20 66 61 6c 73 65 20 66 6f 72 20 6e  ways false for n
2390: 65 77 20 70 61 67 65 73 20 61 64 64 65 64 20 74  ew pages added t
23a0: 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 65 6e 64  o.**     the end
23b0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
23c0: 20 66 69 6c 65 20 64 75 72 69 6e 67 20 74 68 65   file during the
23d0: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
23e0: 74 69 6f 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64  tion..**     And
23f0: 20 74 68 69 73 20 66 6c 61 67 20 73 61 79 73 20   this flag says 
2400: 6e 6f 74 68 69 6e 67 20 61 62 6f 75 74 20 77 68  nothing about wh
2410: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
2420: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
2430: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
2440: 74 6f 20 64 69 73 6b 2e 20 20 46 6f 72 20 70 61  to disk.  For pa
2450: 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20  ges that are in 
2460: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
2470: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
2480: 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
2490: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 68 6f 75   expression shou
24a0: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 72 75  ld always be tru
24b0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69  e:.**.**       i
24c0: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67  nJournal = (pPag
24d0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 28  er->aInJournal[(
24e0: 70 67 6e 6f 2d 31 29 2f 38 5d 20 26 20 28 31 3c  pgno-1)/8] & (1<
24f0: 3c 28 28 70 67 6e 6f 2d 31 29 25 38 29 29 21 3d  <((pgno-1)%8))!=
2500: 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65 20  0.**.**     The 
2510: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
2520: 61 6c 5b 5d 20 61 72 72 61 79 20 69 73 20 6f 6e  al[] array is on
2530: 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65  ly valid for the
2540: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   original.**    
2550: 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 64 61   pages of the da
2560: 74 61 62 61 73 65 2c 20 6e 6f 74 20 6e 65 77 20  tabase, not new 
2570: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
2580: 64 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64 0a  dded to the end.
2590: 2a 2a 20 20 20 20 20 6f 66 20 74 68 65 20 64 61  **     of the da
25a0: 74 61 62 61 73 65 2c 20 73 6f 20 6f 62 76 69 6f  tabase, so obvio
25b0: 75 73 6c 79 20 74 68 65 20 61 62 6f 76 65 20 65  usly the above e
25c0: 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 6e 6f 74  xpression cannot
25d0: 20 62 65 0a 2a 2a 20 20 20 20 20 76 61 6c 69 64   be.**     valid
25e0: 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73 2e 20   for new pages. 
25f0: 20 46 6f 72 20 6e 65 77 20 70 61 67 65 73 20 69   For new pages i
2600: 6e 4a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77 61  nJournal is alwa
2610: 79 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72 74  ys 0..**.** dirt
2620: 79 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 6e  y.**.**     When
2630: 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e   true, this mean
2640: 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  s that the conte
2650: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  nt of the page h
2660: 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20 6d  as been.**     m
2670: 6f 64 69 66 69 65 64 20 61 6e 64 20 6e 65 65 64  odified and need
2680: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
2690: 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61  back to the data
26a0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
26b0: 20 20 49 66 20 66 61 6c 73 65 2c 20 69 74 20 6d    If false, it m
26c0: 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72  eans that either
26d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
26e0: 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20 20  the page is.**  
26f0: 20 20 20 75 6e 63 68 61 6e 67 65 64 20 6f 72 20     unchanged or 
2700: 65 6c 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  else the content
2710: 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74 20   is unimportant 
2720: 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a  and we do not.**
2730: 20 20 20 20 20 63 61 72 65 20 77 68 65 74 68 65       care whethe
2740: 72 20 6f 72 20 6e 6f 74 20 69 74 20 69 73 20 70  r or not it is p
2750: 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  reserved..**.** 
2760: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 2a  alwaysRollback.*
2770: 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 6d 65  *.**     This me
2780: 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  ans that the sql
2790: 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
27a0: 6c 62 61 63 6b 28 29 20 41 50 49 20 73 68 6f 75  lback() API shou
27b0: 6c 64 20 62 65 0a 2a 2a 20 20 20 20 20 69 67 6e  ld be.**     ign
27c0: 6f 72 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  ored for this pa
27d0: 67 65 2e 20 20 54 68 65 20 44 6f 6e 74 52 6f 6c  ge.  The DontRol
27e0: 6c 62 61 63 6b 28 29 20 41 50 49 20 61 74 74 65  lback() API atte
27f0: 6d 70 74 73 20 74 6f 20 73 61 79 0a 2a 2a 20 20  mpts to say.**  
2800: 20 20 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74     that the cont
2810: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
2820: 6f 6e 20 64 69 73 6b 20 69 73 20 75 6e 69 6d 70  on disk is unimp
2830: 6f 72 74 61 6e 74 20 28 69 74 20 69 73 20 61 6e  ortant (it is an
2840: 0a 2a 2a 20 20 20 20 20 75 6e 75 73 65 64 20 70  .**     unused p
2850: 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  age on the freel
2860: 69 73 74 29 20 73 6f 20 74 68 61 74 20 69 74 20  ist) so that it 
2870: 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 74  is unnecessary t
2880: 6f 20 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62 61  o .**     rollba
2890: 63 6b 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ck changes to th
28a0: 69 73 20 70 61 67 65 20 62 65 63 61 75 73 65 20  is page because 
28b0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
28c0: 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63  he page.**     c
28d0: 61 6e 20 63 68 61 6e 67 65 20 77 69 74 68 6f 75  an change withou
28e0: 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6d  t changing the m
28f0: 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  eaning of the da
2900: 74 61 62 61 73 65 2e 20 20 54 68 69 73 0a 2a 2a  tabase.  This.**
2910: 20 20 20 20 20 66 6c 61 67 20 6f 76 65 72 72 69       flag overri
2920: 64 65 73 20 61 6e 79 20 44 6f 6e 74 52 6f 6c 6c  des any DontRoll
2930: 62 61 63 6b 28 29 20 61 74 74 65 6d 70 74 2e 20  back() attempt. 
2940: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65   This flag is se
2950: 74 0a 2a 2a 20 20 20 20 20 77 68 65 6e 20 61 20  t.**     when a 
2960: 70 61 67 65 20 74 68 61 74 20 6f 72 69 67 69 6e  page that origin
2970: 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 76  ally contained v
2980: 61 6c 69 64 20 64 61 74 61 20 69 73 20 61 64 64  alid data is add
2990: 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  ed to.**     the
29a0: 20 66 72 65 65 6c 69 73 74 2e 20 20 4c 61 74 65   freelist.  Late
29b0: 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74 72  r in the same tr
29c0: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20  ansaction, this 
29d0: 70 61 67 65 20 6d 69 67 68 74 0a 2a 2a 20 20 20  page might.**   
29e0: 20 20 62 65 20 70 75 6c 6c 65 64 20 66 72 6f 6d    be pulled from
29f0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e   the freelist an
2a00: 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d  d reused for som
2a10: 65 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ething different
2a20: 0a 2a 2a 20 20 20 20 20 61 6e 64 20 61 74 20 74  .**     and at t
2a30: 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20 44 6f  hat point the Do
2a40: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50 49  ntRollback() API
2a50: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
2a60: 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20 70  because.**     p
2a70: 61 67 65 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  ages taken from 
2a80: 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 6f 20  the freelist do 
2a90: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70  not need to be p
2aa0: 72 6f 74 65 63 74 65 64 20 62 79 0a 2a 2a 20 20  rotected by.**  
2ab0: 20 20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20     the rollback 
2ac0: 6a 6f 75 72 6e 61 6c 2e 20 20 42 75 74 20 74 68  journal.  But th
2ad0: 69 73 20 66 6c 61 67 20 73 61 79 73 20 74 68 61  is flag says tha
2ae0: 74 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a  t the page was.*
2af0: 2a 20 20 20 20 20 6e 6f 74 20 6f 72 69 67 69 6e  *     not origin
2b00: 61 6c 6c 79 20 70 61 72 74 20 6f 66 20 74 68 65  ally part of the
2b10: 20 66 72 65 65 6c 69 73 74 20 73 6f 20 74 68 61   freelist so tha
2b20: 74 20 69 74 20 73 74 69 6c 6c 20 6e 65 65 64 73  t it still needs
2b30: 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65 20 72 6f   to.**     be ro
2b40: 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69  lled back in spi
2b50: 74 65 20 6f 66 20 61 6e 79 20 73 75 62 73 65 71  te of any subseq
2b60: 75 65 6e 74 20 44 6f 6e 74 52 6f 6c 6c 62 61 63  uent DontRollbac
2b70: 6b 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  k() calls..**.**
2b80: 20 6e 65 65 64 52 65 61 64 20 0a 2a 2a 0a 2a 2a   needRead .**.**
2b90: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 6d       This flag m
2ba0: 65 61 6e 73 20 28 77 68 65 6e 20 74 72 75 65 29  eans (when true)
2bb0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
2bc0: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 61  t of the page ha
2bd0: 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 79 65 74  s.**     not yet
2be0: 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 66 72 6f   been loaded fro
2bf0: 6d 20 64 69 73 6b 2e 20 20 54 68 65 20 69 6e 2d  m disk.  The in-
2c00: 6d 65 6d 6f 72 79 20 63 6f 6e 74 65 6e 74 20 69  memory content i
2c10: 73 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 67 61  s just.**     ga
2c20: 72 62 61 67 65 2e 20 20 28 41 63 74 75 61 6c 6c  rbage.  (Actuall
2c30: 79 2c 20 77 65 20 7a 65 72 6f 20 74 68 65 20 63  y, we zero the c
2c40: 6f 6e 74 65 6e 74 2c 20 62 75 74 20 79 6f 75 20  ontent, but you 
2c50: 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20  should not.**   
2c60: 20 20 6d 61 6b 65 20 61 6e 79 20 61 73 73 75 6d    make any assum
2c70: 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 74 68 65  ptions about the
2c80: 20 63 6f 6e 74 65 6e 74 20 6e 65 76 65 72 74 68   content neverth
2c90: 65 6c 65 73 73 2e 29 20 20 49 66 20 74 68 65 0a  eless.)  If the.
2ca0: 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 69  **     content i
2cb0: 73 20 6e 65 65 64 65 64 20 69 6e 20 74 68 65 20  s needed in the 
2cc0: 66 75 74 75 72 65 2c 20 69 74 20 73 68 6f 75 6c  future, it shoul
2cd0: 64 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  d be read from t
2ce0: 68 65 0a 2a 2a 20 20 20 20 20 6f 72 69 67 69 6e  he.**     origin
2cf0: 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
2d00: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 67 48 64  ..*/.struct PgHd
2d10: 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  r {.  Pager *pPa
2d20: 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ger;            
2d30: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
2d40: 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20  r to which this 
2d50: 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a  page belongs */.
2d60: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d80: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
2d90: 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  ber for this pag
2da0: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  e */.  PgHdr *pN
2db0: 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76 48  extHash, *pPrevH
2dc0: 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f  ash;  /* Hash co
2dd0: 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f  llision chain fo
2de0: 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a  r PgHdr.pgno */.
2df0: 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 66    PagerLruLink f
2e00: 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ree;            
2e10: 20 2f 2a 20 4e 65 78 74 20 61 6e 64 20 70 72 65   /* Next and pre
2e20: 76 69 6f 75 73 20 66 72 65 65 20 70 61 67 65 73  vious free pages
2e30: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
2e40: 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  xtAll;          
2e50: 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f       /* A list o
2e60: 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20  f all pages */. 
2e70: 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20   u8 inJournal;  
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62  /* TRUE if has b
2ea0: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
2eb0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
2ec0: 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  irty;           
2ed0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
2ee0: 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  UE if we need to
2ef0: 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e   write back chan
2f00: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64  ges */.  u8 need
2f10: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
2f20: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20          /* Sync 
2f30: 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77  journal before w
2f40: 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67 65  riting this page
2f50: 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52   */.  u8 alwaysR
2f60: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  ollback;        
2f70: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
2f80: 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66  DontRollback() f
2f90: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
2fa0: 20 20 75 38 20 6e 65 65 64 52 65 61 64 3b 20 20    u8 needRead;  
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 20 2f 2a 20 52 65 61 64 20 63 6f 6e 74 65 6e 74   /* Read content
2fd0: 20 69 66 20 50 61 67 65 72 57 72 69 74 65 28 29   if PagerWrite()
2fe0: 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20   is called */.  
2ff0: 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b 20  short int nRef; 
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3010: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72  * Number of user
3020: 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a  s of this page *
3030: 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74  /.  PgHdr *pDirt
3040: 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79 3b 20  y, *pPrevDirty; 
3050: 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65     /* Dirty page
3060: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
3070: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
3080: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61  _MANAGEMENT.  Pa
3090: 67 65 72 4c 72 75 4c 69 6e 6b 20 67 66 72 65 65  gerLruLink gfree
30a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
30b0: 47 6c 6f 62 61 6c 20 6c 69 73 74 20 6f 66 20 6e  Global list of n
30c0: 52 65 66 3d 3d 30 20 70 61 67 65 73 20 2a 2f 0a  Ref==0 pages */.
30d0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
30e0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
30f0: 0a 20 20 75 33 32 20 70 61 67 65 48 61 73 68 3b  .  u32 pageHash;
3100: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 2a  .#endif.  void *
3110: 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
3120: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
3130: 20 64 61 74 61 20 2a 2f 0a 20 20 2f 2a 20 50 61   data */.  /* Pa
3140: 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73  ger.nExtra bytes
3150: 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 61   of local data a
3160: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 69 73 20  ppended to this 
3170: 68 65 61 64 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  header */.};../*
3180: 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65  .** For an in-me
3190: 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62 61  mory only databa
31a0: 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20 69  se, some extra i
31b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65  nformation is re
31c0: 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20  corded about.** 
31d0: 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68 61  each page so tha
31e0: 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62 65  t changes can be
31f0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28   rolled back.  (
3200: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72  Journal files ar
3210: 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f  e not.** used fo
3220: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
3230: 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f 6c  bases.)  The fol
3240: 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  lowing informati
3250: 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a  on is added to.*
3260: 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  * the end of eve
3270: 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20 66  ry EXTRA block f
3280: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
3290: 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  abases..**.** Th
32a0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  is information c
32b0: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 61  ould have been a
32c0: 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74 6f  dded directly to
32d0: 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75 63   the PgHdr struc
32e0: 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65  ture..** But the
32f0: 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65 20  n it would take 
3300: 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62 79  up an extra 8 by
3310: 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20 6f  tes of storage o
3320: 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a 2a  n every PgHdr.**
3330: 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62   even for disk-b
3340: 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e 20  ased databases. 
3350: 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f 75   Splitting it ou
3360: 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73 2e  t saves 8 bytes.
3370: 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c    This.** is onl
3380: 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20 30  y a savings of 0
3390: 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70 65  .8% but those pe
33a0: 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75 70  rcentages add up
33b0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
33c0: 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50 67  uct PgHistory Pg
33d0: 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74 20  History;.struct 
33e0: 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75 38  PgHistory {.  u8
33f0: 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20   *pOrig;     /* 
3400: 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74 65  Original page te
3410: 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f 20  xt.  Restore to 
3420: 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72  this on a full r
3430: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20  ollback */.  u8 
3440: 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54  *pStmt;     /* T
3450: 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61 74  ext as it was at
3460: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
3470: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
3480: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 50 67 48  atement */.  PgH
3490: 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20 2a  dr *pNextStmt, *
34a0: 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20 4c  pPrevStmt;  /* L
34b0: 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
34c0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
34d0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e  urnal */.  u8 in
34e0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
34f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
3500: 45 20 69 66 20 69 6e 20 74 68 65 20 73 74 61 74  E if in the stat
3510: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
3520: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
3530: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
3540: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
3550: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
3560: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
3570: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
3580: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
3590: 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f  ,N,X) if( P->xCo
35a0: 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43 6f  dec!=0 ){ P->xCo
35b0: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67  dec(P->pCodecArg
35c0: 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65 66  ,D,N,X); }.# def
35d0: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
35e0: 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d 3e  ,X) ((char*)(P->
35f0: 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43 6f  xCodec!=0?P->xCo
3600: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67  dec(P->pCodecArg
3610: 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c 73  ,D,N,X):D)).#els
3620: 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  e.# define CODEC
3630: 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f  1(P,D,N,X) /* NO
3640: 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  -OP */.# define 
3650: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20  CODEC2(P,D,N,X) 
3660: 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64 69  ((char*)D).#endi
3670: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
3680: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
3690: 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f 69  PgHdr into a poi
36a0: 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74 61  nter to its data
36b0: 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67 61  .** and back aga
36c0: 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  in..*/.#define P
36d0: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29 20  GHDR_TO_DATA(P) 
36e0: 20 20 20 28 28 50 29 2d 3e 70 44 61 74 61 29 0a     ((P)->pData).
36f0: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
3700: 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28 76 6f  _EXTRA(G,P) ((vo
3710: 69 64 2a 29 26 28 28 47 29 5b 31 5d 29 29 0a 23  id*)&((G)[1])).#
3720: 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f  define PGHDR_TO_
3730: 48 49 53 54 28 50 2c 50 47 52 29 20 20 5c 0a 20  HIST(P,PGR)  \. 
3740: 20 20 20 20 20 20 20 20 20 20 20 28 28 50 67 48             ((PgH
3750: 69 73 74 6f 72 79 2a 29 26 28 28 63 68 61 72 2a  istory*)&((char*
3760: 29 28 26 28 50 29 5b 31 5d 29 29 5b 28 50 47 52  )(&(P)[1]))[(PGR
3770: 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a  )->nExtra])../*.
3780: 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63  ** A open page c
3790: 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61  ache is an insta
37a0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
37b0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
37c0: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72 43  **.** Pager.errC
37d0: 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ode may be set t
37e0: 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  o SQLITE_IOERR, 
37f0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
3800: 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  or.** or SQLITE_
3810: 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f  FULL. Once one o
3820: 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  f the first thre
3830: 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c  e errors occurs,
3840: 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20   it persists.** 
3850: 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 20  and is returned 
3860: 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  as the result of
3870: 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67   every major pag
3880: 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68  er API call.  Th
3890: 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  e.** SQLITE_FULL
38a0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20   return code is 
38b0: 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65  slightly differe
38c0: 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73 20  nt. It persists 
38d0: 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a  only until the.*
38e0: 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75  * next successfu
38f0: 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65  l rollback is pe
3900: 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70  rformed on the p
3910: 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f  ager cache. Also
3920: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  ,.** SQLITE_FULL
3930: 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74   does not affect
3940: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
3950: 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  rGet() and sqlit
3960: 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 0a  e3PagerLookup().
3970: 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d 61  ** APIs, they ma
3980: 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64 20  y still be used 
3990: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2f  successfully..*/
39a0: 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a  .struct Pager {.
39b0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
39c0: 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Vfs;          /*
39d0: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f   OS functions to
39e0: 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a 20   use for IO */. 
39f0: 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b   u8 journalOpen;
3a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3a10: 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20  True if journal 
3a20: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
3a30: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75   is valid */.  u
3a40: 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  8 journalStarted
3a50: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
3a60: 75 65 20 69 66 20 68 65 61 64 65 72 20 6f 66 20  ue if header of 
3a70: 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
3a80: 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75  d */.  u8 useJou
3a90: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
3aa0: 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c     /* Use a roll
3ab0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20  back journal on 
3ac0: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75  this file */.  u
3ad0: 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20  8 noReadlock;   
3ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
3af0: 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20 6f   not bother to o
3b00: 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20  btain readlocks 
3b10: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65 6e  */.  u8 stmtOpen
3b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3b30: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
3b40: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
3b50: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a  rnal is open */.
3b60: 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b 20    u8 stmtInUse; 
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b80: 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e 20   True we are in 
3b90: 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  a statement subt
3ba0: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
3bb0: 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e 3b  u8 stmtAutoopen;
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3bd0: 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61 6c  pen stmt journal
3be0: 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e   when main journ
3bf0: 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20  al is opened*/. 
3c00: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3c20: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
3c30: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
3c40: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
3c50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3c60: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
3c70: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
3c80: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
3c90: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c   */.  u8 sync_fl
3ca0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
3cb0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43    /* One of SYNC
3cc0: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f  _NORMAL or SYNC_
3cd0: 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 73 74 61  FULL */.  u8 sta
3ce0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
3cf0: 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55        /* PAGER_U
3d00: 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20  NLOCK, _SHARED, 
3d10: 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20  _RESERVED, etc. 
3d20: 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65  */.  u8 tempFile
3d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3d40: 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   /* zFilename is
3d50: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
3d60: 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e  e */.  u8 readOn
3d70: 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ly;             
3d80: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
3d90: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
3da0: 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64  ase */.  u8 need
3db0: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
3dc0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3dd0: 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65  an fsync() is ne
3de0: 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  eded on the jour
3df0: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
3e00: 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20  yCache;         
3e10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3e20: 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61 76  cached pages hav
3e30: 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75  e changed */.  u
3e40: 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  8 alwaysRollback
3e50: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69  ;          /* Di
3e60: 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61  sable DontRollba
3e70: 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61 67  ck() for all pag
3e80: 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62  es */.  u8 memDb
3e90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3ea0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69      /* True to i
3eb0: 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20  nhibit all file 
3ec0: 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d  I/O */.  u8 setM
3ed0: 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
3ee0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3ef0: 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62  a m-j name has b
3f00: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
3f10: 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f  rnl */.  u8 doNo
3f20: 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  tSync;          
3f30: 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e       /* Boolean.
3f40: 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64 6f 20   While true, do 
3f50: 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61  not spill the ca
3f60: 63 68 65 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c  che */.  u8 excl
3f70: 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20  usiveMode;      
3f80: 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e       /* Boolean.
3f90: 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67   True if locking
3fa0: 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45  _mode==EXCLUSIVE
3fb0: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
3fc0: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
3fd0: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
3fe0: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
3ff0: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
4000: 2f 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67 73  /.  u32 vfsFlags
4010: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4020: 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c  /* Flags for sql
4030: 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
4040: 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64   */.  int errCod
4050: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4060: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65    /* One of seve
4070: 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72  ral kinds of err
4080: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53  ors */.  int dbS
4090: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
40a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
40b0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66  f pages in the f
40c0: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69  ile */.  int ori
40d0: 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20  gDbSize;        
40e0: 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62       /* dbSize b
40f0: 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  efore the curren
4100: 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e  t change */.  in
4110: 74 20 73 74 6d 74 53 69 7a 65 3b 20 20 20 20 20  t stmtSize;     
4120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
4130: 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 28 69  e of database (i
4140: 6e 20 70 61 67 65 73 29 20 61 74 20 73 74 6d 74  n pages) at stmt
4150: 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e  _begin() */.  in
4160: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
4170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4180: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
4190: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
41a0: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
41b0: 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  umInit;         
41c0: 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61       /* Quasi-ra
41d0: 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64  ndom value added
41e0: 20 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73   to every checks
41f0: 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74  um */.  int stmt
4200: 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  NRec;           
4210: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4220: 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74   records in stmt
4230: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   subjournal */. 
4240: 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20   int nExtra;    
4250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4260: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  Add this many by
4270: 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  tes to each in-m
4280: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
4290: 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20  int pageSize;   
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
42b0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
42c0: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  n a page */.  in
42d0: 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
42e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
42f0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  al number of in-
4300: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a  memory pages */.
4310: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4330: 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   Number of in-me
4340: 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74 68 20  mory pages with 
4350: 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a  PgHdr.nRef>0 */.
4360: 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20    int mxPage;   
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4380: 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
4390: 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64  of pages to hold
43a0: 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 50   in cache */.  P
43b0: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
43c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
43d0: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
43e0: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
43f0: 73 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 4a  se */.  u8 *aInJ
4400: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
4410: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
4420: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
4430: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
4440: 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 53 74  e */.  u8 *aInSt
4450: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
4460: 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f     /* One bit fo
4470: 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  r each page in t
4480: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
4490: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
44a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
44b0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
44c0: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
44d0: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
44e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
44f0: 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
4500: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  l file */.  char
4510: 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20 20 20   *zDirectory;   
4520: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63          /* Direc
4530: 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61 62 61  tory hold databa
4540: 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66  se and journal f
4550: 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  iles */.  char *
4560: 7a 53 74 6d 74 4a 72 6e 6c 3b 20 20 20 20 20 20  zStmtJrnl;      
4570: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
4580: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
4590: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
45a0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
45b0: 64 2c 20 2a 6a 66 64 3b 20 20 20 20 20 2f 2a 20  d, *jfd;     /* 
45c0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  File descriptors
45d0: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e   for database an
45e0: 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73  d journal */.  s
45f0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 74 66  qlite3_file *stf
4600: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  d;         /* Fi
4610: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
4620: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  r the statement 
4630: 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42  subjournal*/.  B
4640: 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73  usyHandler *pBus
4650: 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f  yHandler;  /* Po
4660: 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 2e  inter to sqlite.
4670: 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20  busyHandler */. 
4680: 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20 6c 72   PagerLruList lr
4690: 75 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  u;           /* 
46a0: 4c 52 55 20 6c 69 73 74 20 6f 66 20 66 72 65 65  LRU list of free
46b0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
46c0: 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20  r *pAll;        
46d0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
46e0: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
46f0: 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74 3b 20    PgHdr *pStmt; 
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4710: 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69   List of pages i
4720: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
4730: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  subjournal */.  
4740: 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b 20 20  PgHdr *pDirty;  
4750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
4760: 69 73 74 20 6f 66 20 61 6c 6c 20 64 69 72 74 79  ist of all dirty
4770: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 36 34 20   pages */.  i64 
4780: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
4790: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
47a0: 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 69  nt byte offset i
47b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
47c0: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
47d0: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
47e0: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
47f0: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
4800: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
4810: 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72 4f 66  .  i64 stmtHdrOf
4820: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
4830: 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  * First journal 
4840: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74  header written t
4850: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  his statement */
4860: 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73 75 6d  .  i64 stmtCksum
4870: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4880: 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68 65 6e  * cksumInit when
4890: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73   statement was s
48a0: 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 36 34 20  tarted */.  i64 
48b0: 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20 20  stmtJSize;      
48c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
48d0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74  of journal at st
48e0: 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20  mt_begin() */.  
48f0: 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b 20  int sectorSize; 
4900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4910: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
4920: 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ze during rollba
4930: 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ck */.#ifdef SQL
4940: 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e  ITE_TEST.  int n
4950: 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20  Hit, nMiss;     
4960: 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20         /* Cache 
4970: 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69 6e 67  hits and missing
4980: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c   */.  int nRead,
4990: 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
49a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61    /* Database pa
49b0: 67 65 73 20 72 65 61 64 2f 77 72 69 74 74 65 6e  ges read/written
49c0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69   */.#endif.  voi
49d0: 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f 72 29  d (*xDestructor)
49e0: 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20 2f  (DbPage*,int); /
49f0: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
4a00: 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e 67  ine when freeing
4a10: 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64   pages */.  void
4a20: 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62   (*xReiniter)(Db
4a30: 50 61 67 65 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a  Page*,int);   /*
4a40: 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   Call this routi
4a50: 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e  ne when reloadin
4a60: 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65  g pages */.#ifde
4a70: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4a80: 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f  EC.  void *(*xCo
4a90: 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
4aa0: 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52  ,Pgno,int); /* R
4ab0: 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65  outine for en/de
4ac0: 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20  coding data */. 
4ad0: 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67   void *pCodecArg
4ae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4af0: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
4b00: 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 23 65  o xCodec() */.#e
4b10: 6e 64 69 66 0a 20 20 69 6e 74 20 6e 48 61 73 68  ndif.  int nHash
4b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4b30: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
4b40: 65 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62  e pager hash tab
4b50: 6c 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a  le */.  PgHdr **
4b60: 61 48 61 73 68 3b 20 20 20 20 20 20 20 20 20 20  aHash;          
4b70: 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c      /* Hash tabl
4b80: 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75  e to map page nu
4b90: 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20 2a 2f  mber to PgHdr */
4ba0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
4bb0: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
4bc0: 41 47 45 4d 45 4e 54 0a 20 20 50 61 67 65 72 20  AGEMENT.  Pager 
4bd0: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
4be0: 20 20 20 20 20 20 2f 2a 20 44 6f 75 62 6c 79 20        /* Doubly 
4bf0: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70  linked list of p
4c00: 61 67 65 72 73 20 6f 6e 20 77 68 69 63 68 20 2a  agers on which *
4c10: 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 72 65 76  /.  Pager *pPrev
4c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4c30: 2f 2a 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  /* sqlite3_relea
4c40: 73 65 5f 6d 65 6d 6f 72 79 28 29 20 77 69 6c 6c  se_memory() will
4c50: 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 6e 74 20 69   work */.  int i
4c60: 49 6e 55 73 65 4d 4d 3b 20 20 20 20 20 20 20 20  InUseMM;        
4c70: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65         /* Non-ze
4c80: 72 6f 20 69 66 20 75 6e 61 76 61 69 6c 61 62 6c  ro if unavailabl
4c90: 65 20 74 6f 20 4d 4d 20 2a 2f 0a 20 20 69 6e 74  e to MM */.  int
4ca0: 20 69 49 6e 55 73 65 44 42 3b 20 20 20 20 20 20   iInUseDB;      
4cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d           /* Non-
4cc0: 7a 65 72 6f 20 69 66 20 69 6e 20 73 71 6c 69 74  zero if in sqlit
4cd0: 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  e3_release_memor
4ce0: 79 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  y() */.#endif.  
4cf0: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
4d10: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
4d20: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
4d30: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63 68   tmp use */.  ch
4d40: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
4d50: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
4d60: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
4d70: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
4d80: 67 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ges */.};../*.**
4d90: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
4da0: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
4db0: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
4dc0: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
4dd0: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
4de0: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
4df0: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
4e00: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
4e10: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
4e20: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
4e30: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
4e40: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4e50: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
4e60: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
4e70: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
4e80: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
4e90: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
4ea0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
4eb0: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
4ec0: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
4ed0: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
4ee0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
4ef0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
4f00: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
4f10: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
4f20: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
4f30: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
4f40: 6c 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  l */.int sqlite3
4f50: 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f  _pager_pgfree_co
4f60: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
4f70: 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
4f80: 61 67 65 73 20 66 72 65 65 64 20 2a 2f 0a 23 20  ages freed */.# 
4f90: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
4fa0: 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a  R(v)  v++.#else.
4fb0: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
4fc0: 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 2f  NCR(v).#endif../
4fd0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
4fe0: 6e 67 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e  ng variable poin
4ff0: 74 73 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  ts to the head o
5000: 66 20 61 20 64 6f 75 62 6c 65 2d 6c 69 6e 6b 65  f a double-linke
5010: 64 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c  d list.** of all
5020: 20 70 61 67 65 72 73 20 74 68 61 74 20 61 72 65   pagers that are
5030: 20 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61   eligible for pa
5040: 67 65 20 73 74 65 61 6c 69 6e 67 20 62 79 20 74  ge stealing by t
5050: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 72 65  he.** sqlite3_re
5060: 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 69  lease_memory() i
5070: 6e 74 65 72 66 61 63 65 2e 20 20 41 63 63 65 73  nterface.  Acces
5080: 73 20 74 6f 20 74 68 69 73 20 6c 69 73 74 20 69  s to this list i
5090: 73 0a 2a 2a 20 70 72 6f 74 65 63 74 65 64 20 62  s.** protected b
50a0: 79 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 55 54  y the SQLITE_MUT
50b0: 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 20 6d  EX_STATIC_MEM2 m
50c0: 75 74 65 78 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  utex..*/.#ifdef 
50d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
50e0: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
50f0: 73 74 61 74 69 63 20 50 61 67 65 72 20 2a 73 71  static Pager *sq
5100: 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 20 3d  lite3PagerList =
5110: 20 30 3b 0a 73 74 61 74 69 63 20 50 61 67 65 72   0;.static Pager
5120: 4c 72 75 4c 69 73 74 20 73 71 6c 69 74 65 33 4c  LruList sqlite3L
5130: 72 75 50 61 67 65 4c 69 73 74 20 3d 20 7b 30 2c  ruPageList = {0,
5140: 20 30 2c 20 30 7d 3b 0a 23 65 6e 64 69 66 0a 0a   0, 0};.#endif..
5150: 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66  ./*.** Journal f
5160: 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20  iles begin with 
5170: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
5180: 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65  gic string.  The
5190: 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74   data.** was obt
51a0: 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f  ained from /dev/
51b0: 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75  random.  It is u
51c0: 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61  sed only as a sa
51d0: 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a  nity check..**.*
51e0: 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20  * Since version 
51f0: 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e  2.8.0, the journ
5200: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69  al format contai
5210: 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  ns additional sa
5220: 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67  nity.** checking
5230: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
5240: 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c  f the power fail
5250: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
5260: 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20  nal is begin.** 
5270: 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61  written, semi-ra
5280: 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74  ndom garbage dat
5290: 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  a might appear i
52a0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
52b0: 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65   file after powe
52c0: 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20  r is restored.  
52d0: 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  If an attempt is
52e0: 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f   then made.** to
52f0: 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61   roll the journa
5300: 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  l back, the data
5310: 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f  base could be co
5320: 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64  rrupted.  The ad
5330: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69  ditional.** sani
5340: 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61  ty checking data
5350: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
5360: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67  o discover the g
5370: 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  arbage in the.**
5380: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e   journal and ign
5390: 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ore it..**.** Th
53a0: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
53b0: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
53c0: 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61  r the new journa
53d0: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74  l format consist
53e0: 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74  s.** of a 32-bit
53f0: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63   checksum on eac
5400: 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20  h page of data. 
5410: 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f   The checksum co
5420: 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65  vers both.** the
5430: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
5440: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67   the pPager->pag
5450: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
5460: 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
5470: 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20  ..** This cksum 
5480: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
5490: 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f  o a 32-bit rando
54a0: 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70  m value that app
54b0: 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  ears in the.** j
54c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68  ournal file righ
54d0: 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64  t after the head
54e0: 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20  er.  The random 
54f0: 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69  initializer is i
5500: 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63  mportant,.** bec
5510: 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74  ause garbage dat
5520: 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  a that appears a
5530: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
5540: 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79  ournal is likely
5550: 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61  .** data that wa
5560: 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20  s once in other 
5570: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
5580: 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64  now been deleted
5590: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72  .  If the.** gar
55a0: 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66  bage data came f
55b0: 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20  rom an obsolete 
55c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
55d0: 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68  e checksums migh
55e0: 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e  t.** be correct.
55f0: 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c    But by initial
5600: 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  izing the checks
5610: 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c  um to random val
5620: 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ue which.** is d
5630: 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
5640: 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d  ry journal, we m
5650: 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73  inimize that ris
5660: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  k..*/.static con
5670: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
5680: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
5690: 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64   = {.  0xd9, 0xd
56a0: 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30  5, 0x05, 0xf9, 0
56b0: 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c  x20, 0xa1, 0x63,
56c0: 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   0xd7,.};../*.**
56d0: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
56e0: 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65   header and of e
56f0: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
5700: 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72  journal is deter
5710: 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  mined.** by the 
5720: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73  following macros
5730: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
5740: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
5750: 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61  r)  ((pPager->pa
5760: 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a  geSize) + 8)../*
5770: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
5780: 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20  header size for 
5790: 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74  this pager. In t
57a0: 68 65 20 66 75 74 75 72 65 2c 20 74 68 69 73 20  he future, this 
57b0: 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20  could be.** set 
57c0: 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65  to some value re
57d0: 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ad from the disk
57e0: 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65   controller. The
57f0: 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68   important.** ch
5800: 61 72 61 63 74 65 72 69 73 74 69 63 20 69 73 20  aracteristic is 
5810: 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20 73  that it is the s
5820: 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64 69  ame size as a di
5830: 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64  sk sector..*/.#d
5840: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
5850: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50  R_SZ(pPager) (pP
5860: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
5870: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  )../*.** The mac
5880: 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65  ro MEMDB is true
5890: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
58a0: 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65  ng with an in-me
58b0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
58c0: 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20  * We do this as 
58d0: 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20  a macro so that 
58e0: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d  if the SQLITE_OM
58f0: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72  IT_MEMORYDB macr
5900: 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  o is set,.** the
5910: 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20   value of MEMDB 
5920: 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61  will be a consta
5930: 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  nt and the compi
5940: 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a  ler will optimiz
5950: 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68  e.** out code th
5960: 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65  at would never e
5970: 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  xecute..*/.#ifde
5980: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
5990: 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20  MORYDB.# define 
59a0: 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20  MEMDB 0.#else.# 
59b0: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61  define MEMDB pPa
59c0: 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69  ger->memDb.#endi
59d0: 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75  f../*.** Page nu
59e0: 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  mber PAGER_MJ_PG
59f0: 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  NO is never used
5a00: 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61   in an SQLite da
5a10: 74 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a  tabase (it is.**
5a20: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f   reserved for wo
5a30: 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77  rking around a w
5a40: 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63  indows/posix inc
5a50: 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49  ompatibility). I
5a60: 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20  t is.** used in 
5a70: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
5a80: 69 67 6e 69 66 79 20 74 68 61 74 20 74 68 65 20  ignify that the 
5a90: 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65  remainder of the
5aa0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
5ab0: 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20  * is devoted to 
5ac0: 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72  storing a master
5ad0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20   journal name - 
5ae0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
5af0: 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f  e pages to.** ro
5b00: 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d  ll back. See com
5b10: 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69  ments for functi
5b20: 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  on writeMasterJo
5b30: 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61  urnal() for deta
5b40: 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69  ils..*/./* #defi
5b50: 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  ne PAGER_MJ_PGNO
5b60: 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54  (x) (PENDING_BYT
5b70: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
5b80: 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )) */.#define PA
5b90: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28  GER_MJ_PGNO(x) (
5ba0: 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28  (PENDING_BYTE/((
5bb0: 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31  x)->pageSize))+1
5bc0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  )../*.** The max
5bd0: 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20  imum legal page 
5be0: 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20  number is (2^31 
5bf0: 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  - 1)..*/.#define
5c00: 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20   PAGER_MAX_PGNO 
5c10: 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a  2147483647../*.*
5c20: 2a 20 54 68 65 20 70 61 67 65 72 45 6e 74 65 72  * The pagerEnter
5c30: 28 29 20 61 6e 64 20 70 61 67 65 72 4c 65 61 76  () and pagerLeav
5c40: 65 28 29 20 72 6f 75 74 69 6e 65 73 20 61 63 71  e() routines acq
5c50: 75 69 72 65 20 61 6e 64 20 72 65 6c 65 61 73 65  uire and release
5c60: 0a 2a 2a 20 61 20 6d 75 74 65 78 20 6f 6e 20 65  .** a mutex on e
5c70: 61 63 68 20 70 61 67 65 72 2e 20 20 54 68 65 20  ach pager.  The 
5c80: 6d 75 74 65 78 20 69 73 20 72 65 63 75 72 73 69  mutex is recursi
5c90: 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ve..**.** This i
5ca0: 73 20 61 20 73 70 65 63 69 61 6c 2d 70 75 72 70  s a special-purp
5cb0: 6f 73 65 20 6d 75 74 65 78 2e 20 20 49 74 20 6f  ose mutex.  It o
5cc0: 6e 6c 79 20 70 72 6f 76 69 64 65 73 20 6d 75 74  nly provides mut
5cd0: 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e 0a 2a 2a  ual exclusion.**
5ce0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 42 74 72   between the Btr
5cf0: 65 65 20 61 6e 64 20 74 68 65 20 4d 65 6d 6f 72  ee and the Memor
5d00: 79 20 4d 61 6e 61 67 65 6d 65 6e 74 20 73 71 6c  y Management sql
5d10: 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
5d20: 6f 72 79 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f  ory().** functio
5d30: 6e 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  n.  It does not 
5d40: 70 72 65 76 65 6e 74 2c 20 66 6f 72 20 65 78 61  prevent, for exa
5d50: 6d 70 6c 65 2c 20 74 77 6f 20 42 74 72 65 65 73  mple, two Btrees
5d60: 20 66 72 6f 6d 20 61 63 63 65 73 73 69 6e 67 0a   from accessing.
5d70: 2a 2a 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  ** the same page
5d80: 72 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  r at the same ti
5d90: 6d 65 2e 20 20 4f 74 68 65 72 20 67 65 6e 65 72  me.  Other gener
5da0: 61 6c 2d 70 75 72 70 6f 73 65 20 6d 75 74 65 78  al-purpose mutex
5db0: 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 62 74 72  es in.** the btr
5dc0: 65 65 20 6c 61 79 65 72 20 68 61 6e 64 6c 65 20  ee layer handle 
5dd0: 74 68 61 74 20 63 68 6f 72 65 2e 0a 2a 2f 0a 23  that chore..*/.#
5de0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
5df0: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
5e00: 45 4d 45 4e 54 0a 20 20 73 74 61 74 69 63 20 76  EMENT.  static v
5e10: 6f 69 64 20 70 61 67 65 72 45 6e 74 65 72 28 50  oid pagerEnter(P
5e20: 61 67 65 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d  ager *p){.    p-
5e30: 3e 69 49 6e 55 73 65 44 42 2b 2b 3b 0a 20 20 20  >iInUseDB++;.   
5e40: 20 69 66 28 20 70 2d 3e 69 49 6e 55 73 65 4d 4d   if( p->iInUseMM
5e50: 20 26 26 20 70 2d 3e 69 49 6e 55 73 65 44 42 3d   && p->iInUseDB=
5e60: 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
5e70: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
5e80: 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 20 3d 20  ;.      mutex = 
5e90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
5ea0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
5eb0: 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20  _STATIC_MEM2);. 
5ec0: 20 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42       p->iInUseDB
5ed0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
5ee0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
5ef0: 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 70 2d  mutex);.      p-
5f00: 3e 69 49 6e 55 73 65 44 42 20 3d 20 31 3b 0a 20  >iInUseDB = 1;. 
5f10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
5f20: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b  ex_leave(mutex);
5f30: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
5f40: 74 28 20 70 2d 3e 69 49 6e 55 73 65 4d 4d 3d 3d  t( p->iInUseMM==
5f50: 30 20 29 3b 0a 20 20 7d 0a 20 20 73 74 61 74 69  0 );.  }.  stati
5f60: 63 20 76 6f 69 64 20 70 61 67 65 72 4c 65 61 76  c void pagerLeav
5f70: 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 20  e(Pager *p){.   
5f80: 20 70 2d 3e 69 49 6e 55 73 65 44 42 2d 2d 3b 0a   p->iInUseDB--;.
5f90: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
5fa0: 49 6e 55 73 65 44 42 3e 3d 30 20 29 3b 0a 20 20  InUseDB>=0 );.  
5fb0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
5fc0: 20 70 61 67 65 72 45 6e 74 65 72 28 58 29 0a 23   pagerEnter(X).#
5fd0: 20 64 65 66 69 6e 65 20 70 61 67 65 72 4c 65 61   define pagerLea
5fe0: 76 65 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ve(X).#endif../*
5ff0: 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72  .** Enable refer
6000: 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b  ence count track
6010: 69 6e 67 20 28 66 6f 72 20 64 65 62 75 67 67 69  ing (for debuggi
6020: 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66  ng) here:.*/.#if
6030: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
6040: 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f 72 65  .  int pager3_re
6050: 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30  finfo_enable = 0
6060: 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  ;.  static void 
6070: 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 50 67  pager_refinfo(Pg
6080: 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73 74 61  Hdr *p){.    sta
6090: 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  tic int cnt = 0;
60a0: 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 72 33  .    if( !pager3
60b0: 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20  _refinfo_enable 
60c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71  ) return;.    sq
60d0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
60e0: 28 0a 20 20 20 20 20 20 20 22 52 45 46 43 4e 54  (.       "REFCNT
60f0: 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20 6e 52  : %4d addr=%p nR
6100: 65 66 3d 25 2d 33 64 20 74 6f 74 61 6c 3d 25 64  ef=%-3d total=%d
6110: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70  \n",.       p->p
6120: 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  gno, PGHDR_TO_DA
6130: 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 2c 20  TA(p), p->nRef, 
6140: 70 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 0a  p->pPager->nRef.
6150: 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b      );.    cnt++
6160: 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67  ;   /* Something
6170: 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
6180: 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23  oint on */.  }.#
6190: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
61a0: 58 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66  X)  pager_refinf
61b0: 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  o(X).#else.# def
61c0: 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23  ine REFINFO(X).#
61d0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  endif../*.** Add
61e0: 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
61f0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 6e 6b   end of the link
6200: 65 64 20 6c 69 73 74 20 6d 61 6e 61 67 65 64 20  ed list managed 
6210: 62 79 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  by structure.** 
6220: 70 4c 69 73 74 20 28 70 50 67 20 62 65 63 6f 6d  pList (pPg becom
6230: 65 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  es the last entr
6240: 79 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2d 20  y in the list - 
6250: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
6260: 79 20 0a 2a 2a 20 75 73 65 64 29 2e 20 41 72 67  y .** used). Arg
6270: 75 6d 65 6e 74 20 70 4c 69 6e 6b 20 73 68 6f 75  ument pLink shou
6280: 6c 64 20 70 6f 69 6e 74 20 74 6f 20 65 69 74 68  ld point to eith
6290: 65 72 20 70 50 67 2d 3e 66 72 65 65 20 6f 72 20  er pPg->free or 
62a0: 70 50 67 2d 3e 67 66 72 65 65 2c 0a 2a 2a 20 64  pPg->gfree,.** d
62b0: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
62c0: 68 65 72 20 70 50 67 20 69 73 20 62 65 69 6e 67  her pPg is being
62d0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 61   added to the pa
62e0: 67 65 72 2d 73 70 65 63 69 66 69 63 20 6f 72 0a  ger-specific or.
62f0: 2a 2a 20 67 6c 6f 62 61 6c 20 4c 52 55 20 6c 69  ** global LRU li
6300: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
6310: 69 64 20 6c 69 73 74 41 64 64 28 50 61 67 65 72  id listAdd(Pager
6320: 4c 72 75 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  LruList *pList, 
6330: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c  PagerLruLink *pL
6340: 69 6e 6b 2c 20 50 67 48 64 72 20 2a 70 50 67 29  ink, PgHdr *pPg)
6350: 7b 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74  {.  pLink->pNext
6360: 20 3d 20 30 3b 0a 20 20 70 4c 69 6e 6b 2d 3e 70   = 0;.  pLink->p
6370: 50 72 65 76 20 3d 20 70 4c 69 73 74 2d 3e 70 4c  Prev = pList->pL
6380: 61 73 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ast;..#ifdef SQL
6390: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
63a0: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 61  Y_MANAGEMENT.  a
63b0: 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50  ssert(pLink==&pP
63c0: 67 2d 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e 6b  g->free || pLink
63d0: 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 29 3b 0a  ==&pPg->gfree);.
63e0: 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d    assert(pLink==
63f0: 26 70 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20 70  &pPg->gfree || p
6400: 4c 69 73 74 21 3d 26 73 71 6c 69 74 65 33 4c 72  List!=&sqlite3Lr
6410: 75 50 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e 64  uPageList);.#end
6420: 69 66 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  if..  if( pList-
6430: 3e 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 69 6e  >pLast ){.    in
6440: 74 20 69 4f 66 66 20 3d 20 28 63 68 61 72 20 2a  t iOff = (char *
6450: 29 70 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20 2a  )pLink - (char *
6460: 29 70 50 67 3b 0a 20 20 20 20 50 61 67 65 72 4c  )pPg;.    PagerL
6470: 72 75 4c 69 6e 6b 20 2a 70 4c 61 73 74 4c 69 6e  ruLink *pLastLin
6480: 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e  k = (PagerLruLin
6490: 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c 69  k *)(&((u8 *)pLi
64a0: 73 74 2d 3e 70 4c 61 73 74 29 5b 69 4f 66 66 5d  st->pLast)[iOff]
64b0: 29 3b 0a 20 20 20 20 70 4c 61 73 74 4c 69 6e 6b  );.    pLastLink
64c0: 2d 3e 70 4e 65 78 74 20 3d 20 70 50 67 3b 0a 20  ->pNext = pPg;. 
64d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
64e0: 72 74 28 21 70 4c 69 73 74 2d 3e 70 46 69 72 73  rt(!pList->pFirs
64f0: 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  t);.    pList->p
6500: 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 7d  First = pPg;.  }
6510: 0a 0a 20 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74  ..  pList->pLast
6520: 20 3d 20 70 50 67 3b 0a 20 20 69 66 28 20 21 70   = pPg;.  if( !p
6530: 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63  List->pFirstSync
6540: 65 64 20 26 26 20 70 50 67 2d 3e 6e 65 65 64 53  ed && pPg->needS
6550: 79 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ync==0 ){.    pL
6560: 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ist->pFirstSynce
6570: 64 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a  d = pPg;.  }.}..
6580: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 50 67  /*.** Remove pPg
6590: 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6d   from the list m
65a0: 61 6e 61 67 65 64 20 62 79 20 74 68 65 20 73 74  anaged by the st
65b0: 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
65c0: 74 6f 20 62 79 20 70 4c 69 73 74 2e 0a 2a 2a 0a  to by pList..**.
65d0: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 69 6e  ** Argument pLin
65e0: 6b 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74  k should point t
65f0: 6f 20 65 69 74 68 65 72 20 70 50 67 2d 3e 66 72  o either pPg->fr
6600: 65 65 20 6f 72 20 70 50 67 2d 3e 67 66 72 65 65  ee or pPg->gfree
6610: 2c 20 64 65 70 65 6e 64 69 6e 67 20 0a 2a 2a 20  , depending .** 
6620: 6f 6e 20 77 68 65 74 68 65 72 20 70 50 67 20 69  on whether pPg i
6630: 73 20 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f  s being added to
6640: 20 74 68 65 20 70 61 67 65 72 2d 73 70 65 63 69   the pager-speci
6650: 66 69 63 20 6f 72 20 67 6c 6f 62 61 6c 20 4c 52  fic or global LR
6660: 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  U list..*/.stati
6670: 63 20 76 6f 69 64 20 6c 69 73 74 52 65 6d 6f 76  c void listRemov
6680: 65 28 50 61 67 65 72 4c 72 75 4c 69 73 74 20 2a  e(PagerLruList *
6690: 70 4c 69 73 74 2c 20 50 61 67 65 72 4c 72 75 4c  pList, PagerLruL
66a0: 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20 50 67 48 64  ink *pLink, PgHd
66b0: 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 69  r *pPg){.  int i
66c0: 4f 66 66 20 3d 20 28 63 68 61 72 20 2a 29 70 4c  Off = (char *)pL
66d0: 69 6e 6b 20 2d 20 28 63 68 61 72 20 2a 29 70 50  ink - (char *)pP
66e0: 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  g;..#ifdef SQLIT
66f0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
6700: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 61 73 73  MANAGEMENT.  ass
6710: 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d  ert(pLink==&pPg-
6720: 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e 6b 3d 3d  >free || pLink==
6730: 26 70 50 67 2d 3e 67 66 72 65 65 29 3b 0a 20 20  &pPg->gfree);.  
6740: 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70  assert(pLink==&p
6750: 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20 70 4c 69  Pg->gfree || pLi
6760: 73 74 21 3d 26 73 71 6c 69 74 65 33 4c 72 75 50  st!=&sqlite3LruP
6770: 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66  ageList);.#endif
6780: 0a 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 4c 69  ..  if( pPg==pLi
6790: 73 74 2d 3e 70 46 69 72 73 74 20 29 7b 0a 20 20  st->pFirst ){.  
67a0: 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 20    pList->pFirst 
67b0: 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLink->pNext;.
67c0: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 70    }.  if( pPg==p
67d0: 4c 69 73 74 2d 3e 70 4c 61 73 74 20 29 7b 0a 20  List->pLast ){. 
67e0: 20 20 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20     pList->pLast 
67f0: 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 3b 0a  = pLink->pPrev;.
6800: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 6e 6b 2d    }.  if( pLink-
6810: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 50 61  >pPrev ){.    Pa
6820: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 50 72 65  gerLruLink *pPre
6830: 76 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72  vLink = (PagerLr
6840: 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a  uLink *)(&((u8 *
6850: 29 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 29 5b 69  )pLink->pPrev)[i
6860: 4f 66 66 5d 29 3b 0a 20 20 20 20 70 50 72 65 76  Off]);.    pPrev
6870: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 4c  Link->pNext = pL
6880: 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ink->pNext;.  }.
6890: 20 20 69 66 28 20 70 4c 69 6e 6b 2d 3e 70 4e 65    if( pLink->pNe
68a0: 78 74 20 29 7b 0a 20 20 20 20 50 61 67 65 72 4c  xt ){.    PagerL
68b0: 72 75 4c 69 6e 6b 20 2a 70 4e 65 78 74 4c 69 6e  ruLink *pNextLin
68c0: 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e  k = (PagerLruLin
68d0: 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c 69  k *)(&((u8 *)pLi
68e0: 6e 6b 2d 3e 70 4e 65 78 74 29 5b 69 4f 66 66 5d  nk->pNext)[iOff]
68f0: 29 3b 0a 20 20 20 20 70 4e 65 78 74 4c 69 6e 6b  );.    pNextLink
6900: 2d 3e 70 50 72 65 76 20 3d 20 70 4c 69 6e 6b 2d  ->pPrev = pLink-
6910: 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66  >pPrev;.  }.  if
6920: 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70 46  ( pPg==pList->pF
6930: 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20  irstSynced ){.  
6940: 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 4c 69    PgHdr *p = pLi
6950: 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 77  nk->pNext;.    w
6960: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65  hile( p && p->ne
6970: 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
6980: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c  PagerLruLink *pL
6990: 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b   = (PagerLruLink
69a0: 20 2a 29 28 26 28 28 75 38 20 2a 29 70 29 5b 69   *)(&((u8 *)p)[i
69b0: 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 70 20 3d  Off]);.      p =
69c0: 20 70 4c 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20   pL->pNext;.    
69d0: 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69  }.    pList->pFi
69e0: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
69f0: 20 7d 0a 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65   }..  pLink->pNe
6a00: 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65  xt = pLink->pPre
6a10: 76 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  v = 0;.}../* .**
6a20: 20 41 64 64 20 70 61 67 65 20 70 50 67 20 74 6f   Add page pPg to
6a30: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65   the list of fre
6a40: 65 20 70 61 67 65 73 20 66 6f 72 20 74 68 65 20  e pages for the 
6a50: 70 61 67 65 72 2e 20 49 66 20 0a 2a 2a 20 6d 65  pager. If .** me
6a60: 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
6a70: 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c 73 6f  is enabled, also
6a80: 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f   add the page to
6a90: 20 74 68 65 20 67 6c 6f 62 61 6c 20 0a 2a 2a 20   the global .** 
6aa0: 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67  list of free pag
6ab0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
6ac0: 69 64 20 6c 72 75 4c 69 73 74 41 64 64 28 50 67  id lruListAdd(Pg
6ad0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 6c 69 73  Hdr *pPg){.  lis
6ae0: 74 41 64 64 28 26 70 50 67 2d 3e 70 50 61 67 65  tAdd(&pPg->pPage
6af0: 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d 3e 66 72  r->lru, &pPg->fr
6b00: 65 65 2c 20 70 50 67 29 3b 0a 23 69 66 64 65 66  ee, pPg);.#ifdef
6b10: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
6b20: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
6b30: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 70 50 61  .  if( !pPg->pPa
6b40: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
6b50: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6b60: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75  enter(sqlite3_mu
6b70: 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
6b80: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52  _MUTEX_STATIC_LR
6b90: 55 29 29 3b 0a 20 20 20 20 6c 69 73 74 41 64 64  U));.    listAdd
6ba0: 28 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  (&sqlite3LruPage
6bb0: 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67 66 72 65  List, &pPg->gfre
6bc0: 65 2c 20 70 50 67 29 3b 0a 20 20 20 20 73 71 6c  e, pPg);.    sql
6bd0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6be0: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
6bf0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
6c00: 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
6c10: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
6c20: 20 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 61 67 65   .** Remove page
6c30: 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20 6c 69   pPg from the li
6c40: 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73  st of free pages
6c50: 20 66 6f 72 20 74 68 65 20 61 73 73 6f 63 69 61   for the associa
6c60: 74 65 64 20 70 61 67 65 72 2e 0a 2a 2a 20 49 66  ted pager..** If
6c70: 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65   memory-manageme
6c80: 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61  nt is enabled, a
6c90: 6c 73 6f 20 72 65 6d 6f 76 65 20 70 50 67 20 66  lso remove pPg f
6ca0: 72 6f 6d 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c  rom the global l
6cb0: 69 73 74 0a 2a 2a 20 6f 66 20 66 72 65 65 20 70  ist.** of free p
6cc0: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
6cd0: 76 6f 69 64 20 6c 72 75 4c 69 73 74 52 65 6d 6f  void lruListRemo
6ce0: 76 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ve(PgHdr *pPg){.
6cf0: 20 20 6c 69 73 74 52 65 6d 6f 76 65 28 26 70 50    listRemove(&pP
6d00: 67 2d 3e 70 50 61 67 65 72 2d 3e 6c 72 75 2c 20  g->pPager->lru, 
6d10: 26 70 50 67 2d 3e 66 72 65 65 2c 20 70 50 67 29  &pPg->free, pPg)
6d20: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6d30: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
6d40: 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NAGEMENT.  if( !
6d50: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d  pPg->pPager->mem
6d60: 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Db ){.    sqlite
6d70: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71  3_mutex_enter(sq
6d80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
6d90: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
6da0: 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20  TATIC_LRU));.   
6db0: 20 6c 69 73 74 52 65 6d 6f 76 65 28 26 73 71 6c   listRemove(&sql
6dc0: 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2c  ite3LruPageList,
6dd0: 20 26 70 50 67 2d 3e 67 66 72 65 65 2c 20 70 50   &pPg->gfree, pP
6de0: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g);.    sqlite3_
6df0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
6e00: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
6e10: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
6e20: 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23  TIC_LRU));.  }.#
6e30: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  endif.}../* .** 
6e40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
6e50: 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 61 66 74   called just aft
6e60: 65 72 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  er the needSync 
6e70: 66 6c 61 67 20 68 61 73 20 62 65 65 6e 20 63 6c  flag has been cl
6e80: 65 61 72 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 6c  eared.** from al
6e90: 6c 20 70 61 67 65 73 20 6d 61 6e 61 67 65 64 20  l pages managed 
6ea0: 62 79 20 70 50 61 67 65 72 20 28 75 73 75 61 6c  by pPager (usual
6eb0: 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6a  ly because the j
6ec0: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68  ournal file.** h
6ed0: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 79 6e  as just been syn
6ee0: 63 65 64 29 2e 20 49 74 20 75 70 64 61 74 65 73  ced). It updates
6ef0: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6c 72 75   the pPager->lru
6f00: 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 76 61  .pFirstSynced va
6f10: 72 69 61 62 6c 65 0a 2a 2a 20 61 6e 64 2c 20 69  riable.** and, i
6f20: 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d  f memory-managem
6f30: 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ent is enabled, 
6f40: 74 68 65 20 73 71 6c 69 74 65 33 4c 72 75 50 61  the sqlite3LruPa
6f50: 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e  geList.pFirstSyn
6f60: 63 65 64 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ced.** variable 
6f70: 61 6c 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  also..*/.static 
6f80: 76 6f 69 64 20 6c 72 75 4c 69 73 74 53 65 74 46  void lruListSetF
6f90: 69 72 73 74 53 79 6e 63 65 64 28 50 61 67 65 72  irstSynced(Pager
6fa0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70 50 61   *pPager){.  pPa
6fb0: 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53  ger->lru.pFirstS
6fc0: 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
6fd0: 6c 72 75 2e 70 46 69 72 73 74 3b 0a 23 69 66 64  lru.pFirst;.#ifd
6fe0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6ff0: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
7000: 4e 54 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  NT.  if( !pPager
7010: 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 50  ->memDb ){.    P
7020: 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 73 71 6c  gHdr *p;.    sql
7030: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
7040: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
7050: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
7060: 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
7070: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
7080: 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69  3LruPageList.pFi
7090: 72 73 74 3b 20 70 20 26 26 20 70 2d 3e 6e 65 65  rst; p && p->nee
70a0: 64 53 79 6e 63 3b 20 70 3d 70 2d 3e 67 66 72 65  dSync; p=p->gfre
70b0: 65 2e 70 4e 65 78 74 29 3b 0a 20 20 20 20 61 73  e.pNext);.    as
70c0: 73 65 72 74 28 70 3d 3d 70 50 61 67 65 72 2d 3e  sert(p==pPager->
70d0: 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64  lru.pFirstSynced
70e0: 20 7c 7c 20 70 3d 3d 73 71 6c 69 74 65 33 4c 72   || p==sqlite3Lr
70f0: 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74  uPageList.pFirst
7100: 53 79 6e 63 65 64 29 3b 0a 20 20 20 20 73 71 6c  Synced);.    sql
7110: 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e  ite3LruPageList.
7120: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
7130: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
7140: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
7150: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
7160: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
7170: 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23 65 6e  C_LRU));.  }.#en
7180: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
7190: 75 72 6e 20 74 72 75 65 20 69 66 20 70 61 67 65  urn true if page
71a0: 20 2a 70 50 67 20 68 61 73 20 61 6c 72 65 61 64   *pPg has alread
71b0: 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
71c0: 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  o the statement.
71d0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 6f 72 20 73  ** journal (or s
71e0: 74 61 74 65 6d 65 6e 74 20 73 6e 61 70 73 68 6f  tatement snapsho
71f0: 74 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  t has been creat
7200: 65 64 2c 20 69 66 20 2a 70 50 67 20 69 73 20 70  ed, if *pPg is p
7210: 61 72 74 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d  art.** of an in-
7220: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 29  memory database)
7230: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7240: 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28  pageInStatement(
7250: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
7260: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
7270: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
7280: 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72  ( MEMDB ){.    r
7290: 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 48  eturn PGHDR_TO_H
72a0: 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
72b0: 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20 7d 65 6c 73  ->inStmt;.  }els
72c0: 65 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  e{.    Pgno pgno
72d0: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
72e0: 20 20 75 38 20 2a 61 20 3d 20 70 50 61 67 65 72    u8 *a = pPager
72f0: 2d 3e 61 49 6e 53 74 6d 74 3b 0a 20 20 20 20 72  ->aInStmt;.    r
7300: 65 74 75 72 6e 20 28 61 20 26 26 20 28 69 6e 74  eturn (a && (int
7310: 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  )pgno<=pPager->s
7320: 74 6d 74 53 69 7a 65 20 26 26 20 28 61 5b 70 67  tmtSize && (a[pg
7330: 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e  no/8] & (1<<(pgn
7340: 6f 26 37 29 29 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  o&7))));.  }.}..
7350: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
7360: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   size of the pag
7370: 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  er hash table to
7380: 20 4e 2e 20 20 4e 20 6d 75 73 74 20 62 65 20 61   N.  N must be a
7390: 20 70 6f 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f   power.** of two
73a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
73b0: 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61   pager_resize_ha
73c0: 73 68 5f 74 61 62 6c 65 28 50 61 67 65 72 20 2a  sh_table(Pager *
73d0: 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a  pPager, int N){.
73e0: 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68 2c    PgHdr **aHash,
73f0: 20 2a 70 50 67 3b 0a 20 20 61 73 73 65 72 74 28   *pPg;.  assert(
7400: 20 4e 3e 30 20 26 26 20 28 4e 26 28 4e 2d 31 29   N>0 && (N&(N-1)
7410: 29 3d 3d 30 20 29 3b 0a 20 20 70 61 67 65 72 4c  )==0 );.  pagerL
7420: 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
7430: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 42 65 6e  sqlite3MallocBen
7440: 69 67 6e 46 61 69 6c 75 72 65 28 28 69 6e 74 29  ignFailure((int)
7450: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a  pPager->aHash);.
7460: 20 20 61 48 61 73 68 20 3d 20 73 71 6c 69 74 65    aHash = sqlite
7470: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
7480: 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e 20  eof(aHash[0])*N 
7490: 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  );.  pagerEnter(
74a0: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 61  pPager);.  if( a
74b0: 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Hash==0 ){.    /
74c0: 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65 68  * Failure to reh
74d0: 61 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65 72  ash is not an er
74e0: 72 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ror.  It is only
74f0: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68   a performance h
7500: 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  it. */.    retur
7510: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
7520: 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48  _free(pPager->aH
7530: 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ash);.  pPager->
7540: 6e 48 61 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61  nHash = N;.  pPa
7550: 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 61 48 61  ger->aHash = aHa
7560: 73 68 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  sh;.  for(pPg=pP
7570: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
7580: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
7590: 6c 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a  ll){.    int h;.
75a0: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
75b0: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  o==0 ){.      as
75c0: 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
75d0: 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e  Hash==0 && pPg->
75e0: 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
75f0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
7600: 20 20 20 20 7d 0a 20 20 20 20 68 20 3d 20 70 50      }.    h = pP
7610: 67 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b  g->pgno & (N-1);
7620: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
7630: 61 73 68 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a  ash = aHash[h];.
7640: 20 20 20 20 69 66 28 20 61 48 61 73 68 5b 68 5d      if( aHash[h]
7650: 20 29 7b 0a 20 20 20 20 20 20 61 48 61 73 68 5b   ){.      aHash[
7660: 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  h]->pPrevHash = 
7670: 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  pPg;.    }.    a
7680: 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
7690: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73     pPg->pPrevHas
76a0: 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  h = 0;.  }.}../*
76b0: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
76c0: 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  t integer from t
76d0: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
76e0: 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65  scriptor.  Store
76f0: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
7700: 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20  that is read in 
7710: 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53  *pRes.  Return S
7720: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
7730: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f  ything worked, o
7740: 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  r an.** error co
7750: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
7760: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
7770: 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65  * All values are
7780: 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20   stored on disk 
7790: 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a  as big-endian..*
77a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
77b0: 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  d32bits(sqlite3_
77c0: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
77d0: 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29  fset, u32 *pRes)
77e0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
77f0: 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72  r ac[4];.  int r
7800: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
7810: 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66  d(fd, ac, sizeof
7820: 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20  (ac), offset);. 
7830: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7840: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  OK ){.    *pRes 
7850: 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
7860: 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(ac);.  }.  ret
7870: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7880: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
7890: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
78a0: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
78b0: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
78c0: 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  order..*/.#defin
78d0: 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29  e put32bits(A,B)
78e0: 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74    sqlite3Put4byt
78f0: 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a  e((u8*)A,B)../*.
7900: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
7910: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74  t integer into t
7920: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
7930: 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72  scriptor.  Retur
7940: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
7950: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
7960: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
7970: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
7980: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
7990: 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71  t write32bits(sq
79a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
79b0: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
79c0: 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b  val){.  char ac[
79d0: 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  4];.  put32bits(
79e0: 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75  ac, val);.  retu
79f0: 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  rn sqlite3OsWrit
7a00: 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66  e(fd, ac, 4, off
7a10: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  set);.}../*.** I
7a20: 66 20 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70  f file pFd is op
7a30: 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  en, call sqlite3
7a40: 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74  OsUnlock() on it
7a50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7a60: 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  osUnlock(sqlite3
7a70: 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20  _file *pFd, int 
7a80: 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 70  eLock){.  if( !p
7a90: 46 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  Fd->pMethods ){.
7aa0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7ab0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
7ac0: 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  rn sqlite3OsUnlo
7ad0: 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a  ck(pFd, eLock);.
7ae0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
7af0: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
7b00: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
7b10: 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
7b20: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
7b30: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69  * can be used wi
7b40: 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54  th this pager. T
7b50: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
7b60: 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a  can be used if:.
7b70: 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76  **.**  (a) the v
7b80: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
7b90: 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74   OsDeviceCharact
7ba0: 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63  eristics() indic
7bb0: 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  ates that.**    
7bc0: 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67    a database pag
7bd0: 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  e may be written
7be0: 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64   atomically, and
7bf0: 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c  .**  (b) the val
7c00: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
7c10: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73  sSectorSize() is
7c20: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
7c30: 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ual.**      to t
7c40: 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
7c50: 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d  .** If the optim
7c60: 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ization cannot b
7c70: 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74  e used, 0 is ret
7c80: 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e  urned. If it can
7c90: 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65   be used,.** the
7ca0: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
7cb0: 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65  rned is the size
7cc0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
7cd0: 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20  file when it.** 
7ce0: 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63  contains rollbac
7cf0: 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74  k data for exact
7d00: 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a  ly one page..*/.
7d10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
7d20: 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
7d30: 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e  E.static int jrn
7d40: 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65  lBufferSize(Page
7d50: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
7d60: 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20  t dc;           
7d70: 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63  /* Device charac
7d80: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 69  teristics */.  i
7d90: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
7da0: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
7db0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
7dc0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73         /* Page s
7dd0: 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ize */.  sqlite3
7de0: 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67  _file *fd = pPag
7df0: 65 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66  er->fd;..  if( f
7e00: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
7e10: 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f     dc = sqlite3O
7e20: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
7e30: 69 73 74 69 63 73 28 66 64 29 3b 0a 20 20 20 20  istics(fd);.    
7e40: 6e 53 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nSector = sqlite
7e50: 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66 64  3OsSectorSize(fd
7e60: 29 3b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 70  );.    nPage = p
7e70: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
7e80: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 53  .  }..  assert(S
7e90: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
7ea0: 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
7eb0: 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49 54  ;.  assert(SQLIT
7ec0: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
7ed0: 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
7ee0: 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d 65 74  .  if( !fd->pMet
7ef0: 68 6f 64 73 20 7c 7c 20 28 64 63 26 28 53 51 4c  hods || (dc&(SQL
7f00: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
7f10: 7c 28 6e 50 61 67 65 3e 3e 38 29 29 26 26 6e 53  |(nPage>>8))&&nS
7f20: 65 63 74 6f 72 3c 3d 6e 50 61 67 65 29 20 29 7b  ector<=nPage) ){
7f30: 0a 20 20 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  .    return JOUR
7f40: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
7f50: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
7f60: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
7f70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
7f80: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
7f90: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
7fa0: 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
7fb0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
7fc0: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 72  within the pager
7fd0: 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69  .** code. The fi
7fe0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
7ff0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
8000: 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65   pager structure
8010: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
8020: 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
8030: 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
8040: 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41  ned by a pager A
8050: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  PI function. .**
8060: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
8070: 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
8080: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
8090: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
80a0: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
80b0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
80c0: 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49  ment is SQLITE_I
80d0: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
80e0: 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f  RUPT, or SQLITE_
80f0: 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  FULL.** the erro
8100: 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73  r becomes persis
8110: 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20  tent. Until the 
8120: 70 65 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20  persisten error 
8130: 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73  is cleared,.** s
8140: 75 62 73 65 71 75 65 6e 74 20 41 50 49 20 63 61  ubsequent API ca
8150: 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65  lls on this Page
8160: 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  r will immediate
8170: 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ly return the sa
8180: 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  me .** error cod
8190: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69  e..**.** A persi
81a0: 73 74 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69  stent error indi
81b0: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63  cates that the c
81c0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
81d0: 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63  ager-cache .** c
81e0: 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
81f0: 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e  . This state can
8200: 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63   be cleared by c
8210: 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72  ompletely discar
8220: 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ding .** the con
8230: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
8240: 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74  er-cache. If a t
8250: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61  ransaction was a
8260: 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68  ctive when.** th
8270: 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  e persistent err
8280: 6f 72 20 6f 63 63 75 72 65 64 2c 20 74 68 65 6e  or occured, then
8290: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
82a0: 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a  urnal may need.*
82b0: 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64  * to be replayed
82c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
82d0: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61   pager_unlock(Pa
82e0: 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 73 74  ger *pPager);.st
82f0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
8300: 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
8310: 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
8320: 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
8330: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20  ff;.  assert(.  
8340: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
8350: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
8360: 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67  L ||.       pPag
8370: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
8380: 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20  ITE_OK ||.      
8390: 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   (pPager->errCod
83a0: 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54  e & 0xff)==SQLIT
83b0: 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69  E_IOERR.  );.  i
83c0: 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49  f(.    rc2==SQLI
83d0: 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72  TE_FULL ||.    r
83e0: 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  c2==SQLITE_IOERR
83f0: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
8400: 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b  ITE_CORRUPT.  ){
8410: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
8420: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 69  Code = rc;.    i
8430: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
8440: 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 26  ==PAGER_UNLOCK &
8450: 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  & pPager->nRef==
8460: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
8470: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   the pager is al
8480: 72 65 61 64 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ready unlocked, 
8490: 63 61 6c 6c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  call pager_unloc
84a0: 6b 28 29 20 6e 6f 77 20 74 6f 0a 20 20 20 20 20  k() now to.     
84b0: 20 2a 2a 20 63 6c 65 61 72 20 74 68 65 20 65 72   ** clear the er
84c0: 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 65 6e  ror state and en
84d0: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61  sure that the pa
84e0: 67 65 72 2d 63 61 63 68 65 20 69 73 20 0a 20 20  ger-cache is .  
84f0: 20 20 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c      ** completel
8500: 79 20 65 6d 70 74 79 2e 0a 20 20 20 20 20 20 2a  y empty..      *
8510: 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e  /.      pager_un
8520: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
8530: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8540: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
8550: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
8560: 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74  GES is defined t
8570: 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73  hen we do some s
8580: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a  anity checking.*
8590: 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75  * on the cache u
85a0: 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63  sing a hash func
85b0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75  tion.  This is u
85c0: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a  sed for testing.
85d0: 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ** and debugging
85e0: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66   only..*/.#ifdef
85f0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
8600: 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  GES./*.** Return
8610: 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f   a 32-bit hash o
8620: 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  f the page data 
8630: 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74  for pPage..*/.st
8640: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64  atic u32 pager_d
8650: 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74  atahash(int nByt
8660: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
8670: 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *pData){.  u32 
8680: 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20  hash = 0;.  int 
8690: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
86a0: 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nByte; i++){.   
86b0: 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30   hash = (hash*10
86c0: 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a  39) + pData[i];.
86d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
86e0: 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20  h;.}.static u32 
86f0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50  pager_pagehash(P
8700: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
8710: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74  return pager_dat
8720: 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61  ahash(pPage->pPa
8730: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 0a  ger->pageSize, .
8740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8750: 20 20 20 20 20 20 20 20 28 75 6e 73 69 67 6e 65          (unsigne
8760: 64 20 63 68 61 72 20 2a 29 50 47 48 44 52 5f 54  d char *)PGHDR_T
8770: 4f 5f 44 41 54 41 28 70 50 61 67 65 29 29 3b 0a  O_DATA(pPage));.
8780: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
8790: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
87a0: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
87b0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
87c0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
87d0: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
87e0: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
87f0: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
8800: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
8810: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
8820: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
8830: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
8840: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
8850: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
8860: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
8870: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
8880: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
8890: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
88a0: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
88b0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
88c0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
88d0: 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61  assert( !pPg->pa
88e0: 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72  geHash || pPager
88f0: 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d  ->errCode || MEM
8900: 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79  DB || pPg->dirty
8910: 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e   || .      pPg->
8920: 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f  pageHash==pager_
8930: 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b  pagehash(pPg) );
8940: 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  .}..#else.#defin
8950: 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  e pager_datahash
8960: 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65  (X,Y)  0.#define
8970: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
8980: 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 43 48  X)  0.#define CH
8990: 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64  ECK_PAGE(x).#end
89a0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  if../*.** When t
89b0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
89c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
89d0: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
89e0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
89f0: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
8a00: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
8a10: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 65   read from the e
8a20: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
8a30: 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69  nd .** written i
8a40: 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c  nto memory suppl
8a50: 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ied by the calle
8a60: 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65  r. .**.** zMaste
8a70: 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  r must point to 
8a80: 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c  a buffer of at l
8a90: 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74  east nMaster byt
8aa0: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  es allocated by.
8ab0: 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  ** the caller. T
8ac0: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71  his should be sq
8ad0: 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
8ae0: 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72  name+1 (to ensur
8af0: 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e  e there is.** en
8b00: 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77 72  ough space to wr
8b10: 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
8b20: 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66  ournal name). If
8b30: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8b40: 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74  nal.** name in t
8b50: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f  he journal is lo
8b60: 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65  nger than nMaste
8b70: 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69  r bytes (includi
8b80: 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  ng a.** nul-term
8b90: 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68  inator), then th
8ba0: 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73  is is handled as
8bb0: 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   if no master jo
8bc0: 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65  urnal name.** we
8bd0: 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  re present in th
8be0: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
8bf0: 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   If no master jo
8c00: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
8c10: 69 73 20 70 72 65 73 65 6e 74 20 7a 4d 61 73 74  is present zMast
8c20: 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20  er[0] is set to 
8c30: 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  0 and.** SQLITE_
8c40: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
8c50: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
8c60: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c  asterJournal(sql
8c70: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c  ite3_file *pJrnl
8c80: 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  , char *zMaster,
8c90: 20 69 6e 74 20 6e 4d 61 73 74 65 72 29 7b 0a 20   int nMaster){. 
8ca0: 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c   int rc;.  u32 l
8cb0: 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20  en;.  i64 szJ;. 
8cc0: 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e   u32 cksum;.  in
8cd0: 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t i;.  unsigned 
8ce0: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
8cf0: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
8d00: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
8d10: 61 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61 73 74  ader */..  zMast
8d20: 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  er[0] = '\0';.. 
8d30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
8d40: 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26  ileSize(pJrnl, &
8d50: 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
8d60: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a  SQLITE_OK || szJ
8d70: 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b  <16 ) return rc;
8d80: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
8d90: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
8da0: 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20  6, &len);.  if( 
8db0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
8dc0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66  return rc;..  if
8dd0: 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 29  ( len>=nMaster )
8de0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8df0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72  ITE_OK;.  }..  r
8e00: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8e10: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63  Jrnl, szJ-12, &c
8e20: 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21  ksum);.  if( rc!
8e30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
8e40: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
8e50: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
8e60: 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  rnl, aMagic, 8, 
8e70: 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28 20 72 63  szJ-8);.  if( rc
8e80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d  !=SQLITE_OK || m
8e90: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
8ea0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
8eb0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
8ec0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
8ed0: 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65  ad(pJrnl, zMaste
8ee0: 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c  r, len, szJ-16-l
8ef0: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
8f00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8f10: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
8f20: 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20   zMaster[len] = 
8f30: 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53 65 65 20  '\0';..  /* See 
8f40: 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  if the checksum 
8f50: 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74  matches the mast
8f60: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
8f70: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
8f80: 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  len; i++){.    c
8f90: 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b  ksum -= zMaster[
8fa0: 69 5d 3b 0a 20 20 20 7d 0a 20 20 69 66 28 20 63  i];.   }.  if( c
8fb0: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
8fc0: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
8fd0: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
8fe0: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
8ff0: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
9000: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
9010: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
9020: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
9030: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
9040: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
9050: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
9060: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
9070: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9080: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
9090: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
90a0: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
90b0: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a  me..    */.    z
90c0: 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27  Master[0] = '\0'
90d0: 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74 75  ;.  }.   .  retu
90e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
90f0: 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20  ./*.** Seek the 
9100: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
9110: 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 6e  criptor to the n
9120: 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
9130: 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a  ary where a.** j
9140: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d 61  ournal header ma
9150: 79 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69  y be read or wri
9160: 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72  tten. Pager.jour
9170: 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74 65  nalOff is update
9180: 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65  d with.** the ne
9190: 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a  w seek offset..*
91a0: 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73  *.** i.e for a s
91b0: 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31  ector size of 51
91c0: 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f  2:.**.** Input O
91d0: 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20  ffset           
91e0: 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65 74     Output Offset
91f0: 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
9200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30  -----------.** 0
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9230: 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35 31           0.** 51
9240: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
9250: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 31          512.** 1
9260: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
9270: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
9280: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
9290: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
92a0: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  * .*/.static voi
92b0: 64 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  d seekJournalHdr
92c0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
92d0: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20  .  i64 offset = 
92e0: 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61  0;.  i64 c = pPa
92f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
9300: 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20  .  if( c ){.    
9310: 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f  offset = ((c-1)/
9320: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9330: 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f  Pager) + 1) * JO
9340: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
9350: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ger);.  }.  asse
9360: 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e  rt( offset%JOURN
9370: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9380: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
9390: 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20  ( offset>=c );. 
93a0: 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74   assert( (offset
93b0: 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -c)<JOURNAL_HDR_
93c0: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
93d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
93e0: 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a  ff = offset;.}..
93f0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
9400: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
9410: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
9420: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
9430: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
9440: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
9450: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
9460: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
9470: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
9480: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
9490: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
94a0: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
94b0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
94c0: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
94d0: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
94e0: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
94f0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
9500: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
9510: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
9520: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
9530: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
9540: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
9550: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
9560: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
9570: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
9580: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
9590: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
95a0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
95b0: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
95c0: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
95d0: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
95e0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46  ournal..** .** F
95f0: 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52  ollowed by (JOUR
9600: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29  NAL_HDR_SZ - 24)
9610: 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64   bytes of unused
9620: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
9630: 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e  c int writeJourn
9640: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
9650: 67 65 72 29 7b 0a 20 20 63 68 61 72 20 7a 48 65  ger){.  char zHe
9660: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
9670: 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 3b 0a  rnalMagic)+16];.
9680: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
9690: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
96a0: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  Off==0 ){.    pP
96b0: 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
96c0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
96d0: 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 73 65  alOff;.  }..  se
96e0: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  ekJournalHdr(pPa
96f0: 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
9700: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
9710: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
9720: 0a 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64  ..  memcpy(zHead
9730: 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  er, aJournalMagi
9740: 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
9750: 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20 20 2f 2a  alMagic));..  /*
9760: 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65   .  ** Write the
9770: 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68   nRec Field - th
9780: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
9790: 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f   records that fo
97a0: 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a  llow this.  ** j
97b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e  ournal header. N
97c0: 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73  ormally, zero is
97d0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73   written to this
97e0: 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20 74   value at this t
97f0: 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20  ime..  ** After 
9800: 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65 20  the records are 
9810: 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75  added to the jou
9820: 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f  rnal (and the jo
9830: 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20  urnal synced, . 
9840: 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73   ** if in full-s
9850: 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a  ync mode), the z
9860: 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74  ero is overwritt
9870: 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75 65  en with the true
9880: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20   number.  ** of 
9890: 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e  records (see syn
98a0: 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a  cJournal())..  *
98b0: 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20  *.  ** A faster 
98c0: 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20 74  alternative is t
98d0: 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46 46  o write 0xFFFFFF
98e0: 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66  FF to the nRec f
98f0: 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20  ield. When.  ** 
9900: 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72  reading the jour
9910: 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74  nal this value t
9920: 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61  ells SQLite to a
9930: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20  ssume that the. 
9940: 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20   ** rest of the 
9950: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
9960: 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65  tains valid page
9970: 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61   records. This a
9980: 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69  ssumption.  ** i
9990: 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20  s dangerous, as 
99a0: 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
99b0: 75 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74  ured whilst writ
99c0: 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
99d0: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20  al.  ** file it 
99e0: 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65  may contain some
99f0: 20 67 61 72 62 61 67 65 20 64 61 74 61 2e 20 54   garbage data. T
9a00: 68 65 72 65 20 61 72 65 20 74 77 6f 20 73 63 65  here are two sce
9a10: 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72  narios.  ** wher
9a20: 65 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20  e this risk can 
9a30: 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a  be ignored:.  **
9a40: 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74  .  **   * When t
9a50: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e  he pager is in n
9a60: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72  o-sync mode. Cor
9a70: 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c  ruption can foll
9a80: 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f  ow a.  **     po
9a90: 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74  wer failure in t
9aa0: 68 69 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e  his case anyway.
9ab0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
9ac0: 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49  hen the SQLITE_I
9ad0: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
9ae0: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68   flag is set. Th
9af0: 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20  is guarantees.  
9b00: 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61 72 62  **     that garb
9b10: 61 67 65 20 64 61 74 61 20 69 73 20 6e 65 76 65  age data is neve
9b20: 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  r appended to th
9b30: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
9b40: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 70 50    */.  assert(pP
9b50: 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
9b60: 64 73 7c 7c 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ds||pPager->noSy
9b70: 6e 63 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  nc);.  if( (pPag
9b80: 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 0a 20 20 20  er->noSync) .   
9b90: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
9ba0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
9bb0: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
9bc0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
9bd0: 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20  _APPEND) .  ){. 
9be0: 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
9bf0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
9c00: 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78  urnalMagic)], 0x
9c10: 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c  ffffffff);.  }el
9c20: 73 65 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74  se{.    put32bit
9c30: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
9c40: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
9c50: 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ], 0);.  }..  /*
9c60: 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63   The random chec
9c70: 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73  k-hash initialis
9c80: 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33  er */ .  sqlite3
9c90: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  Randomness(sizeo
9ca0: 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
9cb0: 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
9cc0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74  ksumInit);.  put
9cd0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
9ce0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
9cf0: 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72  agic)+4], pPager
9d00: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
9d10: 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64  /* The initial d
9d20: 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a  atabase size */.
9d30: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
9d40: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
9d50: 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70  rnalMagic)+8], p
9d60: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
9d70: 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64    /* The assumed
9d80: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72   sector size for
9d90: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
9da0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
9db0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
9dc0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c  urnalMagic)+12],
9dd0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
9de0: 69 7a 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ize);.  IOTRACE(
9df0: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
9e00: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
9e10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
9e20: 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
9e30: 29 29 29 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ))).  rc = sqlit
9e40: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
9e50: 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
9e60: 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c  sizeof(zHeader),
9e70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9e80: 66 66 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ff);.  pPager->j
9e90: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
9ea0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
9eb0: 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a  er);..  /* The j
9ec0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61  ournal header ha
9ed0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 73  s been written s
9ee0: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65 65  uccessfully. See
9ef0: 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  k the journal.  
9f00: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
9f10: 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  or to the end of
9f20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
9f30: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
9f40: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
9f50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 49 4f 54 52  E_OK ){.    IOTR
9f60: 41 43 45 28 28 22 4a 54 41 49 4c 20 25 70 20 25  ACE(("JTAIL %p %
9f70: 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20  lld\n", pPager, 
9f80: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9f90: 66 66 2d 31 29 29 0a 20 20 20 20 72 63 20 3d 20  ff-1)).    rc = 
9fa0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
9fb0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30  Pager->jfd, "\00
9fc0: 30 22 2c 20 31 2c 20 70 50 61 67 65 72 2d 3e 6a  0", 1, pPager->j
9fd0: 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20  ournalOff-1);.  
9fe0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
9ff0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
a000: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
a010: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
a020: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
a030: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
a040: 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  .** (JOURNAL_HDR
a050: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65  _SZ bytes) is re
a060: 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
a070: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
a080: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
a090: 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ile. See comment
a0a0: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
a0b0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
a0c0: 28 29 20 66 6f 72 20 61 20 64 65 73 63 72 69 70  () for a descrip
a0d0: 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a  tion of.** the j
a0e0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
a0f0: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
a100: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
a110: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
a120: 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  *nRec is set to 
a130: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
a140: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
a150: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
a160: 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20  der and *dbSize 
a170: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69  is set to the si
a180: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ze of the.** dat
a190: 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65  abase before the
a1a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67   transaction beg
a1b0: 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c  an, in pages. Al
a1c0: 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  so, pPager->cksu
a1d0: 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20  mInit.** is set 
a1e0: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  to the value rea
a1f0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
a200: 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54  al header. SQLIT
a210: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
a220: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
a230: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
a240: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
a250: 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  le appears to be
a260: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
a270: 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65  TE_DONE is.** re
a280: 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63  turned and *nRec
a290: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65   and *dbSize are
a2a0: 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f   not set.  If JO
a2b0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
a2c0: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
a2d0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
a2e0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
a2f0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
a300: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
a310: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
a320: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
a330: 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72  ger, .  i64 jour
a340: 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a  nalSize,.  u32 *
a350: 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70  pNRec, .  u32 *p
a360: 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20  DbSize.){.  int 
a370: 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
a380: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f  har aMagic[8]; /
a390: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
a3a0: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
a3b0: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  der */.  i64 jrn
a3c0: 6c 4f 66 66 3b 0a 0a 20 20 73 65 65 6b 4a 6f 75  lOff;..  seekJou
a3d0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
a3e0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
a3f0: 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41  ournalOff+JOURNA
a400: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
a410: 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29   > journalSize )
a420: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
a430: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
a440: 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  jrnlOff = pPager
a450: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
a460: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
a470: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
a480: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
a490: 61 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66  aMagic), jrnlOff
a4a0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
a4b0: 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f  turn rc;.  jrnlO
a4c0: 66 66 20 2b 3d 20 73 69 7a 65 6f 66 28 61 4d 61  ff += sizeof(aMa
a4d0: 67 69 63 29 3b 0a 0a 20 20 69 66 28 20 6d 65 6d  gic);..  if( mem
a4e0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
a4f0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
a500: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
a510: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a520: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20  TE_DONE;.  }..  
a530: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
a540: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
a550: 6c 4f 66 66 2c 20 70 4e 52 65 63 29 3b 0a 20 20  lOff, pNRec);.  
a560: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
a570: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
a580: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
a590: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20 26  fd, jrnlOff+4, &
a5a0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
a5b0: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
a5c0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
a5d0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
a5e0: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
a5f0: 66 2b 38 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20  f+8, pDbSize);. 
a600: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
a610: 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74   rc;..  /* Updat
a620: 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
a630: 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
a640: 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
a650: 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70  d by .  ** the p
a660: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
a670: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
a680: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
a690: 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74  l was.  ** creat
a6a0: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
a6b0: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
a6c0: 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
a6d0: 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62  outine.  ** is b
a6e0: 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
a6f0: 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
a700: 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
a710: 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f  cal value.  ** o
a720: 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  f Pager.sectorSi
a730: 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61  ze is restored a
a740: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  t the end of tha
a750: 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  t routine..  */.
a760: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
a770: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
a780: 72 6e 6c 4f 66 66 2b 31 32 2c 20 28 75 33 32 20  rnlOff+12, (u32 
a790: 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  *)&pPager->secto
a7a0: 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  rSize);.  if( rc
a7b0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
a7c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a7d0: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
a7e0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
a7f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a800: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  K;.}.../*.** Wri
a810: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
a820: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
a830: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
a840: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
a850: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
a860: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
a870: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
a880: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
a890: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
a8a0: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
a8b0: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
a8c0: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
a8d0: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
a8e0: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
a8f0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
a900: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
a910: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
a920: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
a930: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
a940: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
a950: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
a960: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47  * + 4 bytes: PAG
a970: 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b  ER_MJ_PGNO..** +
a980: 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68   N bytes: length
a990: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
a9a0: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20  al name..** + 4 
a9b0: 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20  bytes: N.** + 4 
a9c0: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
a9d0: 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
a9e0: 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65  sum..** + 8 byte
a9f0: 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  s: aJournalMagic
aa00: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  []..**.** The ma
aa10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ster journal pag
aa20: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68  e checksum is th
aa30: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74  e sum of the byt
aa40: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
aa50: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  .** journal name
aa60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
aa70: 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
aa80: 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
aa90: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
aaa0: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
aab0: 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
aac0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
aad0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
aae0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
aaf0: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
ab00: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
ab10: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
ab20: 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20   len; .  int i; 
ab30: 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a  .  i64 jrnlOff;.
ab40: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
ab50: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a  .  char zBuf[siz
ab60: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
ab70: 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20  c)+2*4];..  if( 
ab80: 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67  !zMaster || pPag
ab90: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72  er->setMaster) r
aba0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
abb0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
abc0: 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e  ster = 1;..  len
abd0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65   = strlen(zMaste
abe0: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
abf0: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
ac00: 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
ac10: 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  [i];.  }..  /* I
ac20: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
ac30: 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
ac40: 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
ac50: 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
ac60: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
ac70: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
ac80: 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
ac90: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
aca0: 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
acb0: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
acc0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
acd0: 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
ace0: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
acf0: 53 79 6e 63 20 29 7b 0a 20 20 20 20 73 65 65 6b  Sync ){.    seek
ad00: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
ad10: 72 29 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66  r);.  }.  jrnlOf
ad20: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
ad30: 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72  nalOff;.  pPager
ad40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
ad50: 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20  (len+20);..  rc 
ad60: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
ad70: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
ad80: 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ff, PAGER_MJ_PGN
ad90: 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  O(pPager));.  if
ada0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
adb0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a  ) return rc;.  j
adc0: 72 6e 6c 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20 20  rnlOff += 4;..  
add0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
ade0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
adf0: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 6a   zMaster, len, j
ae00: 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20 72  rnlOff);.  if( r
ae10: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
ae20: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
ae30: 4f 66 66 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20 70  Off += len;..  p
ae40: 75 74 33 32 62 69 74 73 28 7a 42 75 66 2c 20 6c  ut32bits(zBuf, l
ae50: 65 6e 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  en);.  put32bits
ae60: 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d  (&zBuf[4], cksum
ae70: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  );.  memcpy(&zBu
ae80: 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  f[8], aJournalMa
ae90: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
aea0: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72  rnalMagic));.  r
aeb0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
aec0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
aed0: 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61  zBuf, 8+sizeof(a
aee0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20 6a  JournalMagic), j
aef0: 72 6e 6c 4f 66 66 29 3b 0a 20 20 70 50 61 67 65  rnlOff);.  pPage
af00: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  r->needSync = !p
af10: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
af20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
af30: 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f  *.** Add or remo
af40: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
af50: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
af60: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  ages that are in
af70: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
af80: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
af90: 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73   The Pager keeps
afa0: 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74   a separate list
afb0: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61   of pages that a
afc0: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a  re currently in.
afd0: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
afe0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
aff0: 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65  helps the sqlite
b000: 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74  3PagerStmtCommit
b010: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75  ().** routine ru
b020: 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f  n MUCH faster fo
b030: 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
b040: 65 20 77 68 65 72 65 20 74 68 65 72 65 20 61 72  e where there ar
b050: 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20  e many.** pages 
b060: 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e  in memory but on
b070: 6c 79 20 61 20 66 65 77 20 61 72 65 20 69 6e 20  ly a few are in 
b080: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
b090: 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
b0a0: 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74   void page_add_t
b0b0: 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64  o_stmt_list(PgHd
b0c0: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
b0d0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
b0e0: 70 50 61 67 65 72 3b 0a 20 20 50 67 48 69 73 74  pPager;.  PgHist
b0f0: 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
b100: 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
b110: 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72  pPager);.  asser
b120: 74 28 20 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  t( MEMDB );.  if
b130: 28 20 21 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74  ( !pHist->inStmt
b140: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
b150: 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74  pHist->pPrevStmt
b160: 3d 3d 30 20 26 26 20 70 48 69 73 74 2d 3e 70 4e  ==0 && pHist->pN
b170: 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  extStmt==0 );.  
b180: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53    if( pPager->pS
b190: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 50 47 48  tmt ){.      PGH
b1a0: 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 61 67 65  DR_TO_HIST(pPage
b1b0: 72 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72  r->pStmt, pPager
b1c0: 29 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  )->pPrevStmt = p
b1d0: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 48  Pg;.    }.    pH
b1e0: 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  ist->pNextStmt =
b1f0: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a   pPager->pStmt;.
b200: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
b210: 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 48 69  t = pPg;.    pHi
b220: 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a  st->inStmt = 1;.
b230: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e    }.}../*.** Fin
b240: 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
b250: 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e  hash table given
b260: 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72   its page number
b270: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
b280: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
b290: 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  ge or NULL if no
b2a0: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
b2b0: 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
b2c0: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
b2d0: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
b2e0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20  {.  PgHdr *p;.  
b2f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
b300: 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  h==0 ) return 0;
b310: 0a 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 61  .  p = pPager->a
b320: 48 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50 61  Hash[pgno & (pPa
b330: 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a  ger->nHash-1)];.
b340: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
b350: 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20  >pgno!=pgno ){. 
b360: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48     p = p->pNextH
b370: 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ash;.  }.  retur
b380: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  n p;.}../*.** Cl
b390: 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ear the in-memor
b3a0: 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  y cache.  This r
b3b0: 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74  outine.** sets t
b3c0: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
b3d0: 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68  pager back to wh
b3e0: 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69  at it was when i
b3f0: 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f  t was first.** o
b400: 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73  pened.  Any outs
b410: 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
b420: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e  e invalidated an
b430: 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74  d subsequent att
b440: 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65  empts.** to acce
b450: 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77  ss those pages w
b460: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
b470: 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
b480: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b490: 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
b4a0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
b4b0: 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
b4c0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
b4d0: 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e  errCode ) return
b4e0: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
b4f0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
b500: 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 49  Pg=pNext){.    I
b510: 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20  OTRACE(("PGFREE 
b520: 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
b530: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
b540: 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
b550: 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72  lite3_pager_pgfr
b560: 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 70  ee_count);.    p
b570: 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
b580: 74 41 6c 6c 3b 0a 20 20 20 20 6c 72 75 4c 69 73  tAll;.    lruLis
b590: 74 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 20 20  tRemove(pPg);.  
b5a0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
b5b0: 50 67 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Pg);.  }.  asser
b5c0: 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  t(pPager->lru.pF
b5d0: 69 72 73 74 3d 3d 30 29 3b 0a 20 20 61 73 73 65  irst==0);.  asse
b5e0: 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  rt(pPager->lru.p
b5f0: 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 29 3b  FirstSynced==0);
b600: 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
b610: 2d 3e 6c 72 75 2e 70 4c 61 73 74 3d 3d 30 29 3b  ->lru.pLast==0);
b620: 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  .  pPager->pStmt
b630: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
b640: 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  pAll = 0;.  pPag
b650: 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  er->pDirty = 0;.
b660: 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20    pPager->nHash 
b670: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
b680: 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73  ree(pPager->aHas
b690: 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50  h);.  pPager->nP
b6a0: 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  age = 0;.  pPage
b6b0: 72 2d 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20 20  r->aHash = 0;.  
b6c0: 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
b6d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
b6e0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
b6f0: 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
b700: 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72  he pager is curr
b710: 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72 20 73  ently in error s
b720: 74 61 74 65 2c 20 64 69 73 63 61 72 64 20 74 68  tate, discard th
b730: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a  e contents of .*
b740: 2a 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20  * the cache and 
b750: 72 65 73 65 74 20 74 68 65 20 50 61 67 65 72 20  reset the Pager 
b760: 73 74 72 75 63 74 75 72 65 20 69 6e 74 65 72 6e  structure intern
b770: 61 6c 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  al state. If the
b780: 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e  re is.** an open
b790: 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74   journal-file, t
b7a0: 68 65 6e 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hen the next tim
b7b0: 65 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  e a shared-lock 
b7c0: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f  is obtained.** o
b7d0: 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
b7e0: 20 28 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79   (by this or any
b7f0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 29 2c   other process),
b800: 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74   it will be.** t
b810: 72 65 61 74 65 64 20 61 73 20 61 20 68 6f 74 2d  reated as a hot-
b820: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c  journal and roll
b830: 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  ed back..*/.stat
b840: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
b850: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
b860: 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67  er){.  if( !pPag
b870: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
b880: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45  e ){.    if( !ME
b890: 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 69 66 28  MDB ){.      if(
b8a0: 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
b8b0: 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20  thods ){.       
b8c0: 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72   osUnlock(pPager
b8d0: 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
b8e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
b8f0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
b900: 31 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  1;.      IOTRACE
b910: 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c  (("UNLOCK %p\n",
b920: 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 20   pPager))..     
b930: 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
b940: 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
b950: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
b960: 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
b970: 6e 6f 74 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  not be.      ** 
b980: 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61  trusted. Now tha
b990: 74 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  t the pager file
b9a0: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68   is unlocked, th
b9b0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
b9c0: 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65  e.      ** cache
b9d0: 20 63 61 6e 20 62 65 20 64 69 73 63 61 72 64 65   can be discarde
b9e0: 64 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20  d and the error 
b9f0: 63 6f 64 65 20 73 61 66 65 6c 79 20 63 6c 65 61  code safely clea
ba00: 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  red..      */.  
ba10: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
ba20: 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
ba30: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
ba40: 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  de = SQLITE_OK;.
ba50: 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
ba60: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
ba70: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
ba80: 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
ba90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
baa0: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74  Close(pPager->st
bab0: 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  fd);.          s
bac0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
bad0: 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20  er->aInStmt);.  
bae0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
baf0: 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  aInStmt = 0;.   
bb00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
bb10: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
bb20: 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  alOpen ){.      
bb30: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
bb40: 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
bb50: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
bb60: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
bb70: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   0;.          sq
bb80: 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
bb90: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->aInJournal);.
bba0: 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
bbb0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->aInJournal = 0
bbc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bbd0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
bbe0: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
bbf0: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
bc00: 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Use = 0;.       
bc10: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
bc20: 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Off = 0;.       
bc30: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
bc40: 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
bc50: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d       pPager->stm
bc60: 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
bc70: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f         pPager->o
bc80: 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20  rigDbSize = 0;. 
bc90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
bca0: 20 20 69 66 28 20 21 4d 45 4d 44 42 20 7c 7c 20    if( !MEMDB || 
bcb0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
bcc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bcd0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
bce0: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
bcf0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
bd00: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
bd10: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
bd20: 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
bd30: 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20  a rollback if a 
bd40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
bd50: 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b  ctive and unlock
bd60: 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
bd70: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  e file. If the p
bd80: 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ager has already
bd90: 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72   entered the err
bda0: 6f 72 20 73 74 61 74 65 2c 20 0a 2a 2a 20 64 6f  or state, .** do
bdb0: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68 65   not attempt the
bdc0: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   rollback..*/.st
bdd0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
bde0: 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
bdf0: 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 61 73  (Pager *p){.  as
be00: 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d  sert( p->state>=
be10: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c  PAGER_RESERVED |
be20: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  | p->journalOpen
be30: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
be40: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
be50: 4f 4b 20 26 26 20 70 2d 3e 73 74 61 74 65 3e 3d  OK && p->state>=
be60: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
be70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
be80: 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20  erRollback(p);. 
be90: 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
bea0: 6b 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  k(p);.  assert( 
beb0: 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70  p->errCode || !p
bec0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
bed0: 20 28 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f   (p->exclusiveMo
bee0: 64 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f  de&&!p->journalO
bef0: 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ff) );.  assert(
bf00: 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21   p->errCode || !
bf10: 70 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70  p->stmtOpen || p
bf20: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
bf30: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
bf40: 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20   routine ends a 
bf50: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20  transaction.  A 
bf60: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
bf70: 6e 64 65 64 20 62 79 20 65 69 74 68 65 72 0a 2a  nded by either.*
bf80: 2a 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  * a COMMIT or a 
bf90: 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20  ROLLBACK..**.** 
bfa0: 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
bfb0: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
bfc0: 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 6a   pager has the j
bfd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
bfe0: 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56   and.** a RESERV
bff0: 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
c000: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
c010: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
c020: 69 6e 65 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  ine will release
c030: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
c040: 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72   lock and acquir
c050: 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  es a SHARED lock
c060: 20 69 6e 20 69 74 73 20 70 6c 61 63 65 20 69 66   in its place if
c070: 20 74 68 61 74 20 69 73 0a 2a 2a 20 74 68 65 20   that is.** the 
c080: 61 70 70 72 6f 70 72 69 61 74 65 20 74 68 69 6e  appropriate thin
c090: 67 20 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73  g to do.  Releas
c0a0: 65 20 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20  e locks usually 
c0b0: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2c 0a  is appropriate,.
c0c0: 2a 2a 20 75 6e 6c 65 73 73 20 77 65 20 61 72 65  ** unless we are
c0d0: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
c0e0: 63 65 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c  cess mode or unl
c0f0: 65 73 73 20 74 68 69 73 20 69 73 20 61 20 0a 2a  ess this is a .*
c100: 2a 20 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47  * COMMIT AND BEG
c110: 49 4e 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41  IN or ROLLBACK A
c120: 4e 44 20 42 45 47 49 4e 20 6f 70 65 72 61 74 69  ND BEGIN operati
c130: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  on..**.** The jo
c140: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 65 69  urnal file is ei
c150: 74 68 65 72 20 64 65 6c 65 74 65 64 20 6f 72 20  ther deleted or 
c160: 74 72 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  truncated..**.**
c170: 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20   TODO: Consider 
c180: 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72  keeping the jour
c190: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f  nal file open fo
c1a0: 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
c1b0: 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d  bases..** This m
c1c0: 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66  ight give a perf
c1d0: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
c1e0: 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77  ent on windows w
c1f0: 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  here opening.** 
c200: 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70  a file is an exp
c210: 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  ensive operation
c220: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c230: 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
c240: 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
c250: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
c260: 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
c270: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
c280: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
c290: 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
c2a0: 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  B );.  if( pPage
c2b0: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
c2c0: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
c2d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c2e0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61  .  }.  sqlite3Pa
c2f0: 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50  gerStmtCommit(pP
c300: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
c310: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26  ger->stmtOpen &&
c320: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
c330: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73  iveMode ){.    s
c340: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
c350: 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20  ager->stfd);.   
c360: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
c370: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  n = 0;.  }.  if(
c380: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c390: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  Open ){.    if( 
c3a0: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
c3b0: 65 4d 6f 64 65 20 0a 20 20 20 20 20 20 20 20 20  eMode .         
c3c0: 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
c3d0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
c3e0: 65 72 2d 3e 6a 66 64 2c 20 30 29 29 3d 3d 53 51  er->jfd, 0))==SQ
c3f0: 4c 49 54 45 5f 4f 4b 20 29 7b 3b 0a 20 20 20 20  LITE_OK ){;.    
c400: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
c410: 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
c420: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
c430: 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
c440: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
c450: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
c460: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
c470: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c480: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  pen = 0;.      i
c490: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c4a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
c4b0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
c4c0: 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
c4d0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
c4e0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
c4f0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
c500: 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ree( pPager->aIn
c510: 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70  Journal );.    p
c520: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
c530: 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70  l = 0;.    for(p
c540: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
c550: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
c560: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
c570: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
c580: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64   0;.      pPg->d
c590: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
c5a0: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
c5b0: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 61 6c  0;.      pPg->al
c5c0: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30  waysRollback = 0
c5d0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
c5e0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
c5f0: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
c600: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
c610: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
c620: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
c630: 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
c640: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
c650: 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  he = 0;.    pPag
c660: 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
c670: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
c680: 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
c690: 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
c6a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c6b0: 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c  dirtyCache==0 ||
c6c0: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
c6d0: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  nal==0 );.  }.. 
c6e0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
c6f0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
c700: 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63     rc2 = osUnloc
c710: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
c720: 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
c730: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
c740: 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
c750: 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
c760: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
c770: 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61  YNCED ){.    pPa
c780: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
c790: 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
c7a0: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  }.  pPager->orig
c7b0: 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50  DbSize = 0;.  pP
c7c0: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
c7d0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
c7e0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 6c  eedSync = 0;.  l
c7f0: 72 75 4c 69 73 74 53 65 74 46 69 72 73 74 53 79  ruListSetFirstSy
c800: 6e 63 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  nced(pPager);.  
c810: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
c820: 20 2d 31 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28   -1;..  return (
c830: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63  rc==SQLITE_OK?rc
c840: 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2:rc);.}../*.** 
c850: 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
c860: 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f  rn a checksum fo
c870: 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61  r the page of da
c880: 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ta..**.** This i
c890: 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
c8a0: 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65  cksum.  It is re
c8b0: 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
c8c0: 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
c8d0: 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
c8e0: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e  e and the page n
c8f0: 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72  umber.  We exper
c900: 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20  imented with.** 
c910: 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68  a checksum of th
c920: 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62  e entire data, b
c930: 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e  ut that was foun
c940: 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77  d to be too slow
c950: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
c960: 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
c970: 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  r is stored at t
c980: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
c990: 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20  data and.** the 
c9a0: 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72  checksum is stor
c9b0: 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ed at the end.  
c9c0: 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e  This is importan
c9d0: 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a  t.  If journal.*
c9e0: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63  * corruption occ
c9f0: 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77  urs due to a pow
ca00: 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
ca10: 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e  most likely scen
ca20: 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20  ario.** is that 
ca30: 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f  one end or the o
ca40: 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f  ther of the reco
ca50: 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  rd will be chang
ca60: 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75  ed.  It is.** mu
ca70: 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74  ch less likely t
ca80: 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73  hat the two ends
ca90: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
caa0: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a  record will be.*
cab0: 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68  * correct and th
cac0: 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72  e middle be corr
cad0: 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73  upt.  Thus, this
cae0: 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65   "checksum" sche
caf0: 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61  me,.** though fa
cb00: 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63  st and simple, c
cb10: 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c  atches the mostl
cb20: 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66  y likely kind of
cb30: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a   corruption..**.
cb40: 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73  ** FIX ME:  Cons
cb50: 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72  ider adding ever
cb60: 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20  y 200th (or so) 
cb70: 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61  byte of the data
cb80: 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b   to the.** check
cb90: 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69  sum.  That way i
cba0: 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
cbb0: 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20  spans 3 or more 
cbc0: 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64  disk sectors and
cbd0: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64  .** only the mid
cbe0: 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f  dle sector is co
cbf0: 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73  rrupt, we will s
cc00: 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73  till have a reas
cc10: 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65  onable.** chance
cc20: 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20   of failing the 
cc30: 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75  checksum and thu
cc40: 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20  s detecting the 
cc50: 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74  problem..*/.stat
cc60: 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
cc70: 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
cc80: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
cc90: 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
cca0: 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
ccb0: 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  nit;.  int i = p
ccc0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
ccd0: 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e  200;.  while( i>
cce0: 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  0 ){.    cksum +
ccf0: 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20  = aData[i];.    
cd00: 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20  i -= 200;.  }.  
cd10: 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a  return cksum;.}.
cd20: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
cd30: 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
cd40: 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e  c void makeClean
cd50: 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (PgHdr*);../*.**
cd60: 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
cd70: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  age from the jou
cd80: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64  rnal file opened
cd90: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
cda0: 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61  tor.** jfd.  Pla
cdb0: 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70  yback this one p
cdc0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73  age..**.** If us
cdd0: 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61  eCksum==0 it mea
cde0: 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  ns this journal 
cdf0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65  does not use che
ce00: 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75  cksums.  Checksu
ce10: 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73  ms.** are not us
ce20: 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20  ed in statement 
ce30: 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65  journals because
ce40: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
ce50: 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65  als do not.** ne
ce60: 65 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f  ed to survive po
ce70: 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f  wer failures..*/
ce80: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
ce90: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
cea0: 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
ceb0: 61 67 65 72 2c 20 0a 20 20 73 71 6c 69 74 65 33  ager, .  sqlite3
cec0: 5f 66 69 6c 65 20 2a 6a 66 64 2c 0a 20 20 69 36  _file *jfd,.  i6
ced0: 34 20 6f 66 66 73 65 74 2c 0a 20 20 69 6e 74 20  4 offset,.  int 
cee0: 75 73 65 43 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e  useCksum.){.  in
cef0: 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
cf00: 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
cf10: 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
cf20: 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
cf30: 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
cf40: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
cf50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
cf60: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
cf70: 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
cf80: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
cf90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cfa0: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
cfb0: 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
cfc0: 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75   checking */.  u
cfd0: 38 20 2a 61 44 61 74 61 20 3d 20 28 75 38 20 2a  8 *aData = (u8 *
cfe0: 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  )pPager->pTmpSpa
cff0: 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70 20 73 74  ce;   /* Temp st
d000: 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61 67 65  orage for a page
d010: 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73   */..  /* useCks
d020: 75 6d 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  um should be tru
d030: 65 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a  e for the main j
d040: 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65  ournal and false
d050: 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d   for.  ** statem
d060: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56  ent journals.  V
d070: 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
d080: 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 63 61  is always the ca
d090: 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  se.  */.  assert
d0a0: 28 20 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73  ( jfd == (useCks
d0b0: 75 6d 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64  um ? pPager->jfd
d0c0: 20 3a 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29   : pPager->stfd)
d0d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44   );.  assert( aD
d0e0: 61 74 61 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72  ata );..  rc = r
d0f0: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f  ead32bits(jfd, o
d100: 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20  ffset, &pgno);. 
d110: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d120: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
d130: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d140: 52 65 61 64 28 6a 66 64 2c 20 61 44 61 74 61 2c  Read(jfd, aData,
d150: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
d160: 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20  e, offset+4);.  
d170: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d180: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
d190: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d1a0: 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  Off += pPager->p
d1b0: 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20  ageSize + 4;..  
d1c0: 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
d1d0: 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ng on the page. 
d1e0: 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d   This is more im
d1f0: 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f  portant that I o
d200: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74  riginally.  ** t
d210: 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f  hought.  If a po
d220: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
d230: 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  rs while the jou
d240: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72  rnal is being wr
d250: 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63  itten,.  ** it c
d260: 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c  ould cause inval
d270: 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72  id data to be wr
d280: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
d290: 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64  ournal.  We need
d2a0: 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20   to.  ** detect 
d2b0: 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74  this invalid dat
d2c0: 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f  a (with high pro
d2d0: 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67  bability) and ig
d2e0: 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  nore it..  */.  
d2f0: 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70  if( pgno==0 || p
d300: 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
d310: 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
d320: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d330: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  DONE;.  }.  if( 
d340: 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70  pgno>(unsigned)p
d350: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
d360: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d370: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
d380: 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20   useCksum ){.   
d390: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
d3a0: 28 6a 66 64 2c 20 6f 66 66 73 65 74 2b 70 50 61  (jfd, offset+pPa
d3b0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c  ger->pageSize+4,
d3c0: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
d3d0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
d3e0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
d3f0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20  urnalOff += 4;. 
d400: 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73     if( pager_cks
d410: 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  um(pPager, aData
d420: 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  )!=cksum ){.    
d430: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d440: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
d450: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d460: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
d470: 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67  RESERVED || pPag
d480: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
d490: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20  _EXCLUSIVE );.. 
d4a0: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
d4b0: 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20   is in RESERVED 
d4c0: 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72  state, then ther
d4d0: 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79  e must be a copy
d4e0: 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61   of this.  ** pa
d4f0: 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  ge in the pager 
d500: 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63  cache. In this c
d510: 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20  ase just update 
d520: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c  the pager cache,
d530: 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61  .  ** not the da
d540: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
d550: 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61   page is left ma
d560: 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68  rked dirty in th
d570: 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  is case..  **.  
d580: 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20  ** An exception 
d590: 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c  to the above rul
d5a0: 65 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  e: If the databa
d5b0: 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  se is in no-sync
d5c0: 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61   mode.  ** and a
d5d0: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64   page is moved d
d5e0: 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65  uring an increme
d5f0: 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e  ntal vacuum then
d600: 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20   the page may.  
d610: 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ** not be in the
d620: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61   pager cache. La
d630: 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63  ter: if a malloc
d640: 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f  () or IO error o
d650: 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e  ccurs.  ** durin
d660: 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63  g a Movepage() c
d670: 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61  all, then the pa
d680: 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ge may not be in
d690: 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20   the cache.  ** 
d6a0: 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63  either. So the c
d6b0: 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62  ondition describ
d6c0: 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  ed in the above 
d6d0: 70 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74  paragraph is not
d6e0: 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62  .  ** assert()ab
d6f0: 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  le..  **.  ** If
d700: 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74   in EXCLUSIVE st
d710: 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64  ate, then we upd
d720: 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
d730: 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73  che if it exists
d740: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61  .  ** and the ma
d750: 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  in file. The pag
d760: 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64  e is then marked
d770: 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a   not dirty..  **
d780: 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31  .  ** Ticket #11
d790: 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65  71:  The stateme
d7a0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  nt journal might
d7b0: 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f   contain page co
d7c0: 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20  ntent that is.  
d7d0: 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
d7e0: 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  m the page conte
d7f0: 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
d800: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
d810: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63  on..  ** This oc
d820: 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65  curs when a page
d830: 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f   is changed prio
d840: 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
d850: 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  f a statement.  
d860: 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20  ** then changed 
d870: 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65  again within the
d880: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65   statement.  Whe
d890: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73  n rolling back s
d8a0: 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65  uch a.  ** state
d8b0: 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74  ment we must not
d8c0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72   write to the or
d8d0: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
d8e0: 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20  unless we know. 
d8f0: 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20   ** for certain 
d900: 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61  that original pa
d910: 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
d920: 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20  synced into the 
d930: 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
d940: 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68  ** journal.  Oth
d950: 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20  erwise, a power 
d960: 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65  loss might leave
d970: 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69   modified data i
d980: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
d990: 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74  ase file without
d9a0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
d9b0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
d9c0: 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20  l that can.  ** 
d9d0: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
d9e0: 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
d9f0: 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20  inal form.  Two 
da00: 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
da10: 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f  be.  ** met befo
da20: 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  re writing to th
da30: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  e database files
da40: 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
da50: 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  se must be.  ** 
da60: 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20  locked.  (2) we 
da70: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72  know that the or
da80: 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
da90: 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e  ent is fully syn
daa0: 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ced.  ** in the 
dab0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74  main journal eit
dac0: 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20  her because the 
dad0: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
dae0: 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a  ache or else.  *
daf0: 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  * the page is ma
db00: 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63  rked as needSync
db10: 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  ==0..  */.  pPg 
db20: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
db30: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
db40: 50 41 47 45 52 54 52 41 43 45 34 28 22 50 4c 41  PAGERTRACE4("PLA
db50: 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64  YBACK %d page %d
db60: 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
db70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
db80: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
db90: 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61  pgno, pager_data
dba0: 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67  hash(pPager->pag
dbb0: 65 53 69 7a 65 2c 20 61 44 61 74 61 29 29 3b 0a  eSize, aData));.
dbc0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
dbd0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
dbe0: 53 49 56 45 20 26 26 20 28 70 50 67 3d 3d 30 20  SIVE && (pPg==0 
dbf0: 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  || pPg->needSync
dc00: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 36 34 20  ==0) ){.    i64 
dc10: 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  offset = (pgno-1
dc20: 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
dc30: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
dc40: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
dc50: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61  (pPager->fd, aDa
dc60: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
dc70: 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20  Size, offset);. 
dc80: 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20     if( pPg ){.  
dc90: 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
dca0: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
dcb0: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
dcc0: 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
dcd0: 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
dce0: 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
dcf0: 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
dd00: 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
dd10: 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
dd20: 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
dd30: 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
dd40: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
dd50: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
dd60: 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
dd70: 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
dd80: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
dd90: 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
dda0: 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
ddb0: 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
ddc0: 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
ddd0: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
dde0: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
ddf0: 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
de00: 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
de10: 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50     /* assert( pP
de20: 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50  g->nRef==0 || pP
de30: 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f  g->pgno==1 ); */
de40: 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48  .    pData = PGH
de50: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
de60: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
de70: 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  a, aData, pPager
de80: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
de90: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
dea0: 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
deb0: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
dec0: 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70  r(pPg, pPager->p
ded0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
dee0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
def0: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
df00: 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
df10: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
df20: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a  );.#endif.    /*
df30: 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67   If this was pag
df40: 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72  e 1, then restor
df50: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  e the value of P
df60: 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e  ager.dbFileVers.
df70: 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20  .    ** Do this 
df80: 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64  before any decod
df90: 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ing. */.    if( 
dfa0: 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
dfb0: 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
dfc0: 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28  >dbFileVers, &((
dfd0: 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73  u8*)pData)[24],s
dfe0: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
dff0: 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
e000: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65  }..    /* Decode
e010: 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72   the page just r
e020: 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f  ead from disk */
e030: 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67  .    CODEC1(pPag
e040: 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
e050: 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20  pgno, 3);.  }.  
e060: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e070: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
e080: 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
e090: 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
e0a0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
e0b0: 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
e0c0: 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
e0d0: 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
e0e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
e0f0: 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
e100: 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
e110: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
e120: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
e130: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
e140: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e150: 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
e160: 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
e170: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61  .** Argument zMa
e180: 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74  ster may point t
e190: 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  o Pager.pTmpSpac
e1a0: 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65  e. So that buffe
e1b0: 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61  r is not .** ava
e1c0: 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77  ilable for use w
e1d0: 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
e1e0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  ion..**.**.** Th
e1f0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
e200: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
e210: 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20  he names of all 
e220: 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a  child journals..
e230: 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61 20  ** To tell if a 
e240: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63  master journal c
e250: 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20 63  an be deleted, c
e260: 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66 20  heck to each of 
e270: 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e  the.** children.
e280: 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72 65    If all childre
e290: 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69 73  n are either mis
e2a0: 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72  sing or do not r
e2b0: 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66  efer to.** a dif
e2c0: 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f  ferent master jo
e2d0: 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69 73  urnal, then this
e2e0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e2f0: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 0a  can be deleted..
e300: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
e310: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
e320: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
e330: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
e340: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
e350: 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
e360: 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
e370: 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70  .  int master_op
e380: 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  en = 0;.  sqlite
e390: 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b  3_file *pMaster;
e3a0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
e3b0: 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20 20 63 68 61  *pJournal;.  cha
e3c0: 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r *zMasterJourna
e3d0: 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e  l = 0; /* Conten
e3e0: 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ts of master jou
e3f0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
e400: 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  64 nMasterJourna
e410: 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  l;       /* Size
e420: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
e430: 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a  al file */..  /*
e440: 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
e450: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
e460: 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73  clusively in cas
e470: 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
e480: 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e  cess.  ** is run
e490: 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ning this routin
e4a0: 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74  e also. Not that
e4b0: 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75   it makes too mu
e4c0: 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20  ch difference.. 
e4d0: 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   */.  pMaster = 
e4e0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
e4f0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70  sqlite3_malloc(p
e500: 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
e510: 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d  2);.  pJournal =
e520: 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
e530: 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72  )(((u8 *)pMaster
e540: 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
e550: 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73  le);.  if( !pMas
e560: 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ter ){.    rc = 
e570: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
e580: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 66  }else{.    int f
e590: 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
e5a0: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
e5b0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
e5c0: 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
e5d0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
e5e0: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
e5f0: 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
e600: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
e610: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
e620: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
e630: 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  ;.  master_open 
e640: 3d 20 31 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  = 1;..  rc = sql
e650: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
e660: 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  Master, &nMaster
e670: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
e680: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
e690: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
e6a0: 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
e6b0: 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
e6c0: 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
e6d0: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
e6e0: 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20 20  sterPtr = 0;.   
e6f0: 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 20   int nMasterPtr 
e700: 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  = pPager->pVfs->
e710: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20  mxPathname+1;.. 
e720: 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65     /* Load the e
e730: 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
e740: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
e750: 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
e760: 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
e770: 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
e780: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
e790: 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20  sterJournal. .  
e7a0: 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72    */.    zMaster
e7b0: 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20  Journal = (char 
e7c0: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
e7d0: 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  (nMasterJournal 
e7e0: 2b 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  + nMasterPtr);. 
e7f0: 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a     if( !zMasterJ
e800: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
e810: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
e820: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  M;.      goto de
e830: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
e840: 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74   }.    zMasterPt
e850: 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
e860: 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
e870: 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  al];.    rc = sq
e880: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
e890: 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
e8a0: 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72  nal, nMasterJour
e8b0: 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  nal, 0);.    if(
e8c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e8d0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
e8e0: 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e  out;..    zJourn
e8f0: 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72  al = zMasterJour
e900: 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  nal;.    while( 
e910: 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65  (zJournal-zMaste
e920: 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65  rJournal)<nMaste
e930: 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
e940: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 41    if( sqlite3OsA
e950: 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75  ccess(pVfs, zJou
e960: 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
e970: 45 53 53 5f 45 58 49 53 54 53 29 20 29 7b 0a 20  ESS_EXISTS) ){. 
e980: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
e990: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
e9a0: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
e9b0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
e9c0: 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  xists..        *
e9d0: 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
e9e0: 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
e9f0: 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
ea00: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
ea10: 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
ea20: 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
ea30: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
ea40: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
ea50: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
ea60: 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  t c;.        int
ea70: 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
ea80: 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
ea90: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
eaa0: 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20  JOURNAL);.      
eab0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
eac0: 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72  Open(pVfs, zJour
ead0: 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66  nal, pJournal, f
eae0: 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
eaf0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
eb00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
eb10: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
eb20: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
eb30: 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61          rc = rea
eb40: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
eb50: 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
eb60: 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
eb70: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
eb80: 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61  3OsClose(pJourna
eb90: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
eba0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ebb0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
ebc0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
ebd0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
ebe0: 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72    c = zMasterPtr
ebf0: 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70  [0]!=0 && strcmp
ec00: 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61  (zMasterPtr, zMa
ec10: 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ster)==0;.      
ec20: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20    if( c ){.     
ec30: 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
ec40: 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20  a match. Do not 
ec50: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
ec60: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
ec70: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  */.          got
ec80: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
ec90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
eca0: 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61   }.      zJourna
ecb0: 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f  l += (strlen(zJo
ecc0: 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d  urnal)+1);.    }
ecd0: 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73  .  }.  .  rc = s
ece0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
ecf0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
ed00: 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  ;..delmaster_out
ed10: 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a  :.  if( zMasterJ
ed20: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71  ournal ){.    sq
ed30: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74  lite3_free(zMast
ed40: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20  erJournal);.  } 
ed50: 20 0a 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f   .  if( master_o
ed60: 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
ed70: 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
ed80: 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
ed90: 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b  3_free(pMaster);
eda0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
edb0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  ..static void pa
edc0: 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
edd0: 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  he(Pager *pPager
ede0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  );../*.** Trunca
edf0: 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  te the main file
ee00: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70 61   of the given pa
ee10: 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ger to the numbe
ee20: 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e  r of pages.** in
ee30: 64 69 63 61 74 65 64 2e 20 41 6c 73 6f 20 74 72  dicated. Also tr
ee40: 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65  uncate the cache
ee50: 64 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  d representation
ee60: 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f   of the file..*/
ee70: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
ee80: 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
ee90: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50   *pPager, int nP
eea0: 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
eeb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
eec0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
eed0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
eee0: 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e   && pPager->fd->
eef0: 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
ef00: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
ef10: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66  uncate(pPager->f
ef20: 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  d, pPager->pageS
ef30: 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 29 3b  ize*(i64)nPage);
ef40: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
ef50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ef60: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
ef70: 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65   nPage;.    page
ef80: 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
ef90: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
efa0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
efb0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63 74  .** Set the sect
efc0: 6f 72 53 69 7a 65 20 66 6f 72 20 74 68 65 20 67  orSize for the g
efd0: 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a  iven pager..**.*
efe0: 2a 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a  * The sector siz
eff0: 65 20 69 73 20 74 68 65 20 6c 61 72 67 65 72 20  e is the larger 
f000: 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  of the sector si
f010: 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20 62  ze reported.** b
f020: 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
f030: 72 53 69 7a 65 28 29 20 61 6e 64 20 74 68 65 20  rSize() and the 
f040: 70 61 67 65 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61  pageSize..*/.sta
f050: 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74  tic void setSect
f060: 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  orSize(Pager *pP
f070: 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
f080: 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
f090: 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65  hods||pPager->te
f0a0: 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  mpFile);.  if( !
f0b0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
f0c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
f0d0: 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
f0e0: 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
f0f0: 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
f100: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
f110: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
f120: 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
f130: 6e 20 77 68 63 69 68 20 63 61 73 65 20 74 68 65  n whcih case the
f140: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
f150: 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
f160: 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
f170: 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
f180: 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
f190: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
f1a0: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
f1b0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
f1c0: 63 74 6f 72 53 69 7a 65 3c 70 50 61 67 65 72 2d  ctorSize<pPager-
f1d0: 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
f1e0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
f1f0: 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
f200: 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f  geSize;.  }.}../
f210: 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
f220: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
f230: 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
f240: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
f250: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
f260: 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
f270: 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
f280: 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
f290: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
f2a0: 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
f2b0: 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
f2c0: 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
f2d0: 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
f2e0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
f2f0: 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
f300: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
f310: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
f320: 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
f330: 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
f340: 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
f350: 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
f360: 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
f370: 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
f380: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
f390: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
f3a0: 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
f3b0: 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
f3c0: 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
f3d0: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
f3e0: 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
f3f0: 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
f400: 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
f410: 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
f420: 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
f430: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
f440: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
f450: 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
f460: 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
f470: 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
f480: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
f490: 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
f4a0: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
f4b0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
f4c0: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
f4d0: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61  rnal.**       na
f4e0: 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d  me.  The value m
f4f0: 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69  ay be zero (indi
f500: 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20  cate that there 
f510: 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  is no master.** 
f520: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a        journal.).
f530: 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65 73  **  (6)  N bytes
f540: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
f550: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68  ournal name.  Th
f560: 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e  e name will be n
f570: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  ul-terminated.**
f580: 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74         and might
f590: 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e   be shorter than
f5a0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
f5b0: 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68  from (5).  If th
f5c0: 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20  e first byte.** 
f5d0: 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d        of the nam
f5e0: 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74  e is \000 then t
f5f0: 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
f600: 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  r journal.  The 
f610: 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
f620: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20  journal name is 
f630: 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e  stored in UTF-8.
f640: 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f  .**  (7)  Zero o
f650: 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
f660: 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
f670: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
f680: 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
f690: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
f6a0: 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
f6b0: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
f6c0: 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
f6d0: 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
f6e0: 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
f6f0: 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
f700: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
f710: 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
f720: 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   6 items above..
f730: 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
f740: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
f750: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
f760: 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 7th item..**.
f770: 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
f780: 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
f790: 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
f7a0: 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
f7b0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
f7c0: 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
f7d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
f7e0: 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
f7f0: 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
f800: 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
f810: 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
f820: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f830: 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
f840: 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
f850: 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
f860: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
f870: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
f880: 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
f890: 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
f8a0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
f8b0: 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
f8c0: 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
f8d0: 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
f8e0: 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
f8f0: 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
f900: 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
f910: 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
f920: 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
f930: 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
f940: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
f950: 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
f960: 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
f970: 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
f980: 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
f990: 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
f9a0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
f9b0: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
f9c0: 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
f9d0: 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
f9e0: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
f9f0: 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
fa00: 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
fa10: 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
fa20: 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
fa30: 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
fa40: 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
fa50: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
fa60: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
fa70: 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
fa80: 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
fa90: 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
faa0: 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
fab0: 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
fac0: 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
fad0: 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
fae0: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
faf0: 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
fb00: 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
fb10: 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
fb20: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
fb30: 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
fb40: 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
fb50: 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
fb60: 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
fb70: 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
fb80: 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
fb90: 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
fba0: 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
fbb0: 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
fbc0: 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
fbd0: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
fbe0: 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
fbf0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
fc00: 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
fc10: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
fc20: 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
fc30: 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
fc40: 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
fc50: 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
fc60: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
fc70: 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
fc80: 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
fc90: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
fca0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fcb0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
fcc0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
fcd0: 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69  t isHot){.  sqli
fce0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
fcf0: 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
fd00: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
fd10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
fd20: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
fd30: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
fd40: 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
fd50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
fd60: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
fd70: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
fd80: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fda0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
fdb0: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
fdc0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
fdd0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
fde0: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
fdf0: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
fe00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe10: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
fe20: 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
fe30: 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
fe40: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
fe50: 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Name of master j
fe60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61  ournal file if a
fe70: 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ny */..  /* Figu
fe80: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
fe90: 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
fea0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
feb0: 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
fec0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
fed0: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
fee0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
fef0: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72  urnalOpen );.  r
ff00: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
ff10: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
ff20: 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
ff30: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
ff40: 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67   szJ==0 ){.    g
ff50: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
ff60: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  ;.  }..  /* Read
ff70: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ff80: 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  nal name from th
ff90: 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  e journal, if it
ffa0: 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a   is present..  *
ffb0: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
ffc0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
ffd0: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75  is specified, bu
ffe0: 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  t the file is no
fff0: 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f  t.  ** present o
10000 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65  n disk, then the
10010 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20   journal is not 
10020 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  hot and does not
10030 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a   need to be.  **
10040 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
10050 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  */.  zMaster = p
10060 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
10070 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  ;.  rc = readMas
10080 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
10090 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
100a0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
100b0 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
100c0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
100d0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28  TE_DONE );.  if(
100e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a   rc!=SQLITE_OK .
100f0 20 20 20 7c 7c 20 28 7a 4d 61 73 74 65 72 5b 30     || (zMaster[0
10100 5d 20 26 26 20 21 73 71 6c 69 74 65 33 4f 73 41  ] && !sqlite3OsA
10110 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
10120 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
10130 53 53 5f 45 58 49 53 54 53 29 29 20 0a 20 20 29  SS_EXISTS)) .  )
10140 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
10150 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  0;.    if( rc==S
10160 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20  QLITE_DONE ) rc 
10170 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
10180 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
10190 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
101a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
101b0 3b 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ;.  zMaster = 0;
101c0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
101d0 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
101e0 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61 64  er when the read
101f0 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c  JournalHdr() cal
10200 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53  l returns.  ** S
10210 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
10220 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
10230 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20  . */.  while( 1 
10240 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  ){..    /* Read 
10250 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
10260 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
10270 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
10280 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
10290 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
102a0 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
102b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
102c0 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
102d0 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
102e0 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
102f0 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
10300 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68  ust of failed wh
10310 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
10320 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
10330 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
10340 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
10350 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
10360 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
10370 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
10380 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  r, szJ, &nRec, &
10390 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
103a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
103b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
103c0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
103d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
103e0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
103f0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
10400 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
10410 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
10420 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
10430 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
10440 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
10450 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
10460 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
10470 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
10480 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
10490 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
104a0 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
104b0 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
104c0 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
104d0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
104e0 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
104f0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
10500 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
10510 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
10520 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
10530 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
10540 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
10550 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
10560 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
10570 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
10580 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a   nRec = (szJ - J
10590 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
105a0 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
105b0 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
105c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
105d0 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
105e0 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
105f0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
10600 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
10610 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e     ** process an
10620 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
10630 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e   final header in
10640 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68   the journal, th
10650 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20  en it means.    
10660 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72  ** that this par
10670 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
10680 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65   was being fille
10690 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65  d but has not ye
106a0 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79  t been.    ** sy
106b0 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43  nced to disk.  C
106c0 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65  ompute the numbe
106d0 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64  r of pages based
106e0 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   on the remainin
106f0 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  g.    ** size of
10700 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
10710 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69  *.    ** The thi
10720 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74  rd term of the t
10730 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f  est was added to
10740 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36   fix ticket #256
10750 35 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  5..    */.    if
10760 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
10770 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70  Hot &&.        p
10780 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
10790 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
107a0 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
107b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
107c0 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a        nRec = (sz
107d0 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
107e0 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41  nalOff) / JOURNA
107f0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
10800 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
10810 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
10820 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20  rst header read 
10830 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
10840 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
10850 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
10860 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73  ile back to it's
10870 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
10880 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
10890 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
108a0 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
108b0 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
108c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
108d0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
108e0 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
108f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10900 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
10910 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
10920 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
10930 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
10940 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
10950 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
10960 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
10970 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
10980 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10990 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRec; i++){.    
109a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
109b0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
109c0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
109d0 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
109e0 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20  nalOff, 1);.    
109f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10a00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
10a10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
10a20 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
10a30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10a40 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
10a50 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
10a60 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
10a70 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
10a80 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  se{.          go
10a90 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
10aa0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10ab0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
10ac0 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
10ad0 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e  assert( 0 );..en
10ae0 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  d_playback:.  if
10af0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10b00 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  ){.    zMaster =
10b10 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
10b20 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  ce;.    rc = rea
10b30 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
10b40 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
10b50 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
10b60 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
10b70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
10b80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10b90 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
10ba0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
10bb0 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
10bc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
10bd0 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20  zMaster[0] ){.  
10be0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
10bf0 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
10c00 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  al and this rout
10c10 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
10c20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20  success,.    ** 
10c30 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  see if it is pos
10c40 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
10c50 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10c60 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  al..    */.    r
10c70 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
10c80 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ter(pPager, zMas
10c90 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter);.  }..  /* 
10ca0 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  The Pager.sector
10cb0 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
10cc0 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61  y have been upda
10cd0 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  ted while rollin
10ce0 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f  g.  ** back a jo
10cf0 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79  urnal created by
10d00 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20   a process with 
10d10 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74  a different sect
10d20 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c  or size.  ** val
10d30 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20  ue. Reset it to 
10d40 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
10d50 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
10d60 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65  ss..  */.  setSe
10d70 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
10d80 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10d90 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
10da0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
10db0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
10dc0 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  is is similar to
10dd0 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
10de0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
10df0 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a  urnal but with.*
10e00 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74 77  * a few extra tw
10e10 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ists..**.**    (
10e20 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1)  The number o
10e30 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
10e40 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
10e50 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
10e60 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61 74          the stat
10e70 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20  ement is stored 
10e80 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  in pPager->stmtS
10e90 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a  ize, not in the.
10ea0 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e  **         journ
10eb0 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a  al file itself..
10ec0 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e  **.**    (2)  In
10ed0 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61   addition to pla
10ee0 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74  ying back the st
10ef0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c  atement journal,
10f00 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20   also.**        
10f10 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61   playback all pa
10f20 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ges of the trans
10f30 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62  action journal b
10f40 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  eginning.**     
10f50 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50      at offset pP
10f60 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e  ager->stmtJSize.
10f70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
10f80 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
10f90 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
10fa0 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
10fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10fc0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c   Size of the ful
10fd0 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  l journal */.  i
10fe0 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74  64 hdrOff;.  int
10ff0 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
11000 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11010 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  of Records */.  
11020 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
11030 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
11040 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
11050 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70  t rc;..  szJ = p
11060 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11070 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  f;.#ifndef NDEBU
11080 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f  G .  {.    i64 o
11090 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20  s_szJ;.    rc = 
110a0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
110b0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
110c0 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28  os_szJ);.    if(
110d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
110e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
110f0 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f  assert( szJ==os_
11100 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  szJ );.  }.#endi
11110 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f  f..  /* Set hdrO
11120 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66  ff to be the off
11130 73 65 74 20 6a 75 73 74 20 61 66 74 65 72 20 74  set just after t
11140 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 61  he end of the la
11150 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  st journal.  ** 
11160 70 61 67 65 20 77 72 69 74 74 65 6e 20 62 65 66  page written bef
11170 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f  ore the first jo
11180 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f 72  urnal-header for
11190 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 0a   this statement.
111a0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
111b0 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 6f 72   was written, or
111c0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
111d0 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e  file if no journ
111e0 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77  al.  ** header w
111f0 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f  as written..  */
11200 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67  .  hdrOff = pPag
11210 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a  er->stmtHdrOff;.
11220 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11230 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68  ->fullSync || !h
11240 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21  drOff );.  if( !
11250 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64  hdrOff ){.    hd
11260 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a  rOff = szJ;.  }.
11270 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65    .  /* Truncate
11280 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61   the database ba
11290 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
112a0 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  al size..  */.  
112b0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
112c0 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  ate(pPager, pPag
112d0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20  er->stmtSize);. 
112e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
112f0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
11300 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  ARED );..  /* Fi
11310 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
11320 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
11330 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
11340 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61  ournal..  */.  a
11350 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
11360 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61 67  tmtInUse && pPag
11370 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
11380 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67  );.  nRec = pPag
11390 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20  er->stmtNRec;.  
113a0 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69  .  /* Copy origi
113b0 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
113c0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
113d0 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
113e0 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
113f0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
11400 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  te that the stat
11410 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d  ement journal om
11420 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72  its checksums fr
11430 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63  om.  ** each rec
11440 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d  ord since power-
11450 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79  failure recovery
11460 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e   is not importan
11470 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20  t to statement. 
11480 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20   ** journals..  
11490 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
114a0 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRec; i++){.    
114b0 69 36 34 20 6f 66 66 73 65 74 20 3d 20 69 2a 28  i64 offset = i*(
114c0 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
114d0 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  ze);.    rc = pa
114e0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
114f0 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
11500 61 67 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73  ager->stfd, offs
11510 65 74 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  et, 0);.    asse
11520 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
11530 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ONE );.    if( r
11540 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
11550 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
11560 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
11570 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70   Now roll some p
11580 61 67 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74  ages back from t
11590 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
115a0 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74  ournal. Pager.st
115b0 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73  mtJSize.  ** was
115c0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
115d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
115e0 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  en this statemen
115f0 74 20 77 61 73 20 73 74 61 72 74 65 64 2c 20 73  t was started, s
11600 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e  o.  ** everythin
11610 67 20 61 66 74 65 72 20 74 68 61 74 20 6e 65 65  g after that nee
11620 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
11630 62 61 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74  back, either int
11640 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
11650 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20  ase, the memory 
11660 63 61 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a  cache, or both..
11670 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20    **.  ** If it 
11680 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
11690 6e 20 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f  n Pager.stmtHdrO
116a0 66 66 20 69 73 20 74 68 65 20 6f 66 66 73 65 74  ff is the offset
116b0 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
116c0 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
116d0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
116e0 72 69 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68  ritten during th
116f0 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  is statement tra
11700 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
11710 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11720 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
11730 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  mtJSize;.  pPage
11740 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70  r->cksumInit = p
11750 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
11760 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65  ;.  while( pPage
11770 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20  r->journalOff < 
11780 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 72 63  hdrOff ){.    rc
11790 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
117a0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
117b0 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  r, pPager->jfd, 
117c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
117d0 66 66 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  ff, 1);.    asse
117e0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
117f0 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ONE );.    if( r
11800 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
11810 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
11820 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68  yback;.  }..  wh
11830 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ile( pPager->jou
11840 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b  rnalOff < szJ ){
11850 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 3b 20  .    u32 nJRec; 
11860 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11870 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63  r of Journal Rec
11880 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20  ords */.    u32 
11890 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20  dummy;.    rc = 
118a0 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
118b0 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52  Pager, szJ, &nJR
118c0 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ec, &dummy);.   
118d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
118e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
118f0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
11900 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74  ONE );.      got
11910 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
11920 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ack;.    }.    i
11930 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20  f( nJRec==0 ){. 
11940 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a       nJRec = (sz
11950 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
11960 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65  nalOff) / (pPage
11970 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a  r->pageSize+8);.
11980 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
11990 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26  nJRec-1; i>=0 &&
119a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
119b0 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b  Off < szJ; i--){
119c0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
119d0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
119e0 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
119f0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
11a00 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b  >journalOff, 1);
11a10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
11a20 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
11a30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
11a40 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
11a50 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
11a60 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ck;.    }.  }.. 
11a70 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11a80 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e  Off = szJ;.  .en
11a90 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a  d_stmt_playback:
11aa0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
11ab0 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67  E_OK) {.    pPag
11ac0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
11ad0 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67   szJ;.    /* pag
11ae0 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
11af0 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a  pPager); */.  }.
11b00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11b10 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
11b20 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
11b30 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
11b40 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
11b50 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
11b60 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
11b70 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
11b80 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
11b90 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31  {.  if( mxPage>1
11ba0 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
11bb0 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65  >mxPage = mxPage
11bc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
11bd0 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
11be0 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  10;.  }.}../*.**
11bf0 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
11c00 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
11c10 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
11c20 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
11c30 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
11c40 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
11c50 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
11c60 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
11c70 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
11c80 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
11c90 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
11ca0 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
11cb0 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
11cc0 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
11cd0 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
11ce0 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
11cf0 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
11d00 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
11d10 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
11d20 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
11d30 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
11d40 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
11d50 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
11d60 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
11d70 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
11d80 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
11d90 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
11da0 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
11db0 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
11dc0 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
11dd0 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
11de0 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
11df0 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
11e00 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
11e10 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
11e20 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
11e30 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
11e40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11e50 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
11e60 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
11e70 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
11e80 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
11e90 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
11ea0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
11eb0 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
11ec0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
11ed0 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
11ee0 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
11ef0 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
11f00 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
11f10 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
11f20 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
11f30 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
11f40 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
11f50 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
11f60 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
11f70 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
11f80 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
11f90 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
11fa0 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
11fb0 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
11fc0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11fd0 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
11fe0 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
11ff0 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
12000 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
12010 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
12020 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
12030 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
12040 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
12050 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
12060 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
12070 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
12080 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
12090 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
120a0 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
120b0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
120c0 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
120d0 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
120e0 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
120f0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
12100 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
12110 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
12120 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
12130 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
12140 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
12150 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20  t full_fsync){. 
12160 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
12170 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  =  level==1 || p
12180 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
12190 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
121a0 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26  ync = level==3 &
121b0 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
121c0 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ile;.  pPager->s
121d0 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 66 75 6c  ync_flags = (ful
121e0 6c 5f 66 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53  l_fsync?SQLITE_S
121f0 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f  YNC_FULL:SQLITE_
12200 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
12210 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
12220 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65  nc ) pPager->nee
12230 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e  dSync = 0;.}.#en
12240 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
12250 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
12260 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
12270 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
12280 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
12290 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
122a0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
122b0 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
122c0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
122d0 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
122e0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
122f0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
12300 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
12310 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
12320 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
12330 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
12340 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a  orary file. .**.
12350 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  ** Write the fil
12360 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
12370 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53  o *fd.  Return S
12380 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
12390 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f  ess or some.** o
123a0 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
123b0 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
123c0 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
123d0 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65  cally delete the
123e0 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69   temporary.** fi
123f0 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  le when it is cl
12400 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osed..*/.static 
12410 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
12420 4f 70 65 6e 74 65 6d 70 28 0a 20 20 73 71 6c 69  Opentemp(.  sqli
12430 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
12440 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
12450 20 66 69 6c 65 20 73 79 73 74 65 6d 20 6c 61 79   file system lay
12460 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  er */.  sqlite3_
12470 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
12480 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
12490 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
124a0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
124b0 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61  name,      /* Na
124c0 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20  me of the file. 
124d0 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
124e0 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
124f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
12500 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
12510 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a  h to the VFS */.
12520 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
12530 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
12540 21 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  !=0 );..#ifdef S
12550 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
12560 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
12570 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
12580 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
12590 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
125a0 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
125b0 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
125c0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
125d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
125e0 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
125f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
12600 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
12610 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
12620 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
12630 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
12640 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69 6c 65 2c  Filename, pFile,
12650 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
12660 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
12670 49 54 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d  ITE_OK || pFile-
12680 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 72  >pMethods );.  r
12690 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
126a0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
126b0 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70  page cache and p
126c0 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
126d0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  the page cache i
126e0 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54  n *ppPager..** T
126f0 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
12700 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78  ched need not ex
12710 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69  ist.  The file i
12720 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74  s not locked unt
12730 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  il.** the first 
12740 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
12750 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 69 73  agerGet() and is
12760 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20   only held open 
12770 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73  until the.** las
12780 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
12790 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
127a0 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a  PagerUnref()..**
127b0 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
127c0 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
127d0 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
127e0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
127f0 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
12800 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
12810 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20   to be cached.  
12820 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  The file will be
12830 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
12840 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69  matically when i
12850 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
12860 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
12870 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
12880 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  en all informati
12890 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
128a0 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65  che..** It is ne
128b0 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64  ver written to d
128c0 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62  isk.  This can b
128d0 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
128e0 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d  ent an.** in-mem
128f0 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  ory database..*/
12900 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
12910 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
12920 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
12930 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
12940 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
12950 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
12960 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
12970 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
12980 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
12990 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
129a0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
129b0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
129c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
129d0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
129e0 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
129f0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
12a00 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
12a10 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
12a20 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ge */.  int flag
12a30 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
12a40 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f   /* flags contro
12a50 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20  lling this file 
12a60 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
12a70 73 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s             /*
12a80 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   flags passed th
12a90 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
12aa0 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
12ab0 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20  ){.  u8 *pPtr;. 
12ac0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
12ad0 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
12ae0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
12af0 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c  i;.  int tempFil
12b00 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d  e = 0;.  int mem
12b10 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  Db = 0;.  int re
12b20 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e  adOnly = 0;.  in
12b30 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  t useJournal = (
12b40 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d  flags & PAGER_OM
12b50 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a  IT_JOURNAL)==0;.
12b60 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b    int noReadlock
12b70 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
12b80 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d  R_NO_READLOCK)!=
12b90 30 3b 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c  0;.  int journal
12ba0 46 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74  FileSize = sqlit
12bb0 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
12bc0 66 73 29 3b 0a 20 20 69 6e 74 20 6e 44 65 66 61  fs);.  int nDefa
12bd0 75 6c 74 50 61 67 65 20 3d 20 53 51 4c 49 54 45  ultPage = SQLITE
12be0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
12bf0 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 74  ZE;.  char *zPat
12c00 68 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 50 61  hname;.  int nPa
12c10 74 68 6e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 54 68  thname;..  /* Th
12c20 65 20 64 65 66 61 75 6c 74 20 72 65 74 75 72 6e  e default return
12c30 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
12c40 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  er */.  *ppPager
12c50 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70   = 0;..  /* Comp
12c60 75 74 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ute the full pat
12c70 68 6e 61 6d 65 20 2a 2f 0a 20 20 6e 50 61 74 68  hname */.  nPath
12c80 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
12c90 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 50 61  athname+1;.  zPa
12ca0 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
12cb0 5f 6d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d  _malloc(nPathnam
12cc0 65 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 6e  e);.  if( zPathn
12cd0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
12ce0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
12cf0 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69  M;.  }.  if( zFi
12d00 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
12d10 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65  ame[0] ){.#ifnde
12d20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
12d30 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73  MORYDB.    if( s
12d40 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
12d50 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29  ":memory:")==0 )
12d60 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20  {.      memDb = 
12d70 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61  1;.      zPathna
12d80 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  me[0] = 0;.    }
12d90 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
12da0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
12db0 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
12dc0 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
12dd0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a  me, nPathname, z
12de0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Pathname);.    }
12df0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
12e00 20 3d 20 73 71 6c 69 74 65 33 4f 73 47 65 74 54   = sqlite3OsGetT
12e10 65 6d 70 6e 61 6d 65 28 70 56 66 73 2c 20 6e 50  empname(pVfs, nP
12e20 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  athname, zPathna
12e30 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  me);.  }.  if( r
12e40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12e50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12e60 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
12e70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
12e80 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 74    nPathname = st
12e90 72 6c 65 6e 28 7a 50 61 74 68 6e 61 6d 65 29 3b  rlen(zPathname);
12ea0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
12eb0 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 70  memory for the p
12ec0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a  ager structure *
12ed0 2f 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c  /.  pPager = sql
12ee0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a  ite3MallocZero(.
12ef0 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 61 67      sizeof(*pPag
12f00 65 72 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  er) +           
12f10 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  /* Pager structu
12f20 72 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61  re */.    journa
12f30 6c 46 69 6c 65 53 69 7a 65 20 2b 20 20 20 20 20  lFileSize +     
12f40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75        /* The jou
12f50 72 6e 61 6c 20 66 69 6c 65 20 73 74 72 75 63 74  rnal file struct
12f60 75 72 65 20 2a 2f 20 0a 20 20 20 20 70 56 66 73  ure */ .    pVfs
12f70 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 20 2b  ->szOsFile * 2 +
12f80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
12f90 62 20 61 6e 64 20 73 74 6d 74 20 6a 6f 75 72 6e  b and stmt journ
12fa0 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20  al files */ .   
12fb0 20 34 2a 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34   4*nPathname + 4
12fc0 30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0            /* 
12fd0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69 72 65  zFilename, zDire
12fe0 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  ctory, zJournal,
12ff0 20 7a 53 74 6d 74 4a 72 6e 6c 20 2a 2f 0a 20 20   zStmtJrnl */.  
13000 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
13010 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
13020 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
13030 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13040 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
13050 70 50 74 72 20 3d 20 28 75 38 20 2a 29 26 70 50  pPtr = (u8 *)&pP
13060 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65  ager[1];.  pPage
13070 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66  r->vfsFlags = vf
13080 73 46 6c 61 67 73 3b 0a 20 20 70 50 61 67 65 72  sFlags;.  pPager
13090 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  ->fd = (sqlite3_
130a0 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73  file*)&pPtr[pVfs
130b0 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20  ->szOsFile*0];. 
130c0 20 70 50 61 67 65 72 2d 3e 73 74 66 64 20 3d 20   pPager->stfd = 
130d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
130e0 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46  pPtr[pVfs->szOsF
130f0 69 6c 65 2a 31 5d 3b 0a 20 20 70 50 61 67 65 72  ile*1];.  pPager
13100 2d 3e 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33  ->jfd = (sqlite3
13110 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66  _file*)&pPtr[pVf
13120 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 5d 3b 0a  s->szOsFile*2];.
13130 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
13140 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50  ame = (char*)&pP
13150 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  tr[pVfs->szOsFil
13160 65 2a 32 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  e*2+journalFileS
13170 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize];.  pPager->
13180 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50  zDirectory = &pP
13190 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
131a0 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20  nPathname+1];.  
131b0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
131c0 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72   = &pPager->zDir
131d0 65 63 74 6f 72 79 5b 6e 50 61 74 68 6e 61 6d 65  ectory[nPathname
131e0 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  +1];.  pPager->z
131f0 53 74 6d 74 4a 72 6e 6c 20 3d 20 26 70 50 61 67  StmtJrnl = &pPag
13200 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
13210 74 68 6e 61 6d 65 2b 31 30 5d 3b 0a 20 20 70 50  thname+10];.  pP
13220 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66  ager->pVfs = pVf
13230 73 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67  s;.  memcpy(pPag
13240 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
13250 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
13260 61 6d 65 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  ame+1);.  sqlite
13270 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
13280 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  );..  /* Open th
13290 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20  e pager file..  
132a0 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
132b0 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
132c0 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a  0] && !memDb ){.
132d0 20 20 20 20 69 66 28 20 6e 50 61 74 68 6e 61 6d      if( nPathnam
132e0 65 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  e>(pVfs->mxPathn
132f0 61 6d 65 20 2d 20 73 69 7a 65 6f 66 28 22 2d 6a  ame - sizeof("-j
13300 6f 75 72 6e 61 6c 22 29 29 20 29 7b 0a 20 20 20  ournal")) ){.   
13310 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
13320 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c  ANTOPEN;.    }el
13330 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 6f  se{.      int fo
13340 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  ut = 0;.      rc
13350 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
13360 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
13370 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
13380 2d 3e 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20  ->fd,.          
13390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
133a0 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 2c  Pager->vfsFlags,
133b0 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 72   &fout);.      r
133c0 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26  eadOnly = (fout&
133d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
133e0 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ONLY);..      /*
133f0 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
13400 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
13410 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72  ened for read/wr
13420 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20  ite access,.    
13430 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65    ** choose a de
13440 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
13450 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20  in case we have 
13460 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20  to create the.  
13470 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
13480 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c  file. The defaul
13490 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74  t page size is t
134a0 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20  he maximum of:. 
134b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
134c0 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46      + SQLITE_DEF
134d0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a  AULT_PAGE_SIZE,.
134e0 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68        **    + Th
134f0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
13500 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
13510 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 20 20  torSize().      
13520 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67  **    + The larg
13530 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68  est page size th
13540 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  at can be writte
13550 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  n atomically..  
13560 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
13570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13580 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  & !readOnly ){. 
13590 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 63 74         int iSect
135a0 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
135b0 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  OsSectorSize(pPa
135c0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
135d0 20 20 69 66 28 20 6e 44 65 66 61 75 6c 74 50 61    if( nDefaultPa
135e0 67 65 3c 69 53 65 63 74 6f 72 53 69 7a 65 20 29  ge<iSectorSize )
135f0 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 44 65 66  {.          nDef
13600 61 75 6c 74 50 61 67 65 20 3d 20 69 53 65 63 74  aultPage = iSect
13610 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  orSize;.        
13620 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
13630 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
13640 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  ITE.        {.  
13650 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20          int iDc 
13660 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
13670 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
13680 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
13690 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
136a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
136b0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
136c0 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
136d0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ));.          as
136e0 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
136f0 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
13700 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  536>>8));.      
13710 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
13720 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
13730 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b  GE_SIZE<=65536);
13740 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
13750 69 3d 6e 44 65 66 61 75 6c 74 50 61 67 65 3b 20  i=nDefaultPage; 
13760 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ii<=SQLITE_MAX_D
13770 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
13780 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20  ; ii=ii*2){.    
13790 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26          if( iDc&
137a0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
137b0 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 20  OMIC|(ii>>8)) ) 
137c0 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20 69  nDefaultPage = i
137d0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  i;.          }. 
137e0 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
137f0 20 20 20 20 20 20 20 20 69 66 28 20 6e 44 65 66          if( nDef
13800 61 75 6c 74 50 61 67 65 3e 53 51 4c 49 54 45 5f  aultPage>SQLITE_
13810 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
13820 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
13830 20 20 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20     nDefaultPage 
13840 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  = SQLITE_MAX_DEF
13850 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
13860 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13870 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
13880 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20  if( !memDb ){.  
13890 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72    /* If a tempor
138a0 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75  ary file is requ
138b0 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74  ested, it is not
138c0 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74   opened immediat
138d0 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ely..    ** In t
138e0 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65  his case we acce
138f0 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  pt the default p
13900 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c  age size and del
13910 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  ay actually.    
13920 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66  ** opening the f
13930 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ile until the fi
13940 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72  rst call to OsWr
13950 69 74 65 28 29 2e 0a 20 20 20 20 2a 2f 20 0a 20  ite()..    */ . 
13960 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
13970 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
13980 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
13990 53 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  SIVE;.  }..  if(
139a0 20 70 50 61 67 65 72 20 26 26 20 72 63 3d 3d 53   pPager && rc==S
139b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
139c0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
139d0 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  e = (char *)sqli
139e0 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 44 65 66 61  te3_malloc(nDefa
139f0 75 6c 74 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20  ultPage);.  }.. 
13a00 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
13a10 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68 65  occured in eithe
13a20 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20  r of the blocks 
13a30 61 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72 65 65  above..  ** Free
13a40 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
13a50 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  ture and close t
13a60 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53 69  he file..  ** Si
13a70 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73  nce the pager is
13a80 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74   not allocated t
13a90 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
13aa0 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79  to set .  ** any
13ab0 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76   Pager.errMask v
13ac0 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  ariables..  */. 
13ad0 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20   if( !pPager || 
13ae0 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  !pPager->pTmpSpa
13af0 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ce ){.    sqlite
13b00 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
13b10 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  >fd);.    sqlite
13b20 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
13b30 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d      return ((rc=
13b40 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49  =SQLITE_OK)?SQLI
13b50 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20  TE_NOMEM:rc);.  
13b60 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 33  }..  PAGERTRACE3
13b70 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
13b80 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50   FILEHANDLEID(pP
13b90 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65  ager->fd), pPage
13ba0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
13bb0 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20   IOTRACE(("OPEN 
13bc0 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72  %p %s\n", pPager
13bd0 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
13be0 61 6d 65 29 29 0a 0a 20 20 2f 2a 20 46 69 6c 6c  ame))..  /* Fill
13bf0 20 69 6e 20 50 61 67 65 72 2e 7a 44 69 72 65 63   in Pager.zDirec
13c00 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63  tory[] */.  memc
13c10 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  py(pPager->zDire
13c20 63 74 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e 7a  ctory, pPager->z
13c30 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
13c40 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28 69 3d  ame+1);.  for(i=
13c50 73 74 72 6c 65 6e 28 70 50 61 67 65 72 2d 3e 7a  strlen(pPager->z
13c60 44 69 72 65 63 74 6f 72 79 29 3b 20 69 3e 30 20  Directory); i>0 
13c70 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  && pPager->zDire
13c80 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b  ctory[i-1]!='/';
13c90 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e   i--){}.  if( i>
13ca0 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  0 ) pPager->zDir
13cb0 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b  ectory[i-1] = 0;
13cc0 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50  ..  /* Fill in P
13cd0 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d 20  ager.zJournal[] 
13ce0 61 6e 64 20 50 61 67 65 72 2e 7a 53 74 6d 74 4a  and Pager.zStmtJ
13cf0 72 6e 6c 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70  rnl[] */.  memcp
13d00 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
13d10 61 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  al, pPager->zFil
13d20 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  ename, nPathname
13d30 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61  );.  memcpy(&pPa
13d40 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
13d50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72  athname], "-jour
13d60 6e 61 6c 22 2c 20 39 29 3b 0a 20 20 6d 65 6d 63  nal", 9);.  memc
13d70 70 79 28 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74  py(pPager->zStmt
13d80 4a 72 6e 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46  Jrnl, pPager->zF
13d90 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
13da0 6d 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70  me);.  memcpy(&p
13db0 50 61 67 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c  Pager->zStmtJrnl
13dc0 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 73  [nPathname], "-s
13dd0 74 6d 74 6a 72 6e 6c 22 2c 20 31 30 29 3b 0a 0a  tmtjrnl", 10);..
13de0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75    /* pPager->jou
13df0 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  rnalOpen = 0; */
13e00 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  .  pPager->useJo
13e10 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e  urnal = useJourn
13e20 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20  al && !memDb;.  
13e30 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
13e40 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20  ck = noReadlock 
13e50 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f  && readOnly;.  /
13e60 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  * pPager->stmtOp
13e70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  en = 0; */.  /* 
13e80 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
13e90 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
13ea0 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
13eb0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
13ec0 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a  Size = memDb-1;.
13ed0 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
13ee0 7a 65 20 3d 20 6e 44 65 66 61 75 6c 74 50 61 67  ze = nDefaultPag
13ef0 65 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  e;.  /* pPager->
13f00 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  stmtSize = 0; */
13f10 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
13f20 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  mtJSize = 0; */.
13f30 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61    /* pPager->nPa
13f40 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ge = 0; */.  pPa
13f50 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
13f60 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  0;.  pPager->mxP
13f70 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  gno = SQLITE_MAX
13f80 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f  _PAGE_COUNT;.  /
13f90 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
13fa0 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
13fb0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
13fc0 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74  ger->state == (t
13fd0 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f  empFile ? PAGER_
13fe0 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45  EXCLUSIVE : PAGE
13ff0 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f  R_UNLOCK) );.  /
14000 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
14010 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  k = 0; */.  pPag
14020 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74  er->tempFile = t
14030 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72  empFile;.  asser
14040 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  t( tempFile==PAG
14050 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
14060 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20  ORMAL .         
14070 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41   || tempFile==PA
14080 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
14090 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
140a0 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
140b0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
140c0 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65  VE==1 );.  pPage
140d0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
140e0 20 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20   = tempFile; .  
140f0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20  pPager->memDb = 
14100 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
14110 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64  >readOnly = read
14120 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Only;.  /* pPage
14130 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
14140 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   */.  pPager->no
14150 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
14160 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a  empFile || !useJ
14170 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72  ournal;.  pPager
14180 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50  ->fullSync = (pP
14190 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31  ager->noSync?0:1
141a0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  );.  pPager->syn
141b0 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  c_flags = SQLITE
141c0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
141d0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
141e0 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  t = 0; */.  /* p
141f0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
14200 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ced = 0; */.  /*
14210 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
14220 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
14230 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f  >nExtra = FORCE_
14240 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61  ALIGNMENT(nExtra
14250 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  );.  assert(pPag
14260 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
14270 7c 7c 6d 65 6d 44 62 7c 7c 74 65 6d 70 46 69 6c  ||memDb||tempFil
14280 65 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62  e);.  if( !memDb
14290 20 29 7b 0a 20 20 20 20 73 65 74 53 65 63 74 6f   ){.    setSecto
142a0 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
142b0 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
142c0 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  pBusyHandler = 0
142d0 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  ; */.  /* memset
142e0 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
142f0 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
14300 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20  ->aHash)); */.  
14310 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
14320 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  r;.#ifdef SQLITE
14330 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
14340 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67  ANAGEMENT.  pPag
14350 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30  er->iInUseMM = 0
14360 3b 0a 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55  ;.  pPager->iInU
14370 73 65 44 42 20 3d 20 30 3b 0a 20 20 69 66 28 20  seDB = 0;.  if( 
14380 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 71  !memDb ){.    sq
14390 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
143a0 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
143b0 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
143c0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d  MUTEX_STATIC_MEM
143d0 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  2);.    sqlite3_
143e0 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
143f0 78 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  x);.    pPager->
14400 70 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 50  pNext = sqlite3P
14410 61 67 65 72 4c 69 73 74 3b 0a 20 20 20 20 69 66  agerList;.    if
14420 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69  ( sqlite3PagerLi
14430 73 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  st ){.      asse
14440 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
14450 4c 69 73 74 2d 3e 70 50 72 65 76 3d 3d 30 20 29  List->pPrev==0 )
14460 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
14470 61 67 65 72 4c 69 73 74 2d 3e 70 50 72 65 76 20  agerList->pPrev 
14480 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 7d 0a  = pPager;.    }.
14490 20 20 20 20 70 50 61 67 65 72 2d 3e 70 50 72 65      pPager->pPre
144a0 76 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  v = 0;.    sqlit
144b0 65 33 50 61 67 65 72 4c 69 73 74 20 3d 20 70 50  e3PagerList = pP
144c0 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  ager;.    sqlite
144d0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
144e0 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  tex);.  }.#endif
144f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14500 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
14510 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  t the busy handl
14520 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  er function..*/.
14530 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
14540 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
14550 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42  Pager *pPager, B
14560 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73  usyHandler *pBus
14570 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61  yHandler){.  pPa
14580 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
14590 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72  r = pBusyHandler
145a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
145b0 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
145c0 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49  r this pager.  I
145d0 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
145e0 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 63 61  destructor is ca
145f0 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  lled.** when the
14600 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
14610 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72 65   on each page re
14620 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65  aches zero.  The
14630 20 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a   destructor can.
14640 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c  ** be used to cl
14650 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69  ean up informati
14660 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61 20  on in the extra 
14670 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64  segment appended
14680 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a   to each page..*
14690 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63  *.** The destruc
146a0 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  tor is not calle
146b0 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 73 71  d as a result sq
146c0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
146d0 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74  ).  .** Destruct
146e0 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c  ors are only cal
146f0 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 61  led by sqlite3Pa
14700 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76  gerUnref()..*/.v
14710 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
14720 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 50 61  SetDestructor(Pa
14730 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
14740 64 20 28 2a 78 44 65 73 63 29 28 44 62 50 61 67  d (*xDesc)(DbPag
14750 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  e*,int)){.  pPag
14760 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
14770 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  = xDesc;.}../*.*
14780 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74  * Set the reinit
14790 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73  ializer for this
147a0 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
147b0 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74  NULL, the reinit
147c0 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61  ializer.** is ca
147d0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f  lled when the co
147e0 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20  ntent of a page 
147f0 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74  in cache is rest
14800 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
14810 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73  inal.** value as
14820 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72   a result of a r
14830 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61  ollback.  The ca
14840 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67  llback gives hig
14850 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a  her-level code.*
14860 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  * an opportunity
14870 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
14880 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f  EXTRA section to
14890 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
148a0 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65  restored.** page
148b0 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73   data..*/.void s
148c0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65  qlite3PagerSetRe
148d0 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50  initer(Pager *pP
148e0 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65  ager, void (*xRe
148f0 69 6e 69 74 29 28 44 62 50 61 67 65 2a 2c 69 6e  init)(DbPage*,in
14900 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  t)){.  pPager->x
14910 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
14920 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  it;.}../*.** Set
14930 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 74   the page size t
14940 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 20 49 66  o *pPageSize. If
14950 20 74 68 65 20 73 75 67 67 65 73 74 20 6e 65 77   the suggest new
14960 20 70 61 67 65 20 73 69 7a 65 20 69 73 0a 2a 2a   page size is.**
14970 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20   inappropriate, 
14980 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74  then an alternat
14990 69 76 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  ive page size is
149a0 20 73 65 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20   set to that.** 
149b0 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74  value before ret
149c0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
149d0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
149e0 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  gesize(Pager *pP
149f0 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67 65  ager, u16 *pPage
14a00 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Size){.  int rc 
14a10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
14a20 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70  16 pageSize = *p
14a30 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
14a40 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20  rt( pageSize==0 
14a50 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31  || (pageSize>=51
14a60 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
14a70 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
14a80 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 70 61  IZE) );.  if( pa
14a90 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69  geSize && pageSi
14aa0 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65  ze!=pPager->page
14ab0 53 69 7a 65 20 0a 20 20 20 26 26 20 21 70 50 61  Size .   && !pPa
14ac0 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50  ger->memDb && pP
14ad0 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 0a 20  ager->nRef==0 . 
14ae0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e   ){.    char *pN
14af0 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ew = (char *)sql
14b00 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 61 67 65  ite3_malloc(page
14b10 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Size);.    if( !
14b20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63  pNew ){.      rc
14b30 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
14b40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14b50 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
14b60 67 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65  ger);.      page
14b70 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
14b80 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
14b90 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
14ba0 7a 65 3b 0a 20 20 20 20 20 20 73 65 74 53 65 63  ze;.      setSec
14bb0 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
14bc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
14bd0 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
14be0 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50  Space);.      pP
14bf0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
14c00 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 61  = pNew;.      pa
14c10 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
14c20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
14c30 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65  PageSize = pPage
14c40 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 72  r->pageSize;.  r
14c50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14c60 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
14c70 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70  ter to the "temp
14c80 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66  orary page" buff
14c90 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c  er held internal
14ca0 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67  ly.** by the pag
14cb0 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62  er.  This is a b
14cc0 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69  uffer that is bi
14cd0 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
14ce0 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63   the.** entire c
14cf0 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61  ontent of a data
14d00 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73  base page.  This
14d10 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
14d20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75  internally.** du
14d30 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ring rollback an
14d40 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  d will be overwr
14d50 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61  itten whenever a
14d60 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
14d70 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20  urs.  But other 
14d80 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65  modules are free
14d90 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20   to use it too, 
14da0 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f  as long as.** no
14db0 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68   rollbacks are h
14dc0 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  appening..*/.voi
14dd0 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54  d *sqlite3PagerT
14de0 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a  empSpace(Pager *
14df0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
14e00 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  n pPager->pTmpSp
14e10 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  ace;.}../*.** At
14e20 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
14e30 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73   maximum databas
14e40 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20  e page count if 
14e50 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
14e60 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20  ve. .** Make no 
14e70 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67  changes if mxPag
14e80 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67  e is zero or neg
14e90 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65  ative.  And neve
14ea0 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20  r reduce the.** 
14eb0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
14ec0 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72  nt below the cur
14ed0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
14ee0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
14ef0 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d   Regardless of m
14f00 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
14f10 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
14f20 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
14f30 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
14f40 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61  rMaxPageCount(Pa
14f50 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
14f60 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
14f70 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  mxPage>0 ){.    
14f80 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
14f90 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73   mxPage;.  }.  s
14fa0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
14fb0 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
14fc0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d  return pPager->m
14fd0 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xPgno;.}../*.** 
14fe0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  The following se
14ff0 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  t of routines ar
15000 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c  e used to disabl
15010 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a  e the simulated.
15020 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63  ** I/O error mec
15030 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72  hanism.  These r
15040 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
15050 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61   to avoid simula
15060 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e  ted.** errors in
15070 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65   places where we
15080 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
15090 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ut errors..**.**
150a0 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45   Unless -DSQLITE
150b0 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c  _TEST=1 is used,
150c0 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
150d0 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
150e0 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e  * and generate n
150f0 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65  o code..*/.#ifde
15100 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78  f SQLITE_TEST.ex
15110 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
15120 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
15130 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
15140 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
15150 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  it;.static int s
15160 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64  aved_cnt;.void d
15170 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
15180 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
15190 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
151a0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
151b0 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
151c0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
151d0 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
151e0 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
151f0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
15200 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
15210 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
15220 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
15230 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73  lse.# define dis
15240 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
15250 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
15260 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
15270 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
15280 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
15290 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
152a0 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
152b0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
152c0 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
152d0 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
152e0 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a  oints to. .**.**
152f0 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69   No error checki
15300 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20  ng is done. The 
15310 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69  rational for thi
15320 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  s is that this f
15330 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20  unction .** may 
15340 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69  be called even i
15350 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  f the file does 
15360 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e  not exist or con
15370 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49  tain a header. I
15380 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65  n .** these case
15390 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  s sqlite3OsRead(
153a0 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e  ) will return an
153b0 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68   error, to which
153c0 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a   the correct .**
153d0 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20   response is to 
153e0 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20  zero the memory 
153f0 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e  at pDest and con
15400 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49  tinue.  A real I
15410 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c  O error .** will
15420 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75   presumably recu
15430 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20  r and be picked 
15440 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20  up later (Todo: 
15450 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73  Think about this
15460 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
15470 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
15480 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
15490 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
154a0 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
154b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
154c0 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
154d0 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
154e0 20 61 73 73 65 72 74 28 4d 45 4d 44 42 7c 7c 70   assert(MEMDB||p
154f0 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
15500 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d  ods||pPager->tem
15510 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 50  pFile);.  if( pP
15520 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
15530 64 73 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  ds ){.    IOTRAC
15540 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
15550 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
15560 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
15570 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
15580 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
15590 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
155a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
155b0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
155c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
155d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
155e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
155f0 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
15600 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
15610 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
15620 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
15630 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a  h.** pPager. .**
15640 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49  .** If the PENDI
15650 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20  NG_BYTE lies on 
15660 74 68 65 20 70 61 67 65 20 64 69 72 65 63 74 6c  the page directl
15670 79 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20  y after the end 
15680 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20  of the.** file, 
15690 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68  then consider th
156a0 69 73 20 70 61 67 65 20 70 61 72 74 20 6f 66 20  is page part of 
156b0 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f  the file too. Fo
156c0 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a  r example, if.**
156d0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73   PENDING_BYTE is
156e0 20 62 79 74 65 20 34 30 39 36 20 28 74 68 65 20   byte 4096 (the 
156f0 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 70 61  first byte of pa
15700 67 65 20 35 29 20 61 6e 64 20 74 68 65 20 73 69  ge 5) and the si
15710 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  ze of the.** fil
15720 65 20 69 73 20 34 30 39 36 20 62 79 74 65 73 2c  e is 4096 bytes,
15730 20 35 20 69 73 20 72 65 74 75 72 6e 65 64 20 69   5 is returned i
15740 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a  nstead of 4..*/.
15750 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
15760 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
15770 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
15780 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  n = 0;.  int rc;
15790 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
157a0 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  r!=0 );.  if( pP
157b0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
157c0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
157d0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
157e0 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20  >dbSize>=0 ){.  
157f0 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62    n = pPager->db
15800 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  Size;.  } else {
15810 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67  .    assert(pPag
15820 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
15830 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ||pPager->tempFi
15840 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50  le);.    if( (pP
15850 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
15860 64 73 29 0a 20 20 20 20 20 26 26 20 28 72 63 20  ds).     && (rc 
15870 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
15880 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
15890 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  &n))!=SQLITE_OK 
158a0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
158b0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 70  >nRef++;.      p
158c0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
158d0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50  r, rc);.      pP
158e0 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  ager->nRef--;.  
158f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
15900 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20    }.    if( n>0 
15910 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67  && n<pPager->pag
15920 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e  eSize ){.      n
15930 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
15940 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61 67  .      n /= pPag
15950 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
15960 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
15970 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
15980 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  _UNLOCK ){.     
15990 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
159a0 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = n;.    }.  }. 
159b0 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47   if( n==(PENDING
159c0 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61  _BYTE/pPager->pa
159d0 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e  geSize) ){.    n
159e0 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e  ++;.  }.  if( n>
159f0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
15a00 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
15a10 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20  Pgno = n;.  }.  
15a20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69  return n;.}...#i
15a30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15a40 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a  T_MEMORYDB./*.**
15a50 20 43 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f   Clear a PgHisto
15a60 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74  ry block.*/.stat
15a70 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73  ic void clearHis
15a80 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a  tory(PgHistory *
15a90 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65  pHist){.  sqlite
15aa0 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 4f  3_free(pHist->pO
15ab0 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  rig);.  sqlite3_
15ac0 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  free(pHist->pStm
15ad0 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72  t);.  pHist->pOr
15ae0 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d  ig = 0;.  pHist-
15af0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65  >pStmt = 0;.}.#e
15b00 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61  lse.#define clea
15b10 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64  rHistory(x).#end
15b20 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  if../*.** Forwar
15b30 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
15b40 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
15b50 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b  Journal(Pager*);
15b60 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70  ../*.** Unlink p
15b70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73  Pg from it's has
15b80 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65  h chain. Also se
15b90 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
15ba0 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61  r to 0 to indica
15bb0 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  te.** that the p
15bc0 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20  age is not part 
15bd0 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69  of any hash chai
15be0 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  n. This is requi
15bf0 72 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a  red because the.
15c00 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  ** sqlite3PagerM
15c10 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e  ovepage() routin
15c20 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61  e can leave a pa
15c30 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e  ge in the .** pN
15c40 65 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65  extFree/pPrevFre
15c50 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e  e list that is n
15c60 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79  ot a part of any
15c70 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a   hash-chain..*/.
15c80 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69  static void unli
15c90 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65  nkHashChain(Page
15ca0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
15cb0 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
15cc0 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  g->pgno==0 ){.  
15cd0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
15ce0 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70  NextHash==0 && p
15cf0 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  Pg->pPrevHash==0
15d00 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
15d10 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
15d20 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
15d30 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
15d40 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d  pPrevHash = pPg-
15d50 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a  >pPrevHash;.  }.
15d60 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
15d70 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65  Hash ){.    asse
15d80 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
15d90 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70  h[pPg->pgno & (p
15da0 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d  Pager->nHash-1)]
15db0 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67  !=pPg );.    pPg
15dc0 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65  ->pPrevHash->pNe
15dd0 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e  xtHash = pPg->pN
15de0 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65  extHash;.  }else
15df0 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50  {.    int h = pP
15e00 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65  g->pgno & (pPage
15e10 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20  r->nHash-1);.   
15e20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
15e30 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ] = pPg->pNextHa
15e40 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45  sh;.  }.  if( ME
15e50 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72  MDB ){.    clear
15e60 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f  History(PGHDR_TO
15e70 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
15e80 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  r));.  }.  pPg->
15e90 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d  pgno = 0;.  pPg-
15ea0 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
15eb0 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
15ec0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
15ed0 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
15ee0 20 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20   free list (the 
15ef0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
15f00 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29  s where nRef==0)
15f10 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73  .** and from its
15f20 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20   hash collision 
15f30 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  chain..*/.static
15f40 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65   void unlinkPage
15f50 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
15f60 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
15f70 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
15f80 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 66  /* Unlink from f
15f90 72 65 65 20 70 61 67 65 20 6c 69 73 74 20 2a 2f  ree page list */
15fa0 0a 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65  .  lruListRemove
15fb0 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c  (pPg);..  /* Unl
15fc0 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e  ink from the pgn
15fd0 6f 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  o hash table */.
15fe0 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
15ff0 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a  n(pPager, pPg);.
16000 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
16010 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
16020 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 63 61   truncate the ca
16030 63 68 65 20 77 68 65 6e 20 61 20 64 61 74 61 62  che when a datab
16040 61 73 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61  ase.** is trunca
16050 74 65 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20  ted.  Drop from 
16060 74 68 65 20 63 61 63 68 65 20 61 6c 6c 20 70 61  the cache all pa
16070 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69  ges whose pgno i
16080 73 0a 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e  s.** larger than
16090 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
160a0 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e  and is unreferen
160b0 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72  ced..**.** Refer
160c0 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67  enced pages larg
160d0 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
160e0 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65  dbSize are zeroe
160f0 64 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c  d..**.** Actuall
16100 79 2c 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  y, at the point 
16110 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
16120 63 61 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64  called, it would
16130 20 62 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   be.** an error 
16140 74 6f 20 68 61 76 65 20 61 20 72 65 66 65 72 65  to have a refere
16150 6e 63 65 64 20 70 61 67 65 2e 20 20 42 75 74 20  nced page.  But 
16160 72 61 74 68 65 72 20 74 68 61 6e 20 64 65 6c 65  rather than dele
16170 74 65 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  te.** that page 
16180 61 6e 64 20 67 75 61 72 61 6e 74 65 65 20 61 20  and guarantee a 
16190 73 75 62 73 65 71 75 65 6e 74 20 73 65 67 66 61  subsequent segfa
161a0 75 6c 74 2c 20 69 74 20 73 65 65 6d 73 20 62 65  ult, it seems be
161b0 74 74 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20  tter.** to zero 
161c0 69 74 20 61 6e 64 20 68 6f 70 65 20 74 68 61 74  it and hope that
161d0 20 77 65 20 65 72 72 6f 72 20 6f 75 74 20 73 61   we error out sa
161e0 6e 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nely..*/.static 
161f0 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63  void pager_trunc
16200 61 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20  ate_cache(Pager 
16210 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
16220 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20  r *pPg;.  PgHdr 
16230 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62  **ppPg;.  int db
16240 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
16250 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d  bSize;..  ppPg =
16260 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a   &pPager->pAll;.
16270 20 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20    while( (pPg = 
16280 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20  *ppPg)!=0 ){.   
16290 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d   if( pPg->pgno<=
162a0 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
162b0 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65  ppPg = &pPg->pNe
162c0 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  xtAll;.    }else
162d0 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30   if( pPg->nRef>0
162e0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
162f0 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
16300 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
16310 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
16320 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e   ppPg = &pPg->pN
16330 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73  extAll;.    }els
16340 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d  e{.      *ppPg =
16350 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
16360 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
16370 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c  PGFREE %p %d\n",
16380 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
16390 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45  no));.      PAGE
163a0 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
163b0 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e  ager_pgfree_coun
163c0 74 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b  t);.      unlink
163d0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
163e0 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
163f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
16400 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ree(pPg);.      
16410 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b  pPager->nPage--;
16420 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
16430 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69  .** Try to obtai
16440 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69  n a lock on a fi
16450 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20  le.  Invoke the 
16460 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
16470 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20   the lock.** is 
16480 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76  currently not av
16490 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74  ailable.  Repeat
164a0 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
164b0 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
164c0 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74  .** false or unt
164d0 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  il the lock succ
164e0 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
164f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
16500 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
16510 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
16520 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
16530 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74   the lock..*/.st
16540 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
16550 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65  ait_on_lock(Page
16560 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
16570 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
16580 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53  rc;..  /* The OS
16590 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73   lock values mus
165a0 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
165b0 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20   the Pager lock 
165c0 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65  values */.  asse
165d0 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44  rt( PAGER_SHARED
165e0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
165f0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
16600 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52  _RESERVED==RESER
16610 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  VED_LOCK );.  as
16620 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c  sert( PAGER_EXCL
16630 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45  USIVE==EXCLUSIVE
16640 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49  _LOCK );..  /* I
16650 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 75  f the file is cu
16660 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64  rrently unlocked
16670 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d   then the size m
16680 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a  ust be unknown *
16690 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
166a0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
166b0 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65  _SHARED || pPage
166c0 72 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d  r->dbSize<0 || M
166d0 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70  EMDB );..  if( p
166e0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f  Pager->state>=lo
166f0 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63  cktype ){.    rc
16700 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16710 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a  }else{.    do {.
16720 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16730 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
16740 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  >fd, locktype);.
16750 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
16760 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73  SQLITE_BUSY && s
16770 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
16780 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
16790 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b  pBusyHandler) );
167a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
167b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
167c0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
167d0 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20  locktype;.      
167e0 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25  IOTRACE(("LOCK %
167f0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
16800 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20   locktype)).    
16810 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
16820 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
16830 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
16840 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
16850 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a  ages specified..
16860 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
16870 67 65 72 54 72 75 6e 63 61 74 65 28 50 61 67 65  gerTruncate(Page
16880 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
16890 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
168a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
168b0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
168c0 5f 53 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42  _SHARED || MEMDB
168d0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
168e0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
168f0 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
16900 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
16910 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
16920 72 72 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75  rrCode;.    retu
16930 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
16940 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65   nPage>=(unsigne
16950 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  d)pPager->dbSize
16960 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
16970 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
16980 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
16990 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
169a0 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67  = nPage;.    pag
169b0 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
169c0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
169d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
169e0 0a 20 20 7d 0a 20 20 70 61 67 65 72 45 6e 74 65  .  }.  pagerEnte
169f0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20  r(pPager);.  rc 
16a00 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
16a10 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65  ager);.  pagerLe
16a20 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ave(pPager);.  i
16a30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16a40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
16a50 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74  c;.  }..  /* Get
16a60 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
16a70 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
16a80 73 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61  se before trunca
16a90 74 69 6e 67 2e 20 2a 2f 0a 20 20 70 61 67 65 72  ting. */.  pager
16aa0 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
16ab0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
16ac0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
16ad0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
16ae0 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
16af0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
16b00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16b10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16b20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  }..  rc = pager_
16b30 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
16b40 20 6e 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72   nPage);.  retur
16b50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
16b60 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65  hutdown the page
16b70 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c   cache.  Free al
16b80 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f  l memory and clo
16b90 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a  se all files..**
16ba0 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
16bb0 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67  tion was in prog
16bc0 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72  ress when this r
16bd0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
16be0 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61  , that.** transa
16bf0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
16c00 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74  back.  All outst
16c10 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
16c20 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20   invalidated.** 
16c30 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  and their memory
16c40 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20   is freed.  Any 
16c50 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
16c60 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64   page associated
16c70 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61  .** with this pa
16c80 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74  ge cache after t
16c90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
16ca0 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  urns will likely
16cb0 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20  .** result in a 
16cc0 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20  coredump..**.** 
16cd0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
16ce0 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49  ways succeeds. I
16cf0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
16d00 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74  is active an att
16d10 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20  empt.** is made 
16d20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
16d30 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
16d40 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
16d50 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f  ollback .** a ho
16d60 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65  t journal may be
16d70 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
16d80 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65  esystem but no e
16d90 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
16da0 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  .** to the calle
16db0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
16dc0 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65  3PagerClose(Page
16dd0 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64  r *pPager){.#ifd
16de0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
16df0 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
16e00 4e 54 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20  NT.  if( !MEMDB 
16e10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  ){.    sqlite3_m
16e20 75 74 65 78 20 2a 6d 75 74 65 78 20 3d 20 73 71  utex *mutex = sq
16e30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
16e40 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
16e50 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20  TATIC_MEM2);.   
16e60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
16e70 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20  nter(mutex);.   
16e80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 50 72   if( pPager->pPr
16e90 65 76 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ev ){.      pPag
16ea0 65 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  er->pPrev->pNext
16eb0 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74   = pPager->pNext
16ec0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16ed0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c     sqlite3PagerL
16ee0 69 73 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e  ist = pPager->pN
16ef0 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ext;.    }.    i
16f00 66 28 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74  f( pPager->pNext
16f10 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
16f20 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
16f30 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 3b 0a   pPager->pPrev;.
16f40 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
16f50 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
16f60 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  tex);.  }.#endif
16f70 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ..  disable_simu
16f80 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
16f90 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72  );.  pPager->err
16fa0 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Code = 0;.  pPag
16fb0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
16fc0 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72  e = 0;.  pager_r
16fd0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
16fe0 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
16ff0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
17000 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
17010 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
17020 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43    PAGERTRACE2("C
17030 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45  LOSE %d\n", PAGE
17040 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
17050 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  IOTRACE(("CLOSE 
17060 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
17070 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17080 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50  ->errCode || (pP
17090 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
170a0 6e 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  n==0 && pPager->
170b0 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a  stmtOpen==0) );.
170c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
170d0 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
170e0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
170f0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
17100 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
17110 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
17120 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67  nal);.  if( pPag
17130 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
17140 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
17150 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29  se(pPager->stfd)
17160 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
17170 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
17180 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69  d);.  /* Temp fi
17190 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69  les are automati
171a0 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79  cally deleted by
171b0 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28   the OS.  ** if(
171c0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
171d0 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69  e ){.  **   sqli
171e0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
171f0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
17200 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73    ** }.  */..  s
17210 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
17220 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71  er->aHash);.  sq
17230 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
17240 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
17250 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
17260 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
17270 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
17280 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
17290 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
172a0 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
172b0 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
172c0 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
172d0 67 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e  given page data.
172e0 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33  .*/.Pgno sqlite3
172f0 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
17300 44 62 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65  DbPage *p){.  re
17310 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a  turn p->pgno;.}.
17320 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
17330 65 20 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e  e page_ref() fun
17340 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73  ction increments
17350 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
17360 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  ount for a page.
17370 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
17380 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20  is currently on 
17390 74 68 65 20 66 72 65 65 6c 69 73 74 20 28 74 68  the freelist (th
173a0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
173b0 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a  t is zero) then.
173c0 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f  ** remove it fro
173d0 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  m the freelist..
173e0 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65  **.** For non-te
173f0 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65  st systems, page
17400 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61 63 72  _ref() is a macr
17410 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61  o that calls _pa
17420 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69  ge_ref().** onli
17430 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65 72 65  ne of the refere
17440 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72  nce count is zer
17450 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73 79 73  o.  For test sys
17460 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29  tems, page_ref()
17470 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75  .** is a real fu
17480 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77  nction so that w
17490 65 20 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70  e can set breakp
174a0 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20  oints and trace 
174b0 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
174c0 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48  id _page_ref(PgH
174d0 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
174e0 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
174f0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
17500 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20  is currently on 
17510 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
17520 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20  emove it. */.   
17530 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70   lruListRemove(p
17540 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  Pg);.    pPg->pP
17550 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
17560 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b  }.  pPg->nRef++;
17570 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b  .  REFINFO(pPg);
17580 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
17590 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  _DEBUG.  static 
175a0 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67  void page_ref(Pg
175b0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69  Hdr *pPg){.    i
175c0 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
175d0 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72  ){.      _page_r
175e0 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  ef(pPg);.    }el
175f0 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  se{.      pPg->n
17600 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46  Ref++;.      REF
17610 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d  INFO(pPg);.    }
17620 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  .  }.#else.# def
17630 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20  ine page_ref(P) 
17640 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f    ((P)->nRef==0?
17650 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f  _page_ref(P):(vo
17660 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a  id)(P)->nRef++).
17670 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
17680 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
17690 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
176a0 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70  a page.  The inp
176b0 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a  ut pointer is.**
176c0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
176d0 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
176e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
176f0 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
17700 67 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  g){.  pagerEnter
17710 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pPg->pPager);. 
17720 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
17730 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 67    pagerLeave(pPg
17740 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  ->pPager);.  ret
17750 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17760 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
17770 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74   journal.  In ot
17780 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
17790 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
177a0 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
177b0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
177c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
177d0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
177e0 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
177f0 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49   the.** disk.  I
17800 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
17810 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67   modify the orig
17820 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
17830 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a  le until after.*
17840 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
17850 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  s been synced.  
17860 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
17870 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69  database is modi
17880 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  fied before.** t
17890 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
178a0 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72  nced and a power
178b0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c   failure occurs,
178c0 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f   the unsynced jo
178d0 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f  urnal.** data wo
178e0 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20  uld be lost and 
178f0 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62  we would be unab
17900 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  le to completely
17910 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a   rollback the.**
17920 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
17930 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  s.  Database cor
17940 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63  ruption would oc
17950 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  cur..** .** This
17960 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70   routine also up
17970 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66  dates the nRec f
17980 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64  ield in the head
17990 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
179a0 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65  l..** (See comme
179b0 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72  nts on the pager
179c0 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
179d0 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
179e0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29  al information.)
179f0 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20  .** If the sync 
17a00 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77  mode is FULL, tw
17a10 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63  o syncs will occ
17a20 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77  ur.  First the w
17a30 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  hole journal.** 
17a40 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20  is synced, then 
17a50 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
17a60 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20  s updated, then 
17a70 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63  a second sync oc
17a80 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  curs..**.** For 
17a90 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
17aa0 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63  ses, we do not c
17ab0 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62  are if we are ab
17ac0 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  le to rollback.*
17ad0 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20  * after a power 
17ae0 66 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f 20 73  failure, so no s
17af0 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
17b00 2a 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  * If the IOCAP_S
17b10 45 51 55 45 4e 54 49 41 4c 20 66 6c 61 67 20 69  EQUENTIAL flag i
17b20 73 20 73 65 74 20 66 6f 72 20 74 68 65 20 70 65  s set for the pe
17b30 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 6f  rsistent media o
17b40 6e 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 64  n which.** the d
17b50 61 74 61 62 61 73 65 20 69 73 20 73 74 6f 72 65  atabase is store
17b60 64 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63 28 29  d, then OsSync()
17b70 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
17b80 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   on the journal.
17b90 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  ** file. In this
17ba0 20 63 61 73 65 20 61 6c 6c 20 74 68 61 74 20 69   case all that i
17bb0 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74 6f  s required is to
17bc0 20 75 70 64 61 74 65 20 74 68 65 20 6e 52 65 63   update the nRec
17bd0 20 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74 68 65   field in.** the
17be0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
17bf0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
17c00 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e  ine clears the n
17c10 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66  eedSync field of
17c20 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72   every page curr
17c30 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d  ent held in.** m
17c40 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
17c50 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
17c60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
17c70 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
17c80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17c90 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 53 79 6e 63  _OK;...  /* Sync
17ca0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
17cb0 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
17cc0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
17cd0 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74    ** (assuming t
17ce0 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61  here is a journa
17cf0 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74  l and it needs t
17d00 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20  o be synced.).  
17d10 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
17d20 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
17d30 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
17d40 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
17d50 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
17d60 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
17d70 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
17d80 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
17d90 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
17da0 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20  nalOpen );..    
17db0 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50    /* assert( !pP
17dc0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20  ager->noSync ); 
17dd0 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20  // noSync might 
17de0 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72  be set if synchr
17df0 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77  onous.      ** w
17e00 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66  as turned off af
17e10 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
17e20 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e  ion was started.
17e30 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f    Ticket #615 */
17e40 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
17e50 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
17e60 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
17e70 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f   pPager->nRec co
17e80 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65  unter we are kee
17e90 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20  ping agrees.    
17ea0 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
17eb0 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
17ec0 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
17ed0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
17ee0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
17ef0 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20      i64 jSz;.   
17f00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17f10 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
17f20 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a  er->jfd, &jSz);.
17f30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
17f40 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
17f50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17f60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
17f70 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20  f==jSz );.      
17f80 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
17f90 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
17fa0 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
17fb0 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
17fc0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
17fd0 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
17fe0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
17ff0 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20  ader. If in.    
18000 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63      ** full-sync
18010 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79  hronous mode, sy
18020 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
18030 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72  irst. This ensur
18040 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
18050 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  ** all data has 
18060 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64  really hit the d
18070 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20  isk before nRec 
18080 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
18090 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rk.        ** it
180a0 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   as a candidate 
180b0 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  for rollback..  
180c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
180d0 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
180e0 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20  required if the 
180f0 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
18100 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20   supports the.  
18110 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50        ** SAFE_AP
18120 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42  PEND property. B
18130 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63  ecause in this c
18140 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
18150 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20  ssible .        
18160 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64  ** for garbage d
18170 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ata to be append
18180 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20  ed to the file, 
18190 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20  the nRec field. 
181a0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70         ** is pop
181b0 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46  ulated with 0xFF
181c0 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20  FFFFFF when the 
181d0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
181e0 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  s written.      
181f0 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e    ** and never n
18200 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
18210 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
18220 20 20 20 20 20 20 20 69 36 34 20 6a 72 6e 6c 4f         i64 jrnlO
18230 66 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ff;.        if( 
18240 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
18250 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
18260 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
18270 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
18280 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
18290 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
182a0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
182b0 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
182c0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
182d0 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
182e0 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
182f0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
18300 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
18310 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
18320 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
18330 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
18340 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
18350 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70       jrnlOff = p
18360 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
18370 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
18380 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20  nalMagic);.     
18390 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
183a0 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
183b0 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66 66   pPager, jrnlOff
183c0 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72  , 4));.        r
183d0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
183e0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
183f0 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e 52  lOff, pPager->nR
18400 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ec);.        if(
18410 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
18420 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
18430 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
18440 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
18450 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
18460 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43  AGERTRACE2("SYNC
18470 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
18480 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
18490 72 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  r));.        IOT
184a0 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
184b0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
184c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
184d0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
184e0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
184f0 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  c_flags| .      
18500 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
18510 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  c_flags==SQLITE_
18520 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
18530 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
18540 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
18550 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
18560 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18570 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
18580 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
18590 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
185a0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
185b0 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72   = 0;..    /* Er
185c0 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ase the needSync
185d0 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79   flag from every
185e0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
185f0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
18600 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
18610 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
18620 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
18630 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
18640 20 20 20 20 6c 72 75 4c 69 73 74 53 65 74 46 69      lruListSetFi
18650 72 73 74 53 79 6e 63 65 64 28 70 50 61 67 65 72  rstSynced(pPager
18660 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
18670 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74  NDEBUG.  /* If t
18680 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
18690 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20  c flag is clear 
186a0 74 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e  then the PgHdr.n
186b0 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61  eedSync.  ** fla
186c0 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63  g must also be c
186d0 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67  lear for all pag
186e0 65 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  es.  Verify that
186f0 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72   this.  ** invar
18700 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20  iant is true..  
18710 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66  */.  else{.    f
18720 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
18730 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
18740 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
18750 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
18760 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
18770 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
18780 28 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  ( pPager->lru.pF
18790 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67  irstSynced==pPag
187a0 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 20 29  er->lru.pFirst )
187b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
187c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
187d0 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69  .** Merge two li
187e0 73 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e  sts of pages con
187f0 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79  nected by pDirty
18800 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64   and in pgno ord
18810 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f  er..** Do not bo
18820 74 68 20 66 69 78 69 6e 67 20 74 68 65 20 70 50  th fixing the pP
18830 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72  revDirty pointer
18840 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  s..*/.static PgH
18850 64 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69  dr *merge_pageli
18860 73 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67  st(PgHdr *pA, Pg
18870 48 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64  Hdr *pB){.  PgHd
18880 72 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c  r result, *pTail
18890 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73  ;.  pTail = &res
188a0 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41  ult;.  while( pA
188b0 20 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66   && pB ){.    if
188c0 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70  ( pA->pgno<pB->p
188d0 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61  gno ){.      pTa
188e0 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b  il->pDirty = pA;
188f0 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70  .      pTail = p
18900 41 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41  A;.      pA = pA
18910 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65  ->pDirty;.    }e
18920 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c  lse{.      pTail
18930 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20  ->pDirty = pB;. 
18940 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b       pTail = pB;
18950 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e  .      pB = pB->
18960 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  pDirty;.    }.  
18970 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20  }.  if( pA ){.  
18980 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
18990 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66  = pA;.  }else if
189a0 28 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69  ( pB ){.    pTai
189b0 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a  l->pDirty = pB;.
189c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61    }else{.    pTa
189d0 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  il->pDirty = 0;.
189e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
189f0 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f  ult.pDirty;.}../
18a00 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69  *.** Sort the li
18a10 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  st of pages in a
18a20 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  ccending order b
18a30 79 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61  y pgno.  Pages a
18a40 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  re.** connected 
18a50 62 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65  by pDirty pointe
18a60 72 73 2e 20 20 54 68 65 20 70 50 72 65 76 44 69  rs.  The pPrevDi
18a70 72 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65  rty pointers are
18a80 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79  .** corrupted by
18a90 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23   this sort..*/.#
18aa0 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55  define N_SORT_BU
18ab0 43 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23 64  CKET_ALLOC 25.#d
18ac0 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
18ad0 4b 45 54 20 20 20 20 20 20 20 32 35 0a 23 69 66  KET       25.#if
18ae0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
18af0 20 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61    int sqlite3_pa
18b00 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65  ger_n_sort_bucke
18b10 74 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66 20  t = 0;.  #undef 
18b20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20 20  N_SORT_BUCKET.  
18b30 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42  #define N_SORT_B
18b40 55 43 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c 69  UCKET \.   (sqli
18b50 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74  te3_pager_n_sort
18b60 5f 62 75 63 6b 65 74 3f 73 71 6c 69 74 65 33 5f  _bucket?sqlite3_
18b70 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63  pager_n_sort_buc
18b80 6b 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ket:N_SORT_BUCKE
18b90 54 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66 0a  T_ALLOC).#endif.
18ba0 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f  static PgHdr *so
18bb0 72 74 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  rt_pagelist(PgHd
18bc0 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72  r *pIn){.  PgHdr
18bd0 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45   *a[N_SORT_BUCKE
18be0 54 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20  T_ALLOC], *p;.  
18bf0 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28  int i;.  memset(
18c00 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29  a, 0, sizeof(a))
18c10 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20 29  ;.  while( pIn )
18c20 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20  {.    p = pIn;. 
18c30 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72     pIn = p->pDir
18c40 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74  ty;.    p->pDirt
18c50 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  y = 0;.    for(i
18c60 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43  =0; i<N_SORT_BUC
18c70 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  KET-1; i++){.   
18c80 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29     if( a[i]==0 )
18c90 7b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d  {.        a[i] =
18ca0 20 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   p;.        brea
18cb0 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
18cc0 20 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72 67          p = merg
18cd0 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c  e_pagelist(a[i],
18ce0 20 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b 69   p);.        a[i
18cf0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
18d00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
18d10 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20  N_SORT_BUCKET-1 
18d20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76 65  ){.      /* Cove
18d30 72 61 67 65 3a 20 54 6f 20 67 65 74 20 68 65 72  rage: To get her
18d40 65 2c 20 74 68 65 72 65 20 6e 65 65 64 20 74 6f  e, there need to
18d50 20 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42 55   be 2^(N_SORT_BU
18d60 43 4b 45 54 29 20 0a 20 20 20 20 20 20 2a 2a 20  CKET) .      ** 
18d70 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
18d80 69 6e 70 75 74 20 6c 69 73 74 2e 20 54 68 69 73  input list. This
18d90 20 69 73 20 70 6f 73 73 69 62 6c 65 2c 20 62 75   is possible, bu
18da0 74 20 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a 20  t impractical.. 
18db0 20 20 20 20 20 2a 2a 20 54 65 73 74 69 6e 67 20       ** Testing 
18dc0 74 68 69 73 20 6c 69 6e 65 20 69 73 20 74 68 65  this line is the
18dd0 20 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61 6c   point of global
18de0 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20   variable.      
18df0 2a 2a 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  ** sqlite3_pager
18e00 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e 0a  _n_sort_bucket..
18e10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
18e20 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65  [i] = merge_page
18e30 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20  list(a[i], p);. 
18e40 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61     }.  }.  p = a
18e50 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  [0];.  for(i=1; 
18e60 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b  i<N_SORT_BUCKET;
18e70 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d   i++){.    p = m
18e80 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c  erge_pagelist(p,
18e90 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65   a[i]);.  }.  re
18ea0 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
18eb0 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66   Given a list of
18ec0 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65   pages (connecte
18ed0 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  d by the PgHdr.p
18ee0 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77  Dirty pointer) w
18ef0 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e  rite.** every on
18f00 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
18f10 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
18f20 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61  base file and ma
18f30 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61  rk them all.** a
18f40 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74  s clean..*/.stat
18f50 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
18f60 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  te_pagelist(PgHd
18f70 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67  r *pList){.  Pag
18f80 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 50 67  er *pPager;.  Pg
18f90 48 64 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63  Hdr *p;.  int rc
18fa0 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ;..  if( pList==
18fb0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
18fc0 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d  E_OK;.  pPager =
18fd0 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a   pList->pPager;.
18fe0 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
18ff0 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  int there may be
19000 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56   either a RESERV
19010 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
19020 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
19030 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
19040 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
19050 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ady an EXCLUSIVE
19060 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f   lock, the follo
19070 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20  wing.  ** calls 
19080 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  to sqlite3OsLock
19090 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20  () are no-ops.. 
190a0 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20   **.  ** Moving 
190b0 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45  the lock from RE
190c0 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53  SERVED to EXCLUS
190d0 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76  IVE actually inv
190e0 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a  olves going.  **
190f0 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65   through an inte
19100 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50  rmediate state P
19110 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44  ENDING.   A PEND
19120 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74  ING lock prevent
19130 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65  s new.  ** reade
19140 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e  rs from attachin
19150 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
19160 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69  e but is unsuffi
19170 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a  cient for us to.
19180 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65    ** write.  The
19190 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49   idea of a PENDI
191a0 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72  NG lock is to pr
191b0 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72  event new reader
191c0 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69  s from.  ** comi
191d0 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77  ng in while we w
191e0 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ait for existing
191f0 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61   readers to clea
19200 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69  r..  **.  ** Whi
19210 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  le the pager is 
19220 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20  in the RESERVED 
19230 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69  state, the origi
19240 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
19250 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e  e.  ** is unchan
19260 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72  ged and we can r
19270 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ollback without 
19280 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61  having to playba
19290 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  ck the.  ** jour
192a0 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  nal into the ori
192b0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
192c0 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72  ile.  Once we tr
192d0 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a  ansition to.  **
192e0 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d   EXCLUSIVE, it m
192f0 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
19300 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
19310 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20  changed and any 
19320 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69  rollback.  ** wi
19330 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ll require a jou
19340 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20  rnal playback.. 
19350 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
19360 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
19370 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
19380 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21  LOCK);.  if( rc!
19390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
193a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
193b0 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74  ..  pList = sort
193c0 5f 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29  _pagelist(pList)
193d0 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b  ;.  for(p=pList;
193e0 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
193f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
19400 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 70 2d  >dirty );.    p-
19410 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a  >dirty = 0;.  }.
19420 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29    while( pList )
19430 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  {..    /* If the
19440 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65   file has not ye
19450 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
19460 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20  pen it now. */. 
19470 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
19480 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
19490 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
194a0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
194b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
194c0 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
194d0 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
194e0 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
194f0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  ->zFilename,.   
19500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19510 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
19520 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a  ger->vfsFlags);.
19530 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
19540 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
19550 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
19560 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
19570 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
19580 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
19590 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
195a0 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
195b0 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
195c0 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
195d0 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c  uncate() was cal
195e0 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
195f0 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
19600 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
19610 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
19620 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
19630 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
19640 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
19650 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
19660 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
19670 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
19680 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
19690 66 73 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70  fset = (pList->p
196a0 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
196b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
196c0 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20      char *pData 
196d0 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
196e0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
196f0 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67  List), pList->pg
19700 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 50 41  no, 6);.      PA
19710 47 45 52 54 52 41 43 45 34 28 22 53 54 4f 52 45  GERTRACE4("STORE
19720 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
19730 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
19740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
19750 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
19760 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67 65  List->pgno, page
19770 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
19780 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
19790 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c  E(("PGOUT %p %d\
197a0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69 73  n", pPager, pLis
197b0 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  t->pgno));.     
197c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
197d0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
197e0 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
197f0 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
19800 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
19810 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
19820 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
19830 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
19840 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74  CR(pPager->nWrit
19850 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  e);.      if( pL
19860 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a  ist->pgno==1 ){.
19870 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
19880 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
19890 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
198a0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
198b0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
198c0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
198d0 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c  ef NDEBUG.    el
198e0 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
198f0 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25  RACE3("NOSTORE %
19900 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
19910 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
19920 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
19930 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
19940 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
19950 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
19960 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
19970 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
19980 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
19990 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
199a0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
199b0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20  t->pDirty;.  }. 
199c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
199d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c  K;.}../*.** Coll
199e0 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20  ect every dirty 
199f0 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74  page into a dirt
19a00 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65  y list and.** re
19a10 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
19a20 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
19a30 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61  at list.  All pa
19a40 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65  ges are.** colle
19a50 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  cted even if the
19a60 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75  y are still in u
19a70 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  se..*/.static Pg
19a80 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61  Hdr *pager_get_a
19a90 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50  ll_dirty_pages(P
19aa0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
19ab0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
19ac0 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pDirty;.}../*.**
19ad0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
19ae0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
19af0 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69  ournal on the gi
19b00 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20  ven pager..** A 
19b10 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
19b20 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ne that needs to
19b30 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
19b40 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
19b50 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
19b60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19b70 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
19b80 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
19b90 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
19ba0 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
19bb0 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
19bc0 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
19bd0 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
19be0 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20  ame name.  Just 
19bf0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
19c00 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  al..*/.static in
19c10 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
19c20 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
19c30 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
19c40 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
19c50 66 73 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  fs;.  if( !pPage
19c60 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20  r->useJournal ) 
19c70 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
19c80 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  !pPager->fd->pMe
19c90 74 68 6f 64 73 20 29 20 72 65 74 75 72 6e 20 30  thods ) return 0
19ca0 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
19cb0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70  OsAccess(pVfs, p
19cc0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
19cd0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
19ce0 58 49 53 54 53 29 20 29 7b 0a 20 20 20 20 72 65  XISTS) ){.    re
19cf0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
19d00 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  ( sqlite3OsCheck
19d10 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61  ReservedLock(pPa
19d20 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
19d30 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
19d40 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
19d50 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
19d60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
19d70 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
19d80 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
19d90 61 6c 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  al, 0);.    retu
19da0 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 0;.  }else{. 
19db0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
19dc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
19dd0 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
19de0 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20 63  the cache that c
19df0 61 6e 20 62 65 20 72 65 63 79 63 6c 65 64 2e 20  an be recycled. 
19e00 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
19e10 69 6e 65 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ine may return S
19e20 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
19e30 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49  ITE_FULL or SQLI
19e40 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f  TE_OK. It .** do
19e50 65 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 70  es not set the p
19e60 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 76  Pager->errCode v
19e70 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ariable..*/.stat
19e80 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 63  ic int pager_rec
19e90 79 63 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  ycle(Pager *pPag
19ea0 65 72 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67  er, PgHdr **ppPg
19eb0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
19ec0 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20  .  *ppPg = 0;.. 
19ed0 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61   /* It is illega
19ee0 6c 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66  l to call this f
19ef0 75 6e 63 74 69 6f 6e 20 75 6e 6c 65 73 73 20 74  unction unless t
19f00 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 0a  he pager object.
19f10 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20    ** pointed to 
19f20 62 79 20 70 50 61 67 65 72 20 68 61 73 20 61 74  by pPager has at
19f30 20 6c 65 61 73 74 20 6f 6e 65 20 66 72 65 65 20   least one free 
19f40 70 61 67 65 20 28 70 61 67 65 20 77 69 74 68 20  page (page with 
19f50 6e 52 65 66 3d 3d 30 29 2e 0a 20 20 2a 2f 20 0a  nRef==0)..  */ .
19f60 20 20 61 73 73 65 72 74 28 21 4d 45 4d 44 42 29    assert(!MEMDB)
19f70 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
19f80 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29 3b 0a  r->lru.pFirst);.
19f90 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67  .  /* Find a pag
19fa0 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54  e to recycle.  T
19fb0 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ry to locate a p
19fc0 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
19fd0 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75  t.  ** require u
19fe0 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63  s to do an fsync
19ff0 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  () on the journa
1a000 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20  l..  */.  pPg = 
1a010 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
1a020 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20  stSynced;..  /* 
1a030 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20  If we could not 
1a040 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61 74  find a page that
1a050 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
1a060 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a  e an fsync().  *
1a070 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * on the journal
1a080 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63   file then fsync
1a090 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a0a0 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20 20  e.  This is a.  
1a0b0 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65  ** very slow ope
1a0c0 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f  ration, so we wo
1a0d0 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64  rk hard to avoid
1a0e0 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69   it.  But someti
1a0f0 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27  mes.  ** it can'
1a100 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a  t be helped..  *
1a110 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 26  /.  if( pPg==0 &
1a120 26 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  & pPager->lru.pF
1a130 69 72 73 74 29 7b 0a 20 20 20 20 69 6e 74 20 69  irst){.    int i
1a140 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
1a150 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1a160 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
1a170 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79  .    int rc = sy
1a180 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
1a190 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
1a1a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1a1b0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
1a1c0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
1a1d0 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
1a1e0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
1a1f0 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
1a200 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
1a210 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65  sync mode, write
1a220 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68   a new journal h
1a230 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 20  eader into the. 
1a240 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
1a250 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f  file. This is do
1a260 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72  ne to avoid ever
1a270 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75   modifying a jou
1a280 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65  rnal.      ** he
1a290 61 64 65 72 20 74 68 61 74 20 69 73 20 69 6e 76  ader that is inv
1a2a0 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c  olved in the rol
1a2b0 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74  lback of pages t
1a2c0 68 61 74 20 68 61 76 65 0a 20 20 20 20 20 20 2a  hat have.      *
1a2d0 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  * already been w
1a2e0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
1a2f0 74 61 62 61 73 65 20 28 69 6e 20 63 61 73 65 20  tabase (in case 
1a300 74 68 65 20 68 65 61 64 65 72 20 69 73 0a 20 20  the header is.  
1a310 20 20 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77      ** trashed w
1a320 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
1a330 6c 64 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a  ld is updated)..
1a340 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
1a350 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
1a360 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a370 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1a380 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 61  f > 0 );.      a
1a390 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1a3a0 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  oNotSync==0 );. 
1a3b0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
1a3c0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1a3d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1a3e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
1a3f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1a400 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d  .    }.    pPg =
1a410 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69   pPager->lru.pFi
1a420 72 73 74 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  rst;.  }..  asse
1a430 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  rt( pPg->nRef==0
1a440 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
1a450 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
1a460 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
1a470 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20   it is dirty..  
1a480 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  */.  if( pPg->di
1a490 72 74 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  rty ){.    int r
1a4a0 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
1a4b0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
1a4c0 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  );.    makeClean
1a4d0 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e  (pPg);.    pPg->
1a4e0 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70  dirty = 1;.    p
1a4f0 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
1a500 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1a510 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70  rite_pagelist( p
1a520 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64  Pg );.    pPg->d
1a530 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  irty = 0;.    if
1a540 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a550 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1a560 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
1a570 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
1a580 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ty==0 );..  /* I
1a590 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  f the page we ar
1a5a0 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d  e recycling is m
1a5b0 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
1a5c0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20  ollback, then.  
1a5d0 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61  ** set the globa
1a5e0 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  l alwaysRollback
1a5f0 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61   flag, thus disa
1a600 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73  bling the.  ** s
1a610 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1a620 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69  ollback() optimi
1a630 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72  zation for the r
1a640 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e  est of this tran
1a650 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74  saction..  ** It
1a660 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
1a670 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73 65   do this because
1a680 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64   the page marked
1a690 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a   alwaysRollback.
1a6a0 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65    ** might be re
1a6b0 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74 65  loaded at a late
1a6c0 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74 68  r time but at th
1a6d0 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27  at point we won'
1a6e0 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  t remember.  ** 
1a6f0 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b  that is was mark
1a700 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ed alwaysRollbac
1a710 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74  k.  This means t
1a720 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75  hat all pages mu
1a730 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65  st.  ** be marke
1a740 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
1a750 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e  ack from here on
1a760 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   out..  */.  if(
1a770 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
1a780 62 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54 52  back ){.    IOTR
1a790 41 43 45 28 28 22 41 4c 57 41 59 53 5f 52 4f 4c  ACE(("ALWAYS_ROL
1a7a0 4c 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  LBACK %p\n", pPa
1a7b0 67 65 72 29 29 0a 20 20 20 20 70 50 61 67 65 72  ger)).    pPager
1a7c0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1a7d0 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
1a7e0 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70  Unlink the old p
1a7f0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
1a800 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68  e list and the h
1a810 61 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  ash table.  */. 
1a820 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29   unlinkPage(pPg)
1a830 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
1a840 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20 20 2a  >pgno==0 );..  *
1a850 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65  ppPg = pPg;.  re
1a860 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a870 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1a880 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
1a890 41 4e 41 47 45 4d 45 4e 54 0a 2f 2a 0a 2a 2a 20  ANAGEMENT./*.** 
1a8a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1a8b0 20 63 61 6c 6c 65 64 20 74 6f 20 66 72 65 65 20   called to free 
1a8c0 73 75 70 65 72 66 6c 75 6f 75 73 20 64 79 6e 61  superfluous dyna
1a8d0 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
1a8e0 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64  d memory.** held
1a8f0 20 62 79 20 74 68 65 20 70 61 67 65 72 20 73 79   by the pager sy
1a900 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20  stem. Memory in 
1a910 75 73 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74  use by any SQLit
1a920 65 20 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65  e pager allocate
1a930 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72  d.** by the curr
1a940 65 6e 74 20 74 68 72 65 61 64 20 6d 61 79 20 62  ent thread may b
1a950 65 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  e sqlite3_free()
1a960 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69  ed..**.** nReq i
1a970 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1a980 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
1a990 72 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20 74  required. Once t
1a9a0 68 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20  his much has.** 
1a9b0 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20 74  been released, t
1a9c0 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
1a9d0 72 6e 73 2e 20 54 68 65 20 72 65 74 75 72 6e 20  rns. The return 
1a9e0 76 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f 74  value is the tot
1a9f0 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66  al number .** of
1aa00 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
1aa10 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 69 6e   released..*/.in
1aa20 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
1aa30 6c 65 61 73 65 4d 65 6d 6f 72 79 28 69 6e 74 20  leaseMemory(int 
1aa40 6e 52 65 71 29 7b 0a 20 20 69 6e 74 20 6e 52 65  nReq){.  int nRe
1aa50 6c 65 61 73 65 64 20 3d 20 30 3b 20 20 20 20 20  leased = 0;     
1aa60 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
1aa70 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64   memory released
1aa80 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 73 71 6c   so far */.  sql
1aa90 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
1aaa0 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  x;       /* The 
1aab0 4d 45 4d 32 20 6d 75 74 65 78 20 2a 2f 0a 20 20  MEM2 mutex */.  
1aac0 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1aae0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1aaf0 70 61 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  pagers */.  int 
1ab00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ab10 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68  .  /* Acquire th
1ab20 65 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d  e memory-managem
1ab30 65 6e 74 20 6d 75 74 65 78 0a 20 20 2a 2f 0a 20  ent mutex.  */. 
1ab40 20 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33   mutex = sqlite3
1ab50 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
1ab60 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
1ab70 5f 4d 45 4d 32 29 3b 0a 20 20 73 71 6c 69 74 65  _MEM2);.  sqlite
1ab80 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
1ab90 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 67 6e  tex);..  /* Sign
1aba0 61 6c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  al all database 
1abb0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
1abc0 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65   memory manageme
1abd0 6e 74 20 77 61 6e 74 73 0a 20 20 2a 2a 20 74 6f  nt wants.  ** to
1abe0 20 68 61 76 65 20 61 63 63 65 73 73 20 74 6f 20   have access to 
1abf0 74 68 65 20 70 61 67 65 72 73 2e 0a 20 20 2a 2f  the pagers..  */
1ac00 0a 20 20 66 6f 72 28 70 50 61 67 65 72 3d 73 71  .  for(pPager=sq
1ac10 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 20  lite3PagerList; 
1ac20 70 50 61 67 65 72 3b 20 70 50 61 67 65 72 3d 70  pPager; pPager=p
1ac30 50 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  Pager->pNext){. 
1ac40 20 20 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55      pPager->iInU
1ac50 73 65 4d 4d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  seMM = 1;.  }.. 
1ac60 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
1ac70 54 45 5f 4f 4b 20 26 26 20 28 6e 52 65 71 3c 30  TE_OK && (nReq<0
1ac80 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52   || nReleased<nR
1ac90 65 71 29 20 29 7b 0a 20 20 20 20 50 67 48 64 72  eq) ){.    PgHdr
1aca0 20 2a 70 50 67 3b 0a 20 20 20 20 50 67 48 64 72   *pPg;.    PgHdr
1acb0 20 2a 70 52 65 63 79 63 6c 65 64 3b 0a 20 0a 20   *pRecycled;. . 
1acc0 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e     /* Try to fin
1acd0 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79  d a page to recy
1ace0 63 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  cle that does no
1acf0 74 20 72 65 71 75 69 72 65 20 61 20 73 79 6e 63  t require a sync
1ad00 28 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 74 68  (). If.    ** th
1ad10 69 73 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  is is not possib
1ad20 6c 65 2c 20 66 69 6e 64 20 6f 6e 65 20 74 68 61  le, find one tha
1ad30 74 20 64 6f 65 73 20 72 65 71 75 69 72 65 20 61  t does require a
1ad40 20 73 79 6e 63 28 29 2e 0a 20 20 20 20 2a 2f 0a   sync()..    */.
1ad50 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1ad60 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f  x_enter(sqlite3_
1ad70 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
1ad80 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
1ad90 4c 52 55 29 29 3b 0a 20 20 20 20 70 50 67 20 3d  LRU));.    pPg =
1ada0 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c   sqlite3LruPageL
1adb0 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64  ist.pFirstSynced
1adc0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67  ;.    while( pPg
1add0 20 26 26 20 28 70 50 67 2d 3e 6e 65 65 64 53 79   && (pPg->needSy
1ade0 6e 63 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65  nc || pPg->pPage
1adf0 72 2d 3e 69 49 6e 55 73 65 44 42 29 20 29 7b 0a  r->iInUseDB) ){.
1ae00 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d        pPg = pPg-
1ae10 3e 67 66 72 65 65 2e 70 4e 65 78 74 3b 0a 20 20  >gfree.pNext;.  
1ae20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 67    }.    if( !pPg
1ae30 20 29 7b 0a 20 20 20 20 20 20 70 50 67 20 3d 20   ){.      pPg = 
1ae40 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
1ae50 73 74 2e 70 46 69 72 73 74 3b 0a 20 20 20 20 20  st.pFirst;.     
1ae60 20 77 68 69 6c 65 28 20 70 50 67 20 26 26 20 70   while( pPg && p
1ae70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 69 49 6e 55  Pg->pPager->iInU
1ae80 73 65 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  seDB ){.        
1ae90 70 50 67 20 3d 20 70 50 67 2d 3e 67 66 72 65 65  pPg = pPg->gfree
1aea0 2e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  .pNext;.      }.
1aeb0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1aec0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
1aed0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
1aee0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1aef0 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 0a 20 20  TATIC_LRU));..  
1af00 20 20 2f 2a 20 49 66 20 70 50 67 3d 3d 30 2c 20    /* If pPg==0, 
1af10 74 68 65 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61  then the block a
1af20 62 6f 76 65 20 68 61 73 20 66 61 69 6c 65 64 20  bove has failed 
1af30 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 74  to find a page t
1af40 6f 0a 20 20 20 20 2a 2a 20 72 65 63 79 63 6c 65  o.    ** recycle
1af50 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72  . In this case r
1af60 65 74 75 72 6e 20 65 61 72 6c 79 20 2d 20 6e 6f  eturn early - no
1af70 20 66 75 72 74 68 65 72 20 6d 65 6d 6f 72 79 20   further memory 
1af80 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72  will.    ** be r
1af90 65 6c 65 61 73 65 64 2e 0a 20 20 20 20 2a 2f 0a  eleased..    */.
1afa0 20 20 20 20 69 66 28 20 21 70 50 67 20 29 20 62      if( !pPg ) b
1afb0 72 65 61 6b 3b 0a 0a 20 20 20 20 70 50 61 67 65  reak;..    pPage
1afc0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1afd0 0a 20 20 20 20 61 73 73 65 72 74 28 21 70 50 67  .    assert(!pPg
1afe0 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70 50  ->needSync || pP
1aff0 67 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  g==pPager->lru.p
1b000 46 69 72 73 74 29 3b 0a 20 20 20 20 61 73 73 65  First);.    asse
1b010 72 74 28 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  rt(pPg->needSync
1b020 20 7c 7c 20 70 50 67 3d 3d 70 50 61 67 65 72 2d   || pPg==pPager-
1b030 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65  >lru.pFirstSynce
1b040 64 29 3b 0a 20 20 0a 20 20 20 20 72 63 20 3d 20  d);.  .    rc = 
1b050 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50  pager_recycle(pP
1b060 61 67 65 72 2c 20 26 70 52 65 63 79 63 6c 65 64  ager, &pRecycled
1b070 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 52  );.    assert(pR
1b080 65 63 79 63 6c 65 64 3d 3d 70 50 67 20 7c 7c 20  ecycled==pPg || 
1b090 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  rc!=SQLITE_OK);.
1b0a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b0b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
1b0c0 2a 20 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20  * We've found a 
1b0d0 70 61 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74  page to free. At
1b0e0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
1b0f0 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20  page has been . 
1b100 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64 20       ** removed 
1b110 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 68 61  from the page ha
1b120 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d 6c  sh-table, free-l
1b130 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64 2d 6c  ist and synced-l
1b140 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 28 70  ist .      ** (p
1b150 46 69 72 73 74 53 79 6e 63 65 64 29 2e 20 49 74  FirstSynced). It
1b160 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 74 68 65   is still in the
1b170 20 61 6c 6c 20 70 61 67 65 73 20 28 70 41 6c 6c   all pages (pAll
1b180 29 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 2a  ) list. .      *
1b190 2a 20 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  * Remove it from
1b1a0 20 74 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72   this list befor
1b1b0 65 20 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20  e freeing..     
1b1c0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 6f 64   **.      ** Tod
1b1d0 6f 3a 20 43 68 65 63 6b 20 74 68 65 20 50 61 67  o: Check the Pag
1b1e0 65 72 2e 70 53 74 6d 74 20 6c 69 73 74 20 74 6f  er.pStmt list to
1b1f0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20   make sure this 
1b200 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20  is Ok. It .     
1b210 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69 73 20   ** probably is 
1b220 74 68 6f 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f  though..      */
1b230 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 54  .      PgHdr *pT
1b240 6d 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  mp;.      assert
1b250 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20 69  ( pPg );.      i
1b260 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e  f( pPg==pPager->
1b270 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pAll ){.        
1b280 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
1b290 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
1b2a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b2b0 20 20 20 20 66 6f 72 28 20 70 54 6d 70 3d 70 50      for( pTmp=pP
1b2c0 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70  ager->pAll; pTmp
1b2d0 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b  ->pNextAll!=pPg;
1b2e0 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78   pTmp=pTmp->pNex
1b2f0 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20 20 20 20  tAll ){}.       
1b300 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20   pTmp->pNextAll 
1b310 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
1b320 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
1b330 52 65 6c 65 61 73 65 64 20 2b 3d 20 28 0a 20 20  Released += (.  
1b340 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
1b350 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70  pPg) + pPager->p
1b360 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20  ageSize.        
1b370 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20    + sizeof(u32) 
1b380 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  + pPager->nExtra
1b390 0a 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d  .          + MEM
1b3a0 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74  DB*sizeof(PgHist
1b3b0 6f 72 79 29 20 0a 20 20 20 20 20 20 29 3b 0a 20  ory) .      );. 
1b3c0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
1b3d0 47 46 52 45 45 20 25 70 20 25 64 20 2a 5c 6e 22  GFREE %p %d *\n"
1b3e0 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
1b3f0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47  gno));.      PAG
1b400 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
1b410 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75  pager_pgfree_cou
1b420 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
1b430 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20  e3_free(pPg);.  
1b440 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
1b450 65 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e--;.    }else{.
1b460 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f        /* An erro
1b470 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74  r occured whilst
1b480 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
1b490 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72  database file or
1b4a0 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
1b4b0 61 6c 20 69 6e 20 70 61 67 65 72 5f 72 65 63 79  al in pager_recy
1b4c0 63 6c 65 28 29 2e 20 54 68 65 20 65 72 72 6f 72  cle(). The error
1b4d0 20 69 73 20 6e 6f 74 20 72 65 74 75 72 6e 65 64   is not returned
1b4e0 20 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 2a   to the .      *
1b4f0 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73  * caller of this
1b500 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65   function. Inste
1b510 61 64 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ad, set the Page
1b520 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62  r.errCode variab
1b530 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  le..      ** The
1b540 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72   error will be r
1b550 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75  eturned to the u
1b560 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69  ser (or users, i
1b570 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20 20 20  n the case .    
1b580 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72 65 64    ** of a shared
1b590 20 70 61 67 65 72 20 63 61 63 68 65 29 20 6f 66   pager cache) of
1b5a0 20 74 68 65 20 70 61 67 65 72 20 66 6f 72 20 77   the pager for w
1b5b0 68 69 63 68 20 74 68 65 20 65 72 72 6f 72 20 6f  hich the error o
1b5c0 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  ccured..      */
1b5d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 0a 20  .      assert(. 
1b5e0 20 20 20 20 20 20 20 20 20 28 72 63 26 30 78 66           (rc&0xf
1b5f0 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
1b600 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 72 63   ||.          rc
1b610 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
1b620 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53  .          rc==S
1b630 51 4c 49 54 45 5f 42 55 53 59 0a 20 20 20 20 20  QLITE_BUSY.     
1b640 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1b650 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1b660 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
1b670 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  );.      pager_e
1b680 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
1b690 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1b6a0 2a 20 43 6c 65 61 72 20 74 68 65 20 6d 65 6d 6f  * Clear the memo
1b6b0 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 66 6c  ry management fl
1b6c0 61 67 73 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ags and release 
1b6d0 74 68 65 20 6d 75 74 65 78 0a 20 20 2a 2f 0a 20  the mutex.  */. 
1b6e0 20 66 6f 72 28 70 50 61 67 65 72 3d 73 71 6c 69   for(pPager=sqli
1b6f0 74 65 33 50 61 67 65 72 4c 69 73 74 3b 20 70 50  te3PagerList; pP
1b700 61 67 65 72 3b 20 70 50 61 67 65 72 3d 70 50 61  ager; pPager=pPa
1b710 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ger->pNext){.   
1b720 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65    pPager->iInUse
1b730 4d 4d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  MM = 0;.  }.  sq
1b740 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1b750 65 28 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  e(mutex);..  /* 
1b760 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1b770 72 20 6f 66 20 62 79 74 65 73 20 72 65 6c 65 61  r of bytes relea
1b780 73 65 64 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  sed.  */.  retur
1b790 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23  n nReleased;.}.#
1b7a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1b7b0 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
1b7c0 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a  NAGEMENT */../*.
1b7d0 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74  ** Read the cont
1b7e0 65 6e 74 20 6f 66 20 70 61 67 65 20 70 50 67 20  ent of page pPg 
1b7f0 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
1b800 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ase file..*/.sta
1b810 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61  tic int readDbPa
1b820 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
1b830 2c 20 50 67 48 64 72 20 2a 70 50 67 2c 20 50 67  , PgHdr *pPg, Pg
1b840 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
1b850 72 63 3b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  rc;.  i64 offset
1b860 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44  ;.  assert( MEMD
1b870 42 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  B==0 );.  assert
1b880 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
1b890 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74  thods||pPager->t
1b8a0 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  empFile);.  if( 
1b8b0 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  !pPager->fd->pMe
1b8c0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72 65 74  thods ){.    ret
1b8d0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1b8e0 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
1b8f0 0a 20 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e  .  offset = (pgn
1b900 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
1b910 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 72 63  ->pageSize;.  rc
1b920 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
1b930 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48  (pPager->fd, PGH
1b940 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1b950 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1b960 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 50 41  e, offset);.  PA
1b970 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1b980 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
1b990 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  unt);.  PAGER_IN
1b9a0 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
1b9b0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50  );.  IOTRACE(("P
1b9c0 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
1b9d0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
1b9e0 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
1b9f0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
1ba00 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
1ba10 28 28 75 38 2a 29 50 47 48 44 52 5f 54 4f 5f 44  ((u8*)PGHDR_TO_D
1ba20 41 54 41 28 70 50 67 29 29 5b 32 34 5d 2c 0a 20  ATA(pPg))[24],. 
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
1ba60 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1ba70 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d 0a 20 20  leVers));.  }.  
1ba80 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 50  CODEC1(pPager, P
1ba90 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1baa0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  ), pPg->pgno, 3)
1bab0 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28  ;.  PAGERTRACE4(
1bac0 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  "FETCH %d page %
1bad0 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
1bae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1baf0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1bb00 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65   pPg->pgno, page
1bb10 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
1bb20 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1bb30 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
1bb40 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1bb50 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 73   to obtain the s
1bb60 68 61 72 65 64 20 6c 6f 63 6b 20 72 65 71 75 69  hared lock requi
1bb70 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61  red before.** da
1bb80 74 61 20 6d 61 79 20 62 65 20 72 65 61 64 20 66  ta may be read f
1bb90 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
1bba0 63 68 65 2e 20 49 66 20 74 68 65 20 73 68 61 72  che. If the shar
1bbb0 65 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65  ed lock has alre
1bbc0 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61  ady.** been obta
1bbd0 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ined, this funct
1bbe0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
1bbf0 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c  **.** Immediatel
1bc00 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e  y after obtainin
1bc10 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  g the shared loc
1bc20 6b 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c  k (if required),
1bc30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
1bc40 2a 20 63 68 65 63 6b 73 20 66 6f 72 20 61 20 68  * checks for a h
1bc50 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ot-journal file.
1bc60 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64   If one is found
1bc70 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72  , an emergency r
1bc80 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65  ollback.** is pe
1bc90 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61 74  rformed immediat
1bca0 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ely..*/.static i
1bcb0 6e 74 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f  nt pagerSharedLo
1bcc0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
1bcd0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1bce0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
1bcf0 73 48 6f 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  sHot = 0;..  /* 
1bd00 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65  If this database
1bd10 20 69 73 20 6f 70 65 6e 65 64 20 66 6f 72 20 65   is opened for e
1bd20 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 2c  xclusive access,
1bd30 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
1bd40 69 6e 67 20 0a 20 20 2a 2a 20 70 61 67 65 20 72  ing .  ** page r
1bd50 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 69 73  eferences and is
1bd60 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d 73 74 61   in an error-sta
1bd70 74 65 2c 20 6e 6f 77 20 69 73 20 74 68 65 20 63  te, now is the c
1bd80 68 61 6e 63 65 20 74 6f 20 63 6c 65 61 72 0a 20  hance to clear. 
1bd90 20 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 20 44   ** the error. D
1bda0 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65  iscard the conte
1bdb0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
1bdc0 2d 63 61 63 68 65 20 61 6e 64 20 74 72 65 61 74  -cache and treat
1bdd0 20 61 6e 79 0a 20 20 2a 2a 20 6f 70 65 6e 20 6a   any.  ** open j
1bde0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73 20 61  ournal file as a
1bdf0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20   hot-journal..  
1be00 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20  */.  if( !MEMDB 
1be10 26 26 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  && pPager->exclu
1be20 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
1be30 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 70  er->nRef==0 && p
1be40 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
1be50 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
1be60 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
1be70 0a 20 20 20 20 20 20 69 73 48 6f 74 20 3d 20 31  .      isHot = 1
1be80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
1be90 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1bea0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
1beb0 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  Code = SQLITE_OK
1bec0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1bed0 68 65 20 70 61 67 65 72 20 69 73 20 73 74 69 6c  he pager is stil
1bee0 6c 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74  l in an error st
1bef0 61 74 65 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63  ate, do not proc
1bf00 65 65 64 2e 20 54 68 65 20 65 72 72 6f 72 20 0a  eed. The error .
1bf10 20 20 2a 2a 20 73 74 61 74 65 20 77 69 6c 6c 20    ** state will 
1bf20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 73 6f  be cleared at so
1bf30 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
1bf40 66 75 74 75 72 65 20 77 68 65 6e 20 61 6c 6c 20  future when all 
1bf50 70 61 67 65 20 0a 20 20 2a 2a 20 72 65 66 65 72  page .  ** refer
1bf60 65 6e 63 65 73 20 61 72 65 20 64 72 6f 70 70 65  ences are droppe
1bf70 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20  d and the cache 
1bf80 63 61 6e 20 62 65 20 64 69 73 63 61 72 64 65 64  can be discarded
1bf90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
1bfa0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
1bfb0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
1bfc0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
1bfd0 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
1bfe0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
1bff0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1c000 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
1c010 43 4b 20 7c 7c 20 69 73 48 6f 74 20 29 7b 0a 20  CK || isHot ){. 
1c020 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
1c030 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
1c040 56 66 73 3b 0a 20 20 20 20 69 66 28 20 21 4d 45  Vfs;.    if( !ME
1c050 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 61 73 73  MDB ){.      ass
1c060 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
1c070 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  f==0 );.      if
1c080 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  ( !pPager->noRea
1c090 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  dlock ){.       
1c0a0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
1c0b0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
1c0c0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
1c0d0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1c0e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c0f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
1c100 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
1c110 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc);.        }.
1c120 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1c130 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53  pPager->state>=S
1c140 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
1c150 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f      }.  .      /
1c160 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  * If a journal f
1c170 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20  ile exists, and 
1c180 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45  there is no RESE
1c190 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
1c1a0 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
1c1b0 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
1c1c0 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
1c1d0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
1c1e0 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
1c1f0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 68    */.      if( h
1c200 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  asHotJournal(pPa
1c210 67 65 72 29 20 7c 7c 20 69 73 48 6f 74 20 29 7b  ger) || isHot ){
1c220 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20  .        /* Get 
1c230 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
1c240 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1c250 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20  e file. At this 
1c260 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20  point it is.    
1c270 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
1c280 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
1c290 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
1c2a0 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
1c2b0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20   to the.        
1c2c0 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
1c2d0 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
1c2e0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
1c2f0 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
1c300 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
1c310 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74  e file, detect t
1c320 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
1c330 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74  , and conclude t
1c340 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  hat the.        
1c350 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73  ** database is s
1c360 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c  afe to read whil
1c370 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  e this process i
1c380 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20  s still rolling 
1c390 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  it .        ** b
1c3a0 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ack..        ** 
1c3b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65 63 61  .        ** Beca
1c3c0 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64  use the intermed
1c3d0 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f  iate RESERVED lo
1c3e0 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73  ck is not reques
1c3f0 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20 20 20  ted, the.       
1c400 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63 65   ** second proce
1c410 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 74  ss will get to t
1c420 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  his point in the
1c430 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74   code and fail t
1c440 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 62 74  o.        ** obt
1c450 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45 58 43  ain it's own EXC
1c460 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1c470 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c480 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1c490 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1c4a0 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56 45  >state<EXCLUSIVE
1c4b0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  _LOCK ){.       
1c4c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1c4d0 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
1c4e0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
1c4f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1c500 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c510 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61  {.            pa
1c520 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
1c530 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
1c540 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
1c550 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
1c560 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c570 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
1c580 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
1c590 55 53 49 56 45 3b 0a 20 20 20 20 20 20 20 20 7d  USIVE;.        }
1c5a0 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  . .        /* Op
1c5b0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
1c5c0 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e  or reading only.
1c5d0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1c5e0 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 20  BUSY if.        
1c5f0 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  ** we are unable
1c600 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
1c610 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20  rnal file. .    
1c620 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
1c630 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
1c640 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  le does not need
1c650 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74   to be locked it
1c660 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20  self.  The.     
1c670 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
1c680 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e  le is never open
1c690 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e   unless the main
1c6a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
1c6b0 6f 6c 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  olds.        ** 
1c6c0 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f  a write lock, so
1c6d0 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20   there is never 
1c6e0 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77  any chance of tw
1c6f0 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20  o or more.      
1c700 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f    ** processes o
1c710 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  pening the journ
1c720 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  al at the same t
1c730 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ime..        **.
1c740 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20          ** Open 
1c750 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
1c760 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
1c770 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  s. This is becau
1c780 73 65 20 69 6e 20 0a 20 20 20 20 20 20 20 20 2a  se in .        *
1c790 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  * exclusive-acce
1c7a0 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65  ss mode the file
1c7b0 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
1c7c0 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e   be kept open an
1c7d0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73  d.        ** pos
1c7e0 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61  sibly used for a
1c7f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74   transaction lat
1c800 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73  er on. On some s
1c810 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20  ystems, the.    
1c820 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74      ** OsTruncat
1c830 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e  e() call used in
1c840 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
1c850 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75  s mode also requ
1c860 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ires.        ** 
1c870 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c  a read/write fil
1c880 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20  e handle..      
1c890 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
1c8a0 20 21 69 73 48 6f 74 20 29 7b 0a 20 20 20 20 20   !isHot ){.     
1c8b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c8c0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20  _BUSY;.         
1c8d0 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 41 63   if( sqlite3OsAc
1c8e0 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65  cess(pVfs, pPage
1c8f0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
1c900 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1c910 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  S) ){.          
1c920 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a    int fout = 0;.
1c930 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1c940 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
1c950 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
1c960 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
1c970 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL;.            
1c980 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1c990 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
1c9a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1c9b0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
1c9c0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
1c9d0 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
1c9e0 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20   f, &fout);.    
1c9f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1ca00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1ca10 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d   pPager->jfd->pM
1ca20 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 20 20  ethods );.      
1ca30 20 20 20 20 20 20 69 66 28 20 66 6f 75 74 26 53        if( fout&S
1ca40 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
1ca50 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NLY ){.         
1ca60 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1ca70 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20  _BUSY;.         
1ca80 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
1ca90 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
1caa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1cab0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1cac0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1cad0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cae0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67  ){.          pag
1caf0 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
1cb00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
1cb10 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45  urn ((rc==SQLITE
1cb20 5f 4e 4f 4d 45 4d 7c 7c 72 63 3d 3d 53 51 4c 49  _NOMEM||rc==SQLI
1cb30 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 3f  TE_IOERR_NOMEM)?
1cb40 72 63 3a 53 51 4c 49 54 45 5f 42 55 53 59 29 3b  rc:SQLITE_BUSY);
1cb50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1cb60 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1cb70 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  alOpen = 1;.    
1cb80 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1cb90 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
1cba0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1cbb0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
1cbc0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1cbd0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
1cbe0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1cbf0 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
1cc00 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  .        /* Play
1cc10 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
1cc20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
1cc30 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
1cc40 77 72 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  write.        **
1cc50 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
1cc60 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
1cc70 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  k..        */.  
1cc80 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1cc90 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
1cca0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
1ccb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ccc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1ccd0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
1cce0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
1ccf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
1cd00 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 73 74  ssert(pPager->st
1cd10 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
1cd20 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  D || .          
1cd30 20 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75    (pPager->exclu
1cd40 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
1cd50 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f  er->state>PAGER_
1cd60 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 20  SHARED).        
1cd70 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
1cd80 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41    if( pPager->pA
1cd90 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ll ){.        /*
1cda0 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
1cdb0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
1cdc0 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64  cquired on the d
1cdd0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
1cde0 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72       ** and ther
1cdf0 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61  e are already pa
1ce00 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
1ce10 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75   (from a previou
1ce20 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61  s.        ** rea
1ce30 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
1ce40 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
1ce50 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
1ce60 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20 2a  tabase.        *
1ce70 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  * has been modif
1ce80 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
1ce90 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
1cea0 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20  d, flush the.   
1ceb0 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20       ** cache.. 
1cec0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1ced0 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68    ** Database ch
1cee0 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65  anges is detecte
1cef0 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  d by looking at 
1cf00 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69  15 bytes beginni
1cf10 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 74  ng.        ** at
1cf20 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20   offset 24 into 
1cf30 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66  the file.  The f
1cf40 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20  irst 4 of these 
1cf50 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20  16 bytes are.   
1cf60 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
1cf70 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
1cf80 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
1cf90 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
1cfa0 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  The.        ** o
1cfb0 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
1cfc0 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
1cfd0 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
1cfe0 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   when.        **
1cff0 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
1d000 73 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a  se..        ** .
1d010 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65          ** There
1d020 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c   is a vanishingl
1d030 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74  y small chance t
1d040 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c  hat a change wil
1d050 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20  l not be .      
1d060 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
1d070 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
1d080 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
1d090 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
1d0a0 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  hat.        ** i
1d0b0 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74  t can be neglect
1d0c0 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
1d0d0 20 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69         char dbFi
1d0e0 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
1d0f0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1d100 29 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  )];.        sqli
1d110 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1d120 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  t(pPager);..    
1d130 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1d140 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
1d150 20 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67       return pPag
1d160 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
1d170 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1d180 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
1d190 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ze>0 ){.        
1d1a0 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
1d1b0 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
1d1c0 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
1d1d0 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
1d1e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d1f0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1d200 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
1d210 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
1d220 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
1d230 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d240 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d250 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1d260 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d270 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d280 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69       memset(dbFi
1d290 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f  leVers, 0, sizeo
1d2a0 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  f(dbFileVers));.
1d2b0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1d2c0 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50     if( memcmp(pP
1d2d0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1d2e0 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
1d2f0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
1d300 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1d310 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
1d320 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ager);.        }
1d330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d340 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1d350 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
1d360 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
1d370 65 3c 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e<=PAGER_SHARED 
1d380 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1d390 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1d3a0 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
1d3b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1d3c0 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
1d3d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1d3e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1d3f0 6c 6c 6f 63 61 74 65 20 61 20 50 67 48 64 72 20  llocate a PgHdr 
1d400 6f 62 6a 65 63 74 2e 20 20 20 45 69 74 68 65 72  object.   Either
1d410 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
1d420 65 20 6f 72 20 72 65 75 73 65 0a 2a 2a 20 61 6e  e or reuse.** an
1d430 20 65 78 69 73 74 69 6e 67 20 6f 6e 65 20 74 68   existing one th
1d440 61 74 20 69 73 20 6e 6f 74 20 6f 74 68 65 72 77  at is not otherw
1d450 69 73 65 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a  ise in use..**.*
1d460 2a 20 41 20 6e 65 77 20 50 67 48 64 72 20 73 74  * A new PgHdr st
1d470 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74  ructure is creat
1d480 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ed if any of the
1d490 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 0a 2a   following are.*
1d4a0 2a 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  * true:.**.**   
1d4b0 20 20 28 31 29 20 20 57 65 20 68 61 76 65 20 6e    (1)  We have n
1d4c0 6f 74 20 65 78 63 65 65 64 65 64 20 6f 75 72 20  ot exceeded our 
1d4d0 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 63 61 74 65  maximum allocate
1d4e0 64 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20  d cache size.** 
1d4f0 20 20 20 20 20 20 20 20 20 61 73 20 73 65 74 20           as set 
1d500 62 79 20 74 68 65 20 22 50 52 41 47 4d 41 20 63  by the "PRAGMA c
1d510 61 63 68 65 5f 73 69 7a 65 22 20 63 6f 6d 6d 61  ache_size" comma
1d520 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32  nd..**.**     (2
1d530 29 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  )  There are no 
1d540 75 6e 75 73 65 64 20 50 67 48 64 72 20 6f 62 6a  unused PgHdr obj
1d550 65 63 74 73 20 61 76 61 69 6c 61 62 6c 65 20 61  ects available a
1d560 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 2a 2a 0a  t this time..**.
1d570 2a 2a 20 20 20 20 20 28 33 29 20 20 54 68 69 73  **     (3)  This
1d580 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
1d590 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
1d5a0 20 20 20 20 20 28 34 29 20 20 54 68 65 72 65 20       (4)  There 
1d5b0 61 72 65 20 6e 6f 20 50 67 48 64 72 20 6f 62 6a  are no PgHdr obj
1d5c0 65 63 74 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  ects that do not
1d5d0 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e   require a journ
1d5e0 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  al.**          f
1d5f0 69 6c 65 20 73 79 6e 63 20 61 6e 64 20 61 20 73  ile sync and a s
1d600 79 6e 63 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ync of the journ
1d610 61 6c 20 66 69 6c 65 20 69 73 20 63 75 72 72 65  al file is curre
1d620 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  ntly.**         
1d630 20 70 72 6f 68 69 62 69 74 65 64 2e 0a 2a 2a 0a   prohibited..**.
1d640 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
1d650 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  use an existing 
1d660 50 67 48 64 72 2e 20 20 49 6e 20 6f 74 68 65 72  PgHdr.  In other
1d670 20 77 6f 72 64 73 2c 20 72 65 75 73 65 20 61 6e   words, reuse an
1d680 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 50 67 48  .** existing PgH
1d690 64 72 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  dr if all of the
1d6a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
1d6b0 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  rue:.**.**     (
1d6c0 31 29 20 20 57 65 20 68 61 76 65 20 72 65 61 63  1)  We have reac
1d6d0 68 65 64 20 6f 72 20 65 78 63 65 65 64 65 64 20  hed or exceeded 
1d6e0 74 68 65 20 6d 61 78 69 6d 75 6d 20 63 61 63 68  the maximum cach
1d6f0 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20  e size.**       
1d700 20 20 20 61 6c 6c 6f 77 65 64 20 62 79 20 22 50     allowed by "P
1d710 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
1d720 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29  "..**.**     (2)
1d730 20 20 54 68 65 72 65 20 69 73 20 61 20 50 67 48    There is a PgH
1d740 64 72 20 61 76 61 69 6c 61 62 6c 65 20 77 69 74  dr available wit
1d750 68 20 50 67 48 64 72 2d 3e 6e 52 65 66 3d 3d 30  h PgHdr->nRef==0
1d760 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20 20  .**.**     (3)  
1d770 57 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 61 6e  We are not in an
1d780 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
1d790 61 73 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34  ase.**.**     (4
1d7a0 29 20 20 45 69 74 68 65 72 20 74 68 65 72 65 20  )  Either there 
1d7b0 69 73 20 61 6e 20 61 76 61 69 6c 61 62 6c 65 20  is an available 
1d7c0 50 67 48 64 72 20 74 68 61 74 20 64 6f 65 73 20  PgHdr that does 
1d7d0 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20  not need.**     
1d7e0 20 20 20 20 20 74 6f 20 62 65 20 73 79 6e 63 65       to be synce
1d7f0 64 20 74 6f 20 64 69 73 6b 20 6f 72 20 65 6c 73  d to disk or els
1d800 65 20 64 69 73 6b 20 73 79 6e 63 69 6e 67 20 69  e disk syncing i
1d810 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20  s currently.**  
1d820 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 2e          allowed.
1d830 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1d840 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65  agerAllocatePage
1d850 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1d860 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20  PgHdr **ppPg){. 
1d870 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1d880 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  _OK;.  PgHdr *pP
1d890 67 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 48 64  g;.  int nByteHd
1d8a0 72 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  r;..  /* Create 
1d8b0 61 20 6e 65 77 20 50 67 48 64 72 20 69 66 20 61  a new PgHdr if a
1d8c0 6e 79 20 6f 66 20 74 68 65 20 66 6f 75 72 20 63  ny of the four c
1d8d0 6f 6e 64 69 74 69 6f 6e 73 20 64 65 66 69 6e 65  onditions define
1d8e0 64 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20 61 72  d .  ** above ar
1d8f0 65 20 6d 65 74 3a 20 2a 2f 0a 20 20 69 66 28 20  e met: */.  if( 
1d900 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50  pPager->nPage<pP
1d910 61 67 65 72 2d 3e 6d 78 50 61 67 65 0a 20 20 20  ager->mxPage.   
1d920 7c 7c 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  || pPager->lru.p
1d930 46 69 72 73 74 3d 3d 30 20 0a 20 20 20 7c 7c 20  First==0 .   || 
1d940 4d 45 4d 44 42 0a 20 20 20 7c 7c 20 28 70 50 61  MEMDB.   || (pPa
1d950 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53  ger->lru.pFirstS
1d960 79 6e 63 65 64 3d 3d 30 20 26 26 20 70 50 61 67  ynced==0 && pPag
1d970 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a 20  er->doNotSync). 
1d980 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
1d990 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67 65  er->nPage>=pPage
1d9a0 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20 20  r->nHash ){.    
1d9b0 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68    pager_resize_h
1d9c0 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67 65 72  ash_table(pPager
1d9d0 2c 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65  ,.         pPage
1d9e0 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20 32  r->nHash<256 ? 2
1d9f0 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61  56 : pPager->nHa
1da00 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 69 66 28  sh*2);.      if(
1da10 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d   pPager->nHash==
1da20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1da30 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1da40 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
1da50 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b  er_allocate_out;
1da60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1da70 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50     pagerLeave(pP
1da80 61 67 65 72 29 3b 0a 20 20 20 20 6e 42 79 74 65  ager);.    nByte
1da90 48 64 72 20 3d 20 73 69 7a 65 6f 66 28 2a 70 50  Hdr = sizeof(*pP
1daa0 67 29 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29  g) + sizeof(u32)
1dab0 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
1dac0 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a.              
1dad0 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50  + MEMDB*sizeof(P
1dae0 67 48 69 73 74 6f 72 79 29 3b 0a 20 20 20 20 70  gHistory);.    p
1daf0 50 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  Pg = sqlite3_mal
1db00 6c 6f 63 28 20 6e 42 79 74 65 48 64 72 20 2b 20  loc( nByteHdr + 
1db10 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1db20 20 29 3b 0a 20 20 20 20 70 61 67 65 72 45 6e 74   );.    pagerEnt
1db30 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  er(pPager);.    
1db40 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
1db50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1db60 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
1db70 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65  o pager_allocate
1db80 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
1db90 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 6e  memset(pPg, 0, n
1dba0 42 79 74 65 48 64 72 29 3b 0a 20 20 20 20 70 50  ByteHdr);.    pP
1dbb0 67 2d 3e 70 44 61 74 61 20 3d 20 28 76 6f 69 64  g->pData = (void
1dbc0 2a 29 28 6e 42 79 74 65 48 64 72 20 2b 20 28 63  *)(nByteHdr + (c
1dbd0 68 61 72 2a 29 70 50 67 29 3b 0a 20 20 20 20 70  har*)pPg);.    p
1dbe0 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  Pg->pPager = pPa
1dbf0 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  ger;.    pPg->pN
1dc00 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d  extAll = pPager-
1dc10 3e 70 41 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  >pAll;.    pPage
1dc20 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20  r->pAll = pPg;. 
1dc30 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65     pPager->nPage
1dc40 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1dc50 20 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e 20 65   /* Recycle an e
1dc60 78 69 73 74 69 6e 67 20 70 61 67 65 20 77 69 74  xisting page wit
1dc70 68 20 61 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75  h a zero ref-cou
1dc80 6e 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  nt. */.    rc = 
1dc90 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50  pager_recycle(pP
1dca0 61 67 65 72 2c 20 26 70 50 67 29 3b 0a 20 20 20  ager, &pPg);.   
1dcb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dcc0 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 72 63  BUSY ){.      rc
1dcd0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1dce0 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20  BLOCKED;.    }. 
1dcf0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1dd00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
1dd10 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74  to pager_allocat
1dd20 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
1dd30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1dd40 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c  >state>=SHARED_L
1dd50 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
1dd60 74 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70  t(pPg);.  }.  *p
1dd70 70 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65  pPg = pPg;..page
1dd80 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a  r_allocate_out:.
1dd90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1dda0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
1ddb0 77 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74  we have the cont
1ddc0 65 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  ent for a page. 
1ddd0 20 49 66 20 74 68 65 20 70 61 67 65 20 77 61 73   If the page was
1dde0 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61  .** previously a
1ddf0 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43  cquired with noC
1de00 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20  ontent==1, then 
1de10 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a  the content was.
1de20 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69  ** just initiali
1de30 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73  zed to zeros ins
1de40 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65  tead of being re
1de50 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a  ad from disk..**
1de60 20 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64   But now we need
1de70 20 74 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f   the real data o
1de80 66 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20  ff of disk.  So 
1de90 6d 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20  make sure we.** 
1dea0 68 61 76 65 20 69 74 2e 20 20 52 65 61 64 20 69  have it.  Read i
1deb0 74 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f  t in if we do no
1dec0 74 20 68 61 76 65 20 69 74 20 61 6c 72 65 61 64  t have it alread
1ded0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
1dee0 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
1def0 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  nt(PgHdr *pPg){.
1df00 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52    if( pPg->needR
1df10 65 61 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ead ){.    int r
1df20 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
1df30 50 67 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c  Pg->pPager, pPg,
1df40 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1df50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1df60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  OK ){.      pPg-
1df70 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20  >needRead = 0;. 
1df80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1df90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1dfa0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1dfb0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1dfc0 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
1dfd0 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c  ..**.** A read l
1dfe0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  ock on the disk 
1dff0 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64  file is obtained
1e000 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
1e010 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64  page is acquired
1e020 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20  . .** This read 
1e030 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20  lock is dropped 
1e040 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61  when the last pa
1e050 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a  ge is released..
1e060 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1e070 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  ne works for any
1e080 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65   page number gre
1e090 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66  ater than 0.  If
1e0a0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
1e0b0 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72   file is smaller
1e0c0 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
1e0d0 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e  ted page, then n
1e0e0 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a  o actual disk.**
1e0f0 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64   read occurs and
1e100 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
1e110 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73  e of the page is
1e120 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a   initialized to.
1e130 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54  ** all zeros.  T
1e140 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
1e150 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
1e160 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
1e170 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72  alized.** to zer
1e180 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  os the first tim
1e190 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
1e1a0 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a  ed into memory..
1e1b0 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
1e1c0 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
1e1d0 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
1e1e0 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
1e1f0 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
1e200 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
1e210 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
1e220 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
1e230 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
1e240 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
1e250 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
1e260 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
1e270 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
1e280 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
1e290 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
1e2a0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
1e2b0 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
1e2c0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
1e2d0 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
1e2e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
1e2f0 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
1e300 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
1e310 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
1e320 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
1e330 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
1e340 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
1e350 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
1e360 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
1e370 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
1e380 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
1e390 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
1e3a0 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
1e3b0 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
1e3c0 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
1e3d0 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
1e3e0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
1e3f0 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
1e400 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
1e410 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61   noContent is fa
1e420 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f  lse, the page co
1e430 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74 75 61  ntents are actua
1e440 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69  lly read from di
1e450 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  sk..** If noCont
1e460 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
1e470 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
1e480 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
1e490 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
1e4a0 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
1e4b0 68 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20  his time, so do 
1e4c0 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65  not do a disk re
1e4d0 61 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  ad.  Just fill i
1e4e0 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f  n the.** page co
1e4f0 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
1e500 2e 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20  .  But mark the 
1e510 66 61 63 74 20 74 68 61 74 20 77 65 20 68 61 76  fact that we hav
1e520 65 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a  e not read the.*
1e530 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74  * content by set
1e540 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
1e550 65 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c  eedRead flag.  L
1e560 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20  ater on, if .** 
1e570 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e580 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
1e590 20 74 68 69 73 20 70 61 67 65 20 6f 72 20 69 66   this page or if
1e5a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1e5b0 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e  .** called again
1e5c0 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d   with noContent=
1e5d0 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  =0, that means t
1e5e0 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hat the content 
1e5f0 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64  is needed.** and
1e600 20 74 68 65 20 64 69 73 6b 20 72 65 61 64 20 73   the disk read s
1e610 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
1e620 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74  hat point..*/.st
1e630 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 63  atic int pagerAc
1e640 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
1e650 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
1e660 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
1e670 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1e680 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
1e690 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
1e6a0 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
1e6b0 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
1e6c0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
1e6d0 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
1e6e0 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
1e6f0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  e */.  int noCon
1e700 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f  tent       /* Do
1e710 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64   not bother read
1e720 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ing content from
1e730 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f   disk if true */
1e740 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  .){.  PgHdr *pPg
1e750 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
1e760 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1e770 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
1e780 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52  CK || pPager->nR
1e790 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20  ef>0 || pgno==1 
1e7a0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78  );..  /* The max
1e7b0 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
1e7c0 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
1e7d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
1e7e0 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e  if a page.  ** n
1e7f0 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
1e800 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f  an this, or zero
1e810 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  , is requested..
1e820 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e    */.  if( pgno>
1e830 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
1e840 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  | pgno==0 || pgn
1e850 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
1e860 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1e870 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1e880 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
1e890 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
1e8a0 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20  we have not hit 
1e8b0 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72  any critical err
1e8c0 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73  ors..  */ .  ass
1e8d0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
1e8e0 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ;.  *ppPage = 0;
1e8f0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1e900 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
1e910 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20   accessed, then 
1e920 67 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63  get a SHARED loc
1e930 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61  k.  ** on the da
1e940 74 61 62 61 73 65 20 66 69 6c 65 2e 20 70 61 67  tabase file. pag
1e950 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 69  erSharedLock() i
1e960 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20  s a no-op if .  
1e970 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 6c 6f  ** a database lo
1e980 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
1e990 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ld..  */.  rc = 
1e9a0 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  pagerSharedLock(
1e9b0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
1e9c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e9d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e9e0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
1e9f0 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
1ea00 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70  R_UNLOCK );..  p
1ea10 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
1ea20 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
1ea30 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b  .  if( pPg==0 ){
1ea40 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
1ea50 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
1ea60 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  t in the page ca
1ea70 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  che. */.    int 
1ea80 6e 4d 61 78 3b 0a 20 20 20 20 69 6e 74 20 68 3b  nMax;.    int h;
1ea90 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
1eaa0 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a  pPager->nMiss);.
1eab0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 6c      rc = pagerAl
1eac0 6c 6f 63 61 74 65 50 61 67 65 28 70 50 61 67 65  locatePage(pPage
1ead0 72 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66  r, &pPg);.    if
1eae0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1eaf0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1eb00 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  rc;.    }..    p
1eb10 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
1eb20 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
1eb30 4d 44 42 20 7c 7c 20 70 67 6e 6f 3e 70 50 61 67  MDB || pgno>pPag
1eb40 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 3b 0a  er->stmtSize );.
1eb50 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1eb60 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  aInJournal && (i
1eb70 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
1eb80 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 23  >origDbSize ){.#
1eb90 69 66 20 30 0a 20 20 20 20 20 20 73 71 6c 69 74  if 0.      sqlit
1eba0 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50  e3CheckMemory(pP
1ebb0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1ebc0 2c 20 70 67 6e 6f 2f 38 29 3b 0a 23 65 6e 64 69  , pgno/8);.#endi
1ebd0 66 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  f.      assert( 
1ebe0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1ebf0 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67  pen );.      pPg
1ec00 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70  ->inJournal = (p
1ec10 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1ec20 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  l[pgno/8] & (1<<
1ec30 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20  (pgno&7)))!=0;. 
1ec40 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
1ec50 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  nc = 0;.    }els
1ec60 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  e{.      pPg->in
1ec70 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
1ec80 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
1ec90 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
1eca0 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
1ecb0 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d  .    pPg->nRef =
1ecc0 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28   1;.    REFINFO(
1ecd0 70 50 67 29 3b 0a 0a 20 20 20 20 70 50 61 67 65  pPg);..    pPage
1ece0 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69  r->nRef++;.    i
1ecf0 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  f( pPager->nExtr
1ed00 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  a>0 ){.      mem
1ed10 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54  set(PGHDR_TO_EXT
1ed20 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c  RA(pPg, pPager),
1ed30 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74   0, pPager->nExt
1ed40 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  ra);.    }.    n
1ed50 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Max = sqlite3Pag
1ed60 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1ed70 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  er);.    if( pPa
1ed80 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
1ed90 20 20 20 20 20 20 72 63 20 3d 20 70 50 61 67 65        rc = pPage
1eda0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
1edb0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1edc0 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
1edd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1ede0 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74  ..    /* Populat
1edf0 65 20 74 68 65 20 70 61 67 65 20 77 69 74 68 20  e the page with 
1ee00 64 61 74 61 2c 20 65 69 74 68 65 72 20 62 79 20  data, either by 
1ee10 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65  reading from the
1ee20 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
1ee30 20 66 69 6c 65 2c 20 6f 72 20 62 79 20 73 65 74   file, or by set
1ee40 74 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20  ting the entire 
1ee50 70 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 20 20  page to zero..  
1ee60 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4d 61    */.    if( nMa
1ee70 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d  x<(int)pgno || M
1ee80 45 4d 44 42 20 7c 7c 20 28 6e 6f 43 6f 6e 74 65  EMDB || (noConte
1ee90 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 61  nt && !pPager->a
1eea0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 20 29  lwaysRollback) )
1eeb0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  {.      if( pgno
1eec0 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
1eed0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1eee0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
1eef0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1ef00 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
1ef10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
1ef20 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
1ef30 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
1ef40 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1ef50 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61      pPg->needRea
1ef60 64 20 3d 20 6e 6f 43 6f 6e 74 65 6e 74 20 26 26  d = noContent &&
1ef70 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73   !pPager->always
1ef80 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20  Rollback;.      
1ef90 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25  IOTRACE(("ZERO %
1efa0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1efb0 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c   pgno));.    }el
1efc0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  se{.      rc = r
1efd0 65 61 64 44 62 50 61 67 65 28 70 50 61 67 65 72  eadDbPage(pPager
1efe0 2c 20 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20  , pPg, pgno);.  
1eff0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f000 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
1f010 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1f020 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
1f030 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20  pPg->pgno = 0;. 
1f040 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1f050 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
1f060 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1f070 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f080 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20  pPg->needRead = 
1f090 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
1f0a0 20 4c 69 6e 6b 20 74 68 65 20 70 61 67 65 20 69   Link the page i
1f0b0 6e 74 6f 20 74 68 65 20 70 61 67 65 20 68 61 73  nto the page has
1f0c0 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 68  h table */.    h
1f0d0 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65   = pgno & (pPage
1f0e0 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20  r->nHash-1);.   
1f0f0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
1f100 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   );.    pPg->pNe
1f110 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d  xtHash = pPager-
1f120 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70  >aHash[h];.    p
1f130 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
1f140 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70  = pPg;.    if( p
1f150 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
1f160 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f170 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
1f180 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
1f190 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48       pPg->pNextH
1f1a0 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
1f1b0 20 70 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69 66   pPg;.    }..#if
1f1c0 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
1f1d0 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
1f1e0 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
1f1f0 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
1f200 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
1f210 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
1f220 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20  sted page is in 
1f230 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
1f240 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 70 50  */.    assert(pP
1f250 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20  ager->nRef>0 || 
1f260 70 67 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 50 41  pgno==1);.    PA
1f270 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
1f280 3e 6e 48 69 74 29 3b 0a 20 20 20 20 69 66 28 20  >nHit);.    if( 
1f290 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  !noContent ){.  
1f2a0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67      rc = pager_g
1f2b0 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b  et_content(pPg);
1f2c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
1f2d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1f2e0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1f2f0 7d 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70  }.    page_ref(p
1f300 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61  Pg);.  }.  *ppPa
1f310 67 65 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75  ge = pPg;.  retu
1f320 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1f330 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1f340 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72  Acquire(.  Pager
1f350 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
1f360 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
1f370 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1f380 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
1f390 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
1f3a0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
1f3b0 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
1f3c0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
1f3d0 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
1f3e0 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
1f3f0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ere */.  int noC
1f400 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20  ontent       /* 
1f410 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65  Do not bother re
1f420 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72  ading content fr
1f430 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20  om disk if true 
1f440 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
1f450 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
1f460 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  ger);.  rc = pag
1f470 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72  erAcquire(pPager
1f480 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
1f490 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 61  noContent);.  pa
1f4a0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
1f4b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1f4c0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  .../*.** Acquire
1f4d0 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
1f4e0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
1f4f0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
1f500 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
1f510 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
1f520 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
1f530 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
1f540 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
1f550 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
1f560 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53  n cache..**.** S
1f570 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
1f580 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20  agerGet().  The 
1f590 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
1f5a0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
1f5b0 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61  ** and sqlite3Pa
1f5c0 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74  gerGet() is that
1f5d0 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20   _get() will go 
1f5e0 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20  to the disk and 
1f5f0 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  read.** in the p
1f600 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20  age if the page 
1f610 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
1f620 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  n cache.  This r
1f630 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
1f640 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61  s NULL if the pa
1f650 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
1f660 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20  he or if a disk 
1f670 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61  I/O error .** ha
1f680 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e  s ever happened.
1f690 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69  .*/.DbPage *sqli
1f6a0 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50  te3PagerLookup(P
1f6b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1f6c0 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
1f6d0 72 20 2a 70 50 67 20 3d 20 30 3b 0a 0a 20 20 61  r *pPg = 0;..  a
1f6e0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
1f6f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
1f700 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 70 61 67 65  no!=0 );..  page
1f710 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
1f720 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1f730 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
1f740 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1f750 20 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 7c   !pPager->pAll |
1f760 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  | pPager->exclus
1f770 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20 7d 65 6c  iveMode );.  }el
1f780 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  se if( pPager->e
1f790 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
1f7a0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
1f7b0 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 2f 2a  E_FULL ){.    /*
1f7c0 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
1f7d0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 67 20   }else if( (pPg 
1f7e0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
1f7f0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 21 3d 30  Pager, pgno))!=0
1f800 20 29 7b 0a 20 20 20 20 70 61 67 65 5f 72 65 66   ){.    page_ref
1f810 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67  (pPg);.  }.  pag
1f820 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
1f830 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d  .  return pPg;.}
1f840 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
1f850 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
1f860 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
1f870 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
1f880 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65   page drop to ze
1f890 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ro, then the.** 
1f8a0 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f  page is added to
1f8b0 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20   the LRU list.  
1f8c0 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e  When all referen
1f8d0 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73  ces to all pages
1f8e0 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64  .** are released
1f8f0 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  , a rollback occ
1f900 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  urs and the lock
1f910 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1f920 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a   is.** removed..
1f930 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1f940 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20  gerUnref(DbPage 
1f950 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
1f960 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1f970 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 44 65 63 72  ager;..  /* Decr
1f980 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
1f990 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68  nce count for th
1f9a0 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 61  is page.  */.  a
1f9b0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
1f9c0 3e 30 20 29 3b 0a 20 20 70 61 67 65 72 45 6e 74  >0 );.  pagerEnt
1f9d0 65 72 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b  er(pPg->pPager);
1f9e0 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pPg->nRef--;.
1f9f0 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
1fa00 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
1fa10 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74  g);..  /* When t
1fa20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
1fa30 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67  erences to a pag
1fa40 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20  e reach 0, call 
1fa50 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63  the.  ** destruc
1fa60 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20  tor and add the 
1fa70 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
1fa80 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
1fa90 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
1faa0 0a 0a 20 20 20 20 6c 72 75 4c 69 73 74 41 64 64  ..    lruListAdd
1fab0 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 70  (pPg);.    if( p
1fac0 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
1fad0 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  or ){.      pPag
1fae0 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28  er->xDestructor(
1faf0 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  pPg, pPager->pag
1fb00 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
1fb10 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c  .    /* When all
1fb20 20 70 61 67 65 73 20 72 65 61 63 68 20 74 68 65   pages reach the
1fb30 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20   freelist, drop 
1fb40 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72  the read lock fr
1fb50 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  om.    ** the da
1fb60 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
1fb70 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
1fb80 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65  nRef--;.    asse
1fb90 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  rt( pPager->nRef
1fba0 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  >=0 );.    if( p
1fbb0 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26  Pager->nRef==0 &
1fbc0 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  & (!pPager->excl
1fbd0 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
1fbe0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
1fbf0 30 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  0) ){.      page
1fc00 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
1fc10 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1fc20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61  }.  }.  pagerLea
1fc30 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
1fc40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1fc50 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1fc60 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  a journal file f
1fc70 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72  or pPager.  Ther
1fc80 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  e should already
1fc90 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a   be a RESERVED.*
1fca0 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  * or EXCLUSIVE l
1fcb0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1fcc0 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68  ase file when th
1fcd0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1fce0 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lled..**.** Retu
1fcf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
1fd00 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74  everything.  Ret
1fd10 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
1fd20 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
1fd30 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20  e.** write lock 
1fd40 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
1fd50 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
1fd60 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e  c int pager_open
1fd70 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  _journal(Pager *
1fd80 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
1fd90 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
1fda0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
1fdb0 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
1fdc0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1fdd0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  E|SQLITE_OPEN_EX
1fde0 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f  CLUSIVE|SQLITE_O
1fdf0 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 0a 20 20  PEN_CREATE);..  
1fe00 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
1fe10 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  ( !MEMDB );.  as
1fe20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1fe30 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
1fe40 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VED );.  assert(
1fe50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1fe60 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Open==0 );.  ass
1fe70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
1fe80 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
1fe90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
1fea0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
1feb0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1fec0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
1fed0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
1fee0 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  er);.  pPager->a
1fef0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
1ff00 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70  te3MallocZero( p
1ff10 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
1ff20 2b 20 31 20 29 3b 0a 20 20 70 61 67 65 72 45 6e  + 1 );.  pagerEn
1ff30 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
1ff40 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
1ff50 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
1ff60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1ff70 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  M;.    goto fail
1ff80 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
1ff90 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  al;.  }..  if( p
1ffa0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1ffb0 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  ){.    flags |= 
1ffc0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c  (SQLITE_OPEN_DEL
1ffd0 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54  ETEONCLOSE|SQLIT
1ffe0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
1fff0 4e 41 4c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NAL);.  }else{. 
20000 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c     flags |= (SQL
20010 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
20020 55 52 4e 41 4c 29 3b 0a 20 20 7d 0a 23 69 66 64  URNAL);.  }.#ifd
20030 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
20040 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
20050 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  rc = sqlite3Jour
20060 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 70  nalOpen(.      p
20070 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
20080 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
20090 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42  fd, flags, jrnlB
200a0 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
200b0 29 0a 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 72  ).  );.#else.  r
200c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
200d0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
200e0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
200f0 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29  ->jfd, flags, 0)
20100 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
20110 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
20120 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d   || pPager->jfd-
20130 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 70  >pMethods );.  p
20140 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20150 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
20160 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
20170 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
20180 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  lHdr = 0;.  if( 
20190 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
201a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
201b0 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
201c0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
201d0 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
201e0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
201f0 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 66 61     }.    goto fa
20200 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
20210 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  rnal;.  }.  pPag
20220 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
20230 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  = 1;.  pPager->j
20240 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
20250 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  0;.  pPager->nee
20260 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
20270 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
20280 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ack = 0;.  pPage
20290 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69  r->nRec = 0;.  i
202a0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
202b0 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  de ){.    rc = p
202c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
202d0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
202e0 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
202f0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f  .  }.  pPager->o
20300 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
20310 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72  er->dbSize;..  r
20320 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
20330 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  Hdr(pPager);..  
20340 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
20350 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d  Autoopen && rc==
20360 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20370 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
20380 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67  erStmtBegin(pPag
20390 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
203a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
203b0 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
203c0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
203d0 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  OERR_NOMEM ){.  
203e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
203f0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
20400 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
20410 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20420 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
20430 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
20440 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66  .  return rc;..f
20450 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
20460 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65 33  urnal:.  sqlite3
20470 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  _free(pPager->aI
20480 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61  nJournal);.  pPa
20490 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
204a0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
204b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
204c0 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  re a write-lock 
204d0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
204e0 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65    The lock is re
204f0 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68  moved when.** th
20500 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  e any of the fol
20510 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a  lowing happen:.*
20520 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  *.**   *  sqlite
20530 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
20540 65 54 77 6f 28 29 20 69 73 20 63 61 6c 6c 65 64  eTwo() is called
20550 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
20560 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
20570 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
20580 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
20590 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  Close() is calle
205a0 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
205b0 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 69  e3PagerUnref() i
205c0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65  s called to on e
205d0 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67  very outstanding
205e0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
205f0 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72   first parameter
20600 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
20610 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
20620 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f   any open page o
20630 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
20640 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67  e file.  Nothing
20650 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74   changes about t
20660 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73 20  he page - it is 
20670 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a  used merely to.*
20680 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e  * acquire a poin
20690 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
206a0 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
206b0 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65  s proof that the
206c0 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79  re is.** already
206d0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
206e0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
206f0 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70  .** The second p
20700 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
20710 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  es how much spac
20720 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65  e in bytes to re
20730 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d  serve for a.** m
20740 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
20750 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73  le-name at the s
20760 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
20770 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63  nal when it is c
20780 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  reated..**.** A 
20790 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
207a0 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20 69  opened if this i
207b0 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72  s not a temporar
207c0 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d  y file.  For tem
207d0 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c  porary.** files,
207e0 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20   the opening of 
207f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
20800 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
20810 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a  il there is an.*
20820 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f  * actual need to
20830 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
20840 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
20850 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
20860 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65 64  already reserved
20870 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68   for writing, th
20880 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
20890 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
208a0 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  exFlag is true, 
208b0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65 74  go ahead and get
208c0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
208d0 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a  ck on the file.*
208e0 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e  * immediately in
208f0 73 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e 67  stead of waiting
20900 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74 6f   until we try to
20910 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65   flush the cache
20920 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67  .  The.** exFlag
20930 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 61   is ignored if a
20940 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
20950 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a  already active..
20960 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
20970 67 65 72 42 65 67 69 6e 28 44 62 50 61 67 65 20  gerBegin(DbPage 
20980 2a 70 50 67 2c 20 69 6e 74 20 65 78 46 6c 61 67  *pPg, int exFlag
20990 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
209a0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
209b0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
209c0 49 54 45 5f 4f 4b 3b 0a 20 20 70 61 67 65 72 45  ITE_OK;.  pagerE
209d0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
209e0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
209f0 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f>0 );.  assert(
20a00 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
20a10 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
20a20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
20a30 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
20a40 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
20a50 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
20a60 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  nal==0 );.    if
20a70 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
20a80 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
20a90 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
20aa0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
20ab0 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
20ac0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
20ad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
20ae0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
20af0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53  (pPager->fd, RES
20b00 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
20b10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20b20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20b30 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
20b40 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
20b50 20 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c          if( exFl
20b60 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
20b70 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
20b80 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
20b90 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
20ba0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20bb0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
20bc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20bd0 20 20 20 20 20 20 70 61 67 65 72 4c 65 61 76 65        pagerLeave
20be0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
20bf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
20c00 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
20c10 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
20c20 30 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  0;.      PAGERTR
20c30 41 43 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f  ACE2("TRANSACTIO
20c40 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
20c50 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
20c60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65   if( pPager->use
20c70 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67  Journal && !pPag
20c80 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
20c90 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
20ca0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
20cb0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
20cc0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
20cd0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
20ce0 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72  alOpen && pPager
20cf0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
20d00 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
20d10 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20  appens when the 
20d20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 78 63  pager was in exc
20d30 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
20d40 64 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74  de last.    ** t
20d50 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20 77  ime a (read or w
20d60 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f  rite) transactio
20d70 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  n was successful
20d80 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20  ly concluded.   
20d90 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e 6e   ** by this conn
20da0 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20  ection. Instead 
20db0 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  of deleting the 
20dc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 20  journal file it 
20dd0 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74  was .    ** kept
20de0 20 6f 70 65 6e 20 61 6e 64 20 74 72 75 6e 63 61   open and trunca
20df0 74 65 64 20 74 6f 20 30 20 62 79 74 65 73 2e 0a  ted to 0 bytes..
20e00 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
20e10 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d  t( pPager->nRec=
20e20 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
20e30 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  ( pPager->origDb
20e40 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Size==0 );.    a
20e50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
20e60 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
20e70 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
20e80 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
20e90 29 3b 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76  );.    pagerLeav
20ea0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  e(pPager);.    p
20eb0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
20ec0 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
20ed0 63 5a 65 72 6f 28 20 70 50 61 67 65 72 2d 3e 64  cZero( pPager->d
20ee0 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20  bSize/8 + 1 );. 
20ef0 20 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50     pagerEnter(pP
20f00 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 21  ager);.    if( !
20f10 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
20f20 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
20f30 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
20f40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20f50 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
20f60 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
20f70 69 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ize;.      rc = 
20f80 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
20f90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
20fa0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 50   }.  assert( !pP
20fb0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
20fc0 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  n || pPager->jou
20fd0 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21  rnalOff>0 || rc!
20fe0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
20ff0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
21000 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
21010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
21020 20 70 61 67 65 20 64 69 72 74 79 2e 20 20 53 65   page dirty.  Se
21030 74 20 69 74 73 20 64 69 72 74 79 20 66 6c 61 67  t its dirty flag
21040 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f 20 74   and add it to t
21050 68 65 20 64 69 72 74 79 0a 2a 2a 20 70 61 67 65  he dirty.** page
21060 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
21070 20 76 6f 69 64 20 6d 61 6b 65 44 69 72 74 79 28   void makeDirty(
21080 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
21090 66 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30  f( pPg->dirty==0
210a0 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70   ){.    Pager *p
210b0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
210c0 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69  ger;.    pPg->di
210d0 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67  rty = 1;.    pPg
210e0 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67 65  ->pDirty = pPage
210f0 72 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 69  r->pDirty;.    i
21100 66 28 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74  f( pPager->pDirt
21110 79 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  y ){.      pPage
21120 72 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76  r->pDirty->pPrev
21130 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 20  Dirty = pPg;.   
21140 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65   }.    pPg->pPre
21150 76 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  vDirty = 0;.    
21160 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
21170 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   pPg;.  }.}../*.
21180 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 63  ** Make a page c
21190 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20 69 74 73  lean.  Clear its
211a0 20 64 69 72 74 79 20 62 69 74 20 61 6e 64 20 72   dirty bit and r
211b0 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68  emove it from th
211c0 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20  e.** dirty page 
211d0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
211e0 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50  void makeClean(P
211f0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
21200 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  ( pPg->dirty ){.
21210 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
21220 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d   0;.    if( pPg-
21230 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20  >pDirty ){.     
21240 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 44   assert( pPg->pD
21250 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79  irty->pPrevDirty
21260 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 70  ==pPg );.      p
21270 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65  Pg->pDirty->pPre
21280 76 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 50  vDirty = pPg->pP
21290 72 65 76 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  revDirty;.    }.
212a0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
212b0 65 76 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20  evDirty ){.     
212c0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
212d0 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79  revDirty->pDirty
212e0 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 70  ==pPg );.      p
212f0 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e  Pg->pPrevDirty->
21300 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44  pDirty = pPg->pD
21310 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  irty;.    }else{
21320 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21330 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69 72  Pg->pPager->pDir
21340 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20  ty==pPg );.     
21350 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44   pPg->pPager->pD
21360 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72  irty = pPg->pDir
21370 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ty;.    }.  }.}.
21380 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64  ../*.** Mark a d
21390 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
213a0 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65  eable.  The page
213b0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
213c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a   the journal .**
213d0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
213e0 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68  ere already.  Th
213f0 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
21400 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
21410 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67   making.** chang
21420 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a  es to a page..**
21430 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
21440 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  me this routine 
21450 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
21460 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e  ager creates a n
21470 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  ew.** journal an
21480 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53  d acquires a RES
21490 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
214a0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20  e database.  If 
214b0 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  the RESERVED.** 
214c0 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62  lock could not b
214d0 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73  e acquired, this
214e0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
214f0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54   SQLITE_BUSY.  T
21500 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
21510 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b  utine must check
21520 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e   for that return
21530 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61   value and be ca
21540 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20  reful not to.** 
21550 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
21560 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20  data until this 
21570 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
21580 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
21590 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
215a0 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  file could not b
215b0 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73  e written becaus
215c0 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75  e the disk is fu
215d0 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  ll,.** then this
215e0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
215f0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64   SQLITE_FULL and
21600 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61   does an immedia
21610 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20  te rollback..** 
21620 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77  All subsequent w
21630 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c  rite attempts al
21640 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  so return SQLITE
21650 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72  _FULL until ther
21660 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74  e.** is a call t
21670 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
21680 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65  mmit() or sqlite
21690 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
216a0 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f   to.** reset..*/
216b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
216c0 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70  r_write(PgHdr *p
216d0 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61  Pg){.  void *pDa
216e0 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41  ta = PGHDR_TO_DA
216f0 54 41 28 70 50 67 29 3b 0a 20 20 50 61 67 65 72  TA(pPg);.  Pager
21700 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
21710 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
21720 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
21730 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72   /* Check for er
21740 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rors.  */.  if( 
21750 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
21760 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70  ){ .    return p
21770 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
21780 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
21790 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
217a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
217b0 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  PERM;.  }..  ass
217c0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65  ert( !pPager->se
217d0 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48  tMaster );..  CH
217e0 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
217f0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67    /* If this pag
21800 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
21810 20 61 63 71 75 69 72 65 64 20 77 69 74 68 20 6e   acquired with n
21820 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 61  oContent==1, tha
21830 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 77 65 20  t means.  ** we 
21840 64 69 64 6e 27 74 20 72 65 61 6c 6c 79 20 72 65  didn't really re
21850 61 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ad in the conten
21860 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20  t of the page.  
21870 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a  This can happen.
21880 20 20 2a 2a 20 28 66 6f 72 20 65 78 61 6d 70 6c    ** (for exampl
21890 65 29 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  e) when the page
218a0 20 69 73 20 62 65 69 6e 67 20 6d 6f 76 65 64 20   is being moved 
218b0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
218c0 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f 77 20 77    But.  ** now w
218d0 65 20 61 72 65 20 28 70 65 72 68 61 70 73 29 20  e are (perhaps) 
218e0 6d 6f 76 69 6e 67 20 74 68 65 20 70 61 67 65 20  moving the page 
218f0 6f 66 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c  off of the freel
21900 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20 72 65 75  ist for.  ** reu
21910 73 65 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74  se and we need t
21920 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72 69 67 69  o know its origi
21930 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73 6f 20 74  nal content so t
21940 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a  hat content.  **
21950 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69   can be stored i
21960 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
21970 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64 6f 20 74  ournal.  So do t
21980 68 65 20 72 65 61 64 20 61 74 20 74 68 69 73 0a  he read at this.
21990 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a    ** time..  */.
219a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74    rc = pager_get
219b0 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20  _content(pPg);. 
219c0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
219d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
219e0 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
219f0 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20  e as dirty.  If 
21a00 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72  the page has alr
21a10 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
21a20 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f  n.  ** to the jo
21a30 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61  urnal then we ca
21a40 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  n return right a
21a50 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65  way..  */.  make
21a60 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66  Dirty(pPg);.  if
21a70 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
21a80 20 26 26 20 28 70 61 67 65 49 6e 53 74 61 74 65   && (pageInState
21a90 6d 65 6e 74 28 70 50 67 29 20 7c 7c 20 70 50 61  ment(pPg) || pPa
21aa0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d  ger->stmtInUse==
21ab0 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0) ){.    pPager
21ac0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
21ad0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
21ae0 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
21af0 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
21b00 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
21b10 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
21b20 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
21b30 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
21b40 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
21b50 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
21b60 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
21b70 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73    **.    ** Firs
21b80 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  t check to see t
21b90 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
21ba0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ion journal exis
21bb0 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72  ts and.    ** cr
21bc0 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f  eate it if it do
21bd0 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20  es not..    */. 
21be0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
21bf0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
21c00 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  UNLOCK );.    rc
21c10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
21c20 65 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20  egin(pPg, 0);.  
21c30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21c40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
21c50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
21c60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
21c70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
21c80 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69  ESERVED );.    i
21c90 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
21ca0 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
21cb0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  r->useJournal ){
21cc0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
21cd0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
21ce0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
21cf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21d00 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
21d10 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
21d20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
21d30 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75  en || !pPager->u
21d40 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
21d50 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
21d60 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20  che = 1;.  .    
21d70 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
21d80 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
21d90 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
21da0 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
21db0 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
21dc0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
21dd0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
21de0 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
21df0 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
21e00 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
21e10 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
21e20 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
21e30 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
21e40 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69  .    if( !pPg->i
21e50 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61  nJournal && (pPa
21e60 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
21e70 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20  || MEMDB) ){.   
21e80 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
21e90 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
21ea0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
21eb0 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42         if( MEMDB
21ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67   ){.          Pg
21ed0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
21ee0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
21ef0 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
21f00 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
21f10 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E3("JOURNAL %d p
21f20 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
21f30 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
21f40 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
21f50 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
21f60 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20  >pOrig==0 );.   
21f70 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f         pHist->pO
21f80 72 69 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  rig = sqlite3_ma
21f90 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61  lloc( pPager->pa
21fa0 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
21fb0 20 20 20 20 69 66 28 20 21 70 48 69 73 74 2d 3e      if( !pHist->
21fc0 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20  pOrig ){.       
21fd0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
21fe0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
21ff0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22000 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f  memcpy(pHist->pO
22010 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  rig, PGHDR_TO_DA
22020 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
22030 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
22040 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22050 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a       u32 cksum;.
22060 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
22070 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 20 20 20  pData2;..       
22080 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20     /* We should 
22090 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74  never write to t
220a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
220b0 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20  the page that.  
220c0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
220d0 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
220e0 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c   locks.  The fol
220f0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65  lowing assert ve
22100 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 20  rifies.         
22110 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
22120 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ot. */.         
22130 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
22140 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
22150 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
22160 20 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20         pData2 = 
22170 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
22180 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
22190 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63   7);.          c
221a0 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73  ksum = pager_cks
221b0 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
221c0 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20  pData2);.       
221d0 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
221e0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
221f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22200 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  Off, pPg->pgno);
22210 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
22220 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22230 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
22240 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
22250 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
22260 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
22270 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
22280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22290 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
222a0 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a  ournalOff + 4);.
222b0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
222c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
222d0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
222e0 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20 20 20  ze+4;.          
222f0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
22300 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22310 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
22320 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
22330 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
22340 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63  r->journalOff, c
22350 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  ksum);.         
22360 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
22370 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
22380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22390 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54    IOTRACE(("JOUT
223a0 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e   %p %d %lld %d\n
223b0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
223c0 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
223d0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
223e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
223f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29  ager->pageSize))
22400 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  ;.          PAGE
22410 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
22420 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
22430 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41  t);.          PA
22440 47 45 52 54 52 41 43 45 35 28 22 4a 4f 55 52 4e  GERTRACE5("JOURN
22450 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
22460 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25  edSync=%d hash(%
22470 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
22480 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
22490 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
224a0 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
224b0 63 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  c, pager_pagehas
224c0 68 28 70 50 67 29 29 3b 0a 0a 20 20 20 20 20 20  h(pPg));..      
224d0 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20      /* An error 
224e0 68 61 73 20 6f 63 63 75 72 65 64 20 77 72 69 74  has occured writ
224f0 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
22500 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20  al file. The .  
22510 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
22520 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72  action will be r
22530 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68  olled back by th
22540 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20  e layer above.. 
22550 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
22560 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
22570 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22580 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
22590 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
225a0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
225b0 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRec++;.       
225c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
225d0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->aInJournal!=0
225e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50   );.          pP
225f0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
22600 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
22610 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
22620 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  );.          pPg
22630 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
22640 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
22650 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
22660 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
22670 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
22680 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
22690 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
226a0 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
226b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
226c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
226d0 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e  {.        pPg->n
226e0 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
226f0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
22700 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
22710 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 50 41  Sync;.        PA
22720 47 45 52 54 52 41 43 45 34 28 22 41 50 50 45 4e  GERTRACE4("APPEN
22730 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  D %d page %d nee
22740 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
22750 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
22760 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
22770 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
22780 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d  edSync);.      }
22790 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
227a0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
227b0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
227c0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
227d0 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  }.      pPg->inJ
227e0 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
227f0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
22800 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
22810 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
22820 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
22830 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74   in it,.    ** t
22840 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75  hen write the cu
22850 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
22860 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
22870 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  nal.  Note that.
22880 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
22890 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ment journal for
228a0 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d  mat differs from
228b0 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f   the standard jo
228c0 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20  urnal format.   
228d0 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f   ** in that it o
228e0 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75  mits the checksu
228f0 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65  ms and the heade
22900 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
22910 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
22920 55 73 65 20 0a 20 20 20 20 20 26 26 20 21 70 61  Use .     && !pa
22930 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50  geInStatement(pP
22940 67 29 20 0a 20 20 20 20 20 26 26 20 28 69 6e 74  g) .     && (int
22950 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  )pPg->pgno<=pPag
22960 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20  er->stmtSize .  
22970 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72    ){.      asser
22980 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
22990 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70  l || (int)pPg->p
229a0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
229b0 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  DbSize );.      
229c0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
229d0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
229e0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
229f0 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
22a00 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
22a10 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  rt( pHist->pStmt
22a20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
22a30 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71  Hist->pStmt = sq
22a40 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50  lite3_malloc( pP
22a50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
22a60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48  ;.        if( pH
22a70 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
22a80 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
22a90 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48  Hist->pStmt, PGH
22aa0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
22ab0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
22ac0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
22ad0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
22ae0 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  3("STMT-JOURNAL 
22af0 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
22b00 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
22b10 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
22b20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
22b30 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
22b40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22b50 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
22b60 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52  = pPager->stmtNR
22b70 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
22b80 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
22b90 20 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20   char *pData2 = 
22ba0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
22bb0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
22bc0 20 37 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20   7);.        rc 
22bd0 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
22be0 61 67 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73  ager->stfd, offs
22bf0 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  et, pPg->pgno);.
22c00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
22c10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22c20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
22c30 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
22c40 72 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32 2c  r->stfd, pData2,
22c50 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
22c60 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20  e, offset+4);.  
22c70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22c80 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4d  PAGERTRACE3("STM
22c90 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
22ca0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
22cb0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
22cc0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
22cd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22ce0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
22cf0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
22d00 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
22d10 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20  ->stmtNRec++;.  
22d20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
22d30 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30  ager->aInStmt!=0
22d40 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   );.        pPag
22d50 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
22d60 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
22d70 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
22d80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
22d90 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
22da0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
22db0 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
22dc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
22dd0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
22de0 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70  HARED );.  if( p
22df0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69  Pager->dbSize<(i
22e00 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a  nt)pPg->pgno ){.
22e10 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
22e20 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  ze = pPg->pgno;.
22e30 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26      if( !MEMDB &
22e40 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  & pPager->dbSize
22e50 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70  ==PENDING_BYTE/p
22e60 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
22e70 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
22e80 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d  >dbSize++;.    }
22e90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
22ea0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
22eb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
22ec0 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61 2d   to mark a data-
22ed0 70 61 67 65 20 61 73 20 77 72 69 74 61 62 6c 65  page as writable
22ee0 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70 61  . It uses .** pa
22ef0 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20 6f  ger_write() to o
22f00 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  pen a journal fi
22f10 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  le (if it is not
22f20 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a   already open).*
22f30 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20  * and write the 
22f40 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20 74  page *pData to t
22f50 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
22f60 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
22f70 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
22f80 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72  nction and pager
22f90 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74  _write() is that
22fa0 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
22fb0 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74  n also deals wit
22fc0 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  h the special ca
22fd0 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f  se where 2 or mo
22fe0 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20  re pages.** fit 
22ff0 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b  on a single disk
23000 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73   sector. In this
23010 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73   case all co-res
23020 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d  ident pages.** m
23030 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72  ust have been wr
23040 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
23050 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
23060 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
23070 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  nt sqlite3PagerW
23080 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62  rite(DbPage *pDb
23090 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
230a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
230b0 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
230c0 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
230d0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
230e0 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ger;.  Pgno nPag
230f0 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50  ePerSector = (pP
23100 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
23110 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
23120 65 29 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65  e);..  pagerEnte
23130 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
23140 20 21 4d 45 4d 44 42 20 26 26 20 6e 50 61 67 65   !MEMDB && nPage
23150 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20  PerSector>1 ){. 
23160 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75     Pgno nPageCou
23170 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
23180 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
23190 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
231a0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67  e file */.    Pg
231b0 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20  no pg1;         
231c0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
231d0 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
231e0 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
231f0 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e  ed on. */.    in
23200 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
23210 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
23220 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74  r of pages start
23230 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f  ing at pg1 to jo
23240 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74  urnal */.    int
23250 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65   ii;.    int nee
23260 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20  dSync = 0;..    
23270 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74  /* Set the doNot
23280 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20  Sync flag to 1. 
23290 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
232a0 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  we cannot allow 
232b0 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  a journal.    **
232c0 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72   header to be wr
232d0 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68  itten between th
232e0 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65  e pages journale
232f0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
23300 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  on..    */.    a
23310 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
23320 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  oNotSync==0 );. 
23330 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
23340 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f  Sync = 1;..    /
23350 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73  * This trick ass
23360 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74  umes that both t
23370 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
23380 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65   sector-size are
23390 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67  .    ** an integ
233a0 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49  er power of 2. I
233b0 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20  t sets variable 
233c0 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74  pg1 to the ident
233d0 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  ifier.    ** of 
233e0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
233f0 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
23400 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a   is located on..
23410 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d      */.    pg1 =
23420 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20   ((pPg->pgno-1) 
23430 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74  & ~(nPagePerSect
23440 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20  or-1)) + 1;..   
23450 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 73 71   nPageCount = sq
23460 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
23470 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
23480 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e   if( pPg->pgno>n
23490 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
234a0 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d     nPage = (pPg-
234b0 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a  >pgno - pg1)+1;.
234c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
234d0 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f  g1+nPagePerSecto
234e0 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20  r-1)>nPageCount 
234f0 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
23500 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67   nPageCount+1-pg
23510 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
23520 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
23530 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20  ePerSector;.    
23540 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61  }.    assert(nPa
23550 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72  ge>0);.    asser
23560 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f  t(pg1<=pPg->pgno
23570 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70  );.    assert((p
23580 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70  g1+nPage)>pPg->p
23590 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  gno);..    for(i
235a0 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26  i=0; ii<nPage &&
235b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
235c0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e  ii++){.      Pgn
235d0 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20  o pg = pg1+ii;. 
235e0 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
235f0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  e;.      if( !pP
23600 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
23610 20 7c 7c 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e   || pg==pPg->pgn
23620 6f 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  o || .          
23630 70 67 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  pg>pPager->origD
23640 62 53 69 7a 65 20 7c 7c 20 21 28 70 50 61 67 65  bSize || !(pPage
23650 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67  r->aInJournal[pg
23660 2f 38 5d 26 28 31 3c 3c 28 70 67 26 37 29 29 29  /8]&(1<<(pg&7)))
23670 0a 20 20 20 20 20 20 29 20 7b 0a 20 20 20 20 20  .      ) {.     
23680 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52     if( pg!=PAGER
23690 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
236a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
236b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
236c0 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26  et(pPager, pg, &
236d0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
236e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
236f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
23700 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
23710 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
23720 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
23730 65 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  e->needSync ){. 
23740 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 65               nee
23750 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
23760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23770 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
23780 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
23790 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
237a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
237b0 20 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61   if( (pPage = pa
237c0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
237d0 72 2c 20 70 67 29 29 20 29 7b 0a 20 20 20 20 20  r, pg)) ){.     
237e0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 65     if( pPage->ne
237f0 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
23800 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
23810 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23820 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
23830 2a 20 49 66 20 74 68 65 20 50 67 48 64 72 2e 6e  * If the PgHdr.n
23840 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
23850 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74  set for any of t
23860 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a  he nPage pages .
23870 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
23880 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20  at pg1, then it 
23890 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20  needs to be set 
238a0 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e  for all of them.
238b0 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   Because.    ** 
238c0 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f  writing to any o
238d0 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61  f these nPage pa
238e0 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74  ges may damage t
238f0 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20  he others, the. 
23900 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
23910 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  le must contain 
23920 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20  sync()ed copies 
23930 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20  of all of them. 
23940 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79     ** before any
23950 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20   of them can be 
23960 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
23970 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23980 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
23990 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20   needSync ){.   
239a0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
239b0 6e 50 61 67 65 20 26 26 20 6e 65 65 64 53 79 6e  nPage && needSyn
239c0 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
239d0 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d    PgHdr *pPage =
239e0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
239f0 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20  ager, pg1+ii);. 
23a00 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
23a10 20 29 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79   ) pPage->needSy
23a20 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  nc = 1;.      }.
23a30 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
23a40 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  ger->needSync);.
23a50 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
23a60 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
23a70 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70  Sync==1 );.    p
23a80 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
23a90 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
23aa0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
23ab0 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
23ac0 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  }.  pagerLeave(p
23ad0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
23ae0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
23af0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
23b00 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
23b10 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
23b20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
23b30 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  d.** to sqlite3P
23b40 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e  agerWrite().  In
23b50 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
23b60 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
23b70 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
23b80 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
23b90 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  f the page..*/.#
23ba0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e  ifndef NDEBUG.in
23bb0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
23bc0 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65  writeable(DbPage
23bd0 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
23be0 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23   pPg->dirty;.}.#
23bf0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
23c00 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
23c10 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20  M./*.** Replace 
23c20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
23c30 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74   single page wit
23c40 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  h the informatio
23c50 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a  n in the third.*
23c60 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  * argument..*/.i
23c70 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
23c80 76 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a  verwrite(Pager *
23c90 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
23ca0 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  o, void *pData){
23cb0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
23cc0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 70 61 67 65   int rc;..  page
23cd0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
23ce0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
23cf0 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
23d00 67 6e 6f 2c 20 26 70 50 67 29 3b 0a 20 20 69 66  gno, &pPg);.  if
23d10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23d20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
23d30 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
23d40 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  g);.    if( rc==
23d50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23d60 20 20 20 6d 65 6d 63 70 79 28 73 71 6c 69 74 65     memcpy(sqlite
23d70 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
23d80 67 29 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  g), pData, pPage
23d90 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
23da0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
23db0 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
23dc0 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65    }.  pagerLeave
23dd0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
23de0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
23df0 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
23e00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
23e10 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
23e20 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
23e30 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
23e40 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
23e50 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62  on on page pPg b
23e60 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
23e70 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
23e80 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
23e90 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
23ea0 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76  ty..**.** The ov
23eb0 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65  erlying software
23ec0 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69   layer calls thi
23ed0 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61  s routine when a
23ee0 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a  ll of the data.*
23ef0 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  * on the given p
23f00 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20  age is unused.  
23f10 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20  The pager marks 
23f20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
23f30 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  n so.** that it 
23f40 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69  does not get wri
23f50 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tten to disk..**
23f60 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74  .** Tests show t
23f70 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  hat this optimiz
23f80 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20  ation, together 
23f90 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69  with the.** sqli
23fa0 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
23fb0 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f  back() below, mo
23fc0 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74  re than double t
23fd0 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c  he speed.** of l
23fe0 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72  arge INSERT oper
23ff0 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72  ations and quadr
24000 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
24010 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e  f large DELETEs.
24020 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
24030 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
24040 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61  ed, set the alwa
24050 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20  ysRollback flag 
24060 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73  to true..** Subs
24070 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
24080 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
24090 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  Rollback() for t
240a0 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20  he same page.** 
240b0 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20  will thereafter 
240c0 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69  be ignored.  Thi
240d0 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  s is necessary t
240e0 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65  o avoid a proble
240f0 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67  m.** where a pag
24100 65 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61  e with data is a
24110 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
24120 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20  list during one 
24130 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61  part of.** a tra
24140 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65  nsaction then re
24150 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66  moved from the f
24160 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61  reelist during a
24170 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f   later part.** o
24180 66 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73  f the same trans
24190 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65  action and reuse
241a0 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  d for some other
241b0 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20   purpose.  When 
241c0 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61  it.** is first a
241d0 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
241e0 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69  list, this routi
241f0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57  ne is called.  W
24200 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74  hen reused,.** t
24210 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  he sqlite3PagerD
24220 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f  ontRollback() ro
24230 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
24240 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
24250 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69  e.** page contai
24260 6e 73 20 63 72 69 74 69 63 61 6c 20 64 61 74 61  ns critical data
24270 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  , we still need 
24280 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65  to be sure it ge
24290 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ts.** rolled bac
242a0 6b 20 69 6e 20 73 70 69 74 65 20 6f 66 20 74 68  k in spite of th
242b0 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  e sqlite3PagerDo
242c0 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c  ntRollback() cal
242d0 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
242e0 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
242f0 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
24300 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
24310 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67  = pDbPage;.  Pag
24320 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
24330 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28  ->pPager;..  if(
24340 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b   MEMDB ) return;
24350 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
24360 61 67 65 72 29 3b 0a 20 20 70 50 67 2d 3e 61 6c  ager);.  pPg->al
24370 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  waysRollback = 1
24380 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  ;.  if( pPg->dir
24390 74 79 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73  ty && !pPager->s
243a0 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
243b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
243c0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
243d0 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  RED );.    if( p
243e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28  Pager->dbSize==(
243f0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26  int)pPg->pgno &&
24400 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
24410 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69  ize<pPager->dbSi
24420 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ze ){.      /* I
24430 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20  f this pages is 
24440 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
24450 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68   the file and th
24460 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e  e file has grown
24470 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67  .      ** during
24480 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
24490 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64  nsaction, then d
244a0 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70  o NOT mark the p
244b0 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20  age as clean..  
244c0 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20      ** When the 
244d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72  database file gr
244e0 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b  ows, we must mak
244f0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
24500 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20  last page.      
24510 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20  ** gets written 
24520 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f  at least once so
24530 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66   that the disk f
24540 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ile will be the 
24550 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a  correct.      **
24560 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f   size. If you do
24570 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20   not write this 
24580 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a  page and the siz
24590 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20  e of the file.  
245a0 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69      ** on the di
245b0 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67  sk ends up being
245c0 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74   too small, that
245d0 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
245e0 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63  abase.      ** c
245f0 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67  orruption during
24600 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61   the next transa
24610 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
24620 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24630 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f   PAGERTRACE3("DO
24640 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64  NT_WRITE page %d
24650 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e   of %d\n", pPg->
24660 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
24670 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f  ager));.      IO
24680 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70  TRACE(("CLEAN %p
24690 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
246a0 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20  pPg->pgno)).    
246b0 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29    makeClean(pPg)
246c0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
246d0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
246e0 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
246f0 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
24700 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
24710 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c    }.  }.  pagerL
24720 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a  eave(pPager);.}.
24730 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
24740 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
24750 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
24760 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b  at if a rollback
24770 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69   occurs,.** it i
24780 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
24790 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
247a0 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ata on the given
247b0 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20   page.  This.** 
247c0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
247d0 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
247e0 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  ve to record the
247f0 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74   given page in t
24800 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  he.** rollback j
24810 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
24820 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74   we have not yet
24830 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74   actually read t
24840 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
24850 69 73 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74  is page (if.** t
24860 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61  he PgHdr.needRea
24870 64 20 66 6c 61 67 20 69 73 20 73 65 74 29 20 74  d flag is set) t
24880 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
24890 20 61 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69   acts as a promi
248a0 73 65 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69  se.** that we wi
248b0 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f  ll never need to
248c0 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 63   read the page c
248d0 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75  ontent in the fu
248e0 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20  ture..** so the 
248f0 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 63 61  needRead flag ca
24900 6e 20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20  n be cleared at 
24910 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76  this point..*/.v
24920 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
24930 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50  DontRollback(DbP
24940 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
24950 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
24960 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 70 61 67  ->pPager;..  pag
24970 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
24980 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24990 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
249a0 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66  RESERVED );.  if
249b0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
249c0 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72  lOpen==0 ) retur
249d0 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c  n;.  if( pPg->al
249e0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20  waysRollback || 
249f0 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
24a00 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20  llback || MEMDB 
24a10 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
24a20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
24a30 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
24a40 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
24a50 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61  gDbSize ){.    a
24a60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
24a70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
24a80 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
24a90 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f  ournal[pPg->pgno
24aa0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
24ab0 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67  pgno&7);.    pPg
24ac0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
24ad0 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65  .    pPg->needRe
24ae0 61 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ad = 0;.    if( 
24af0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
24b00 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
24b10 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
24b20 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
24b30 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
24b40 20 7d 0a 20 20 20 20 50 41 47 45 52 54 52 41 43   }.    PAGERTRAC
24b50 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43  E3("DONT_ROLLBAC
24b60 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  K page %d of %d\
24b70 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50  n", pPg->pgno, P
24b80 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
24b90 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 47  .    IOTRACE(("G
24ba0 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c  ARBAGE %p %d\n",
24bb0 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
24bc0 6e 6f 29 29 0a 20 20 7d 0a 20 20 69 66 28 20 70  no)).  }.  if( p
24bd0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
24be0 20 0a 20 20 20 26 26 20 21 70 61 67 65 49 6e 53   .   && !pageInS
24bf0 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a 20  tatement(pPg) . 
24c00 20 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70    && (int)pPg->p
24c10 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
24c20 74 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20  tSize .  ){.    
24c30 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
24c40 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
24c50 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
24c60 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
24c70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
24c80 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b  r->aInStmt!=0 );
24c90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
24ca0 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
24cb0 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
24cc0 6e 6f 26 37 29 3b 0a 20 20 7d 0a 20 20 70 61 67  no&7);.  }.  pag
24cd0 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
24ce0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
24cf0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
24d00 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  d to increment t
24d10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24d20 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c   change-counter,
24d30 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79  .** stored at by
24d40 74 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67  te 24 of the pag
24d50 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  er file..*/.stat
24d60 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
24d70 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
24d80 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
24d90 6e 74 20 69 73 44 69 72 65 63 74 29 7b 0a 20 20  nt isDirect){.  
24da0 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
24db0 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e   u32 change_coun
24dc0 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ter;.  int rc = 
24dd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
24de0 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  ( !pPager->chang
24df0 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20 20  eCountDone ){.  
24e00 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31    /* Open page 1
24e10 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   of the file for
24e20 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20   writing. */.   
24e30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
24e40 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c  erGet(pPager, 1,
24e50 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69   &pPgHdr);.    i
24e60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24e70 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
24e80 20 20 20 69 66 28 20 21 69 73 44 69 72 65 63 74     if( !isDirect
24e90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
24ea0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
24eb0 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20  (pPgHdr);.      
24ec0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24ed0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
24ee0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
24ef0 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20  PgHdr);.        
24f00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
24f10 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
24f20 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   Increment the v
24f30 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61  alue just read a
24f40 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b  nd write it back
24f50 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   to byte 24. */.
24f60 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
24f70 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  er = sqlite3Get4
24f80 62 79 74 65 28 28 75 38 2a 29 70 50 61 67 65 72  byte((u8*)pPager
24f90 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20  ->dbFileVers);. 
24fa0 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
24fb0 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32 62 69  r++;.    put32bi
24fc0 74 73 28 28 28 63 68 61 72 2a 29 50 47 48 44 52  ts(((char*)PGHDR
24fd0 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64 72 29  _TO_DATA(pPgHdr)
24fe0 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+24, change_cou
24ff0 6e 74 65 72 29 3b 0a 0a 20 20 20 20 69 66 28 20  nter);..    if( 
25000 69 73 44 69 72 65 63 74 20 26 26 20 70 50 61 67  isDirect && pPag
25010 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
25020 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
25030 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20 50 47 48  void *zBuf = PGH
25040 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64  DR_TO_DATA(pPgHd
25050 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  r);.      rc = s
25060 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
25070 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20  ager->fd, zBuf, 
25080 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
25090 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
250a0 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
250b0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
250c0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
250d0 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
250e0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
250f0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
25100 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
25110 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  rc;.}../*.** Syn
25120 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
25130 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ile for the page
25140 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65  r pPager. zMaste
25150 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
25160 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73  name.** of a mas
25170 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
25180 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
25190 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
251a0 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a   individual.** j
251b0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61  ournal file. zMa
251c0 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ster may be NULL
251d0 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  , which is inter
251e0 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73  preted as no mas
251f0 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ter.** journal (
25200 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
25210 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
25220 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
25230 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ne ensures that 
25240 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
25250 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79  ynced, all dirty
25260 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a   pages written.*
25270 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
25280 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64  e file and the d
25290 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
252a0 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68  ced. The only th
252b0 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61  ing that.** rema
252c0 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
252d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
252e0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
252f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a  ournal file (or.
25300 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
25310 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66  l file if specif
25320 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ied)..**.** Note
25330 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72   that if zMaster
25340 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65  ==NULL, this doe
25350 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20  s not overwrite 
25360 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  a previous value
25370 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e  .** passed to an
25380 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
25390 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
253a0 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ll..**.** If par
253b0 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69 73  ameter nTrunc is
253c0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
253d0 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69  the pager file i
253e0 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a  s truncated to.*
253f0 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20 28  * nTrunc pages (
25400 74 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  this is used by 
25410 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
25420 62 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73  bases)..*/.int s
25430 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
25440 74 50 68 61 73 65 4f 6e 65 28 50 61 67 65 72 20  tPhaseOne(Pager 
25450 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
25460 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67  har *zMaster, Pg
25470 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e  no nTrunc){.  in
25480 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
25490 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 34  ;..  PAGERTRACE4
254a0 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a  ("DATABASE SYNC:
254b0 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72   File=%s zMaster
254c0 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22  =%s nTrunc=%d\n"
254d0 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  , .      pPager-
254e0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73  >zFilename, zMas
254f0 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20  ter, nTrunc);.  
25500 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
25510 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  r);..  /* If thi
25520 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
25530 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65  y db, or no page
25540 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
25550 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a  ten to, or this.
25560 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61    ** function ha
25570 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
25580 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
25590 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
255a0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
255b0 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20  PAGER_SYNCED && 
255c0 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
255d0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a  ->dirtyCache ){.
255e0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
255f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
25600 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
25610 54 45 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 74  TE.    /* The at
25620 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
25630 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
25640 73 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  sed if all of th
25650 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  e.    ** followi
25660 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20  ng are true:.   
25670 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20   **.    **    + 
25680 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  The file-system 
25690 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f  supports the ato
256a0 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72  mic-write proper
256b0 74 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20  ty for.    **   
256c0 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a     blocks of siz
256d0 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64  e page-size, and
256e0 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 69  .    **    + Thi
256f0 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20  s commit is not 
25700 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  part of a multi-
25710 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  file transaction
25720 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20  , and.    **    
25730 2b 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  + Exactly one pa
25740 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ge has been modi
25750 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69  fied and store i
25760 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
25770 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
25780 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
25790 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
257a0 64 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  d, then the jour
257b0 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65  nal file will ne
257c0 76 65 72 0a 20 20 20 20 2a 2a 20 62 65 20 63 72  ver.    ** be cr
257d0 65 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 74  eated for this t
257e0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
257f0 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 65 41 74  */.    int useAt
25800 6f 6d 69 63 57 72 69 74 65 20 3d 20 28 0a 20 20  omicWrite = (.  
25810 20 20 20 20 20 20 21 7a 4d 61 73 74 65 72 20 26        !zMaster &
25820 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  & .        pPage
25830 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a  r->journalOff==j
25840 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50  rnlBufferSize(pP
25850 61 67 65 72 29 20 26 26 20 0a 20 20 20 20 20 20  ager) && .      
25860 20 20 6e 54 72 75 6e 63 3d 3d 30 20 26 26 20 0a    nTrunc==0 && .
25870 20 20 20 20 20 20 20 20 28 30 3d 3d 70 50 61 67          (0==pPag
25880 65 72 2d 3e 70 44 69 72 74 79 20 7c 7c 20 30 3d  er->pDirty || 0=
25890 3d 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d  =pPager->pDirty-
258a0 3e 70 44 69 72 74 79 29 0a 20 20 20 20 29 3b 0a  >pDirty).    );.
258b0 20 20 20 20 69 66 28 20 75 73 65 41 74 6f 6d 69      if( useAtomi
258c0 63 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20  cWrite ){.      
258d0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 6e 52  /* Update the nR
258e0 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  ec field in the 
258f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
25900 0a 20 20 20 20 20 20 69 6e 74 20 6f 66 66 73 65  .      int offse
25910 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
25920 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28  nalHdr + sizeof(
25930 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a  aJournalMagic);.
25940 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
25950 67 65 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b 0a 20  ger->nRec==1);. 
25960 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
25970 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
25980 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 61 67 65  d, offset, pPage
25990 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20  r->nRec);..     
259a0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
259b0 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f  b file change co
259c0 75 6e 74 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  unter. The follo
259d0 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d  wing call will m
259e0 6f 64 69 66 79 0a 20 20 20 20 20 20 2a 2a 20 74  odify.      ** t
259f0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
25a00 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70  resentation of p
25a10 61 67 65 20 31 20 74 6f 20 69 6e 63 6c 75 64 65  age 1 to include
25a20 20 74 68 65 20 75 70 64 61 74 65 64 0a 20 20 20   the updated.   
25a30 20 20 20 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75     ** change cou
25a40 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72  nter and then wr
25a50 69 74 65 20 70 61 67 65 20 31 20 64 69 72 65 63  ite page 1 direc
25a60 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62  tly to the datab
25a70 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  ase.      ** fil
25a80 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68  e. Because of th
25a90 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70  e atomic-write p
25aa0 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 68  roperty of the h
25ab0 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  ost file-system,
25ac0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
25ad0 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20 2a  is safe..      *
25ae0 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  /.      if( rc==
25af0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25b00 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
25b10 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
25b20 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  er(pPager, 1);. 
25b30 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
25b40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
25b50 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74  ite3JournalCreat
25b60 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
25b70 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
25b80 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 26  useAtomicWrite &
25b90 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
25ba0 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ).#endif..    /*
25bb0 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
25bc0 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68  rnal file name h
25bd0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
25be0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20  written to the. 
25bf0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
25c00 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63  le, then no sync
25c10 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68   is required. Th
25c20 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
25c30 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69  it is.    ** wri
25c40 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70  tten, then the p
25c50 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20  rocess fails to 
25c60 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
25c70 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20  ESERVED to an.  
25c80 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
25c90 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69  ock. The next ti
25ca0 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  me the process t
25cb0 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ries to commit t
25cc0 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
25cd0 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61  ction the m-j na
25ce0 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72  me will have alr
25cf0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
25d00 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
25d10 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
25d20 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73  ster ){.      as
25d30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
25d40 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20  urnalOpen );.   
25d50 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
25d60 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
25d70 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
25d80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25d90 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
25da0 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66 20 53  _exit;.#ifndef S
25db0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
25dc0 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
25dd0 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
25de0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
25df0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
25e00 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73  made the databas
25e10 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20  e smaller, then 
25e20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20  all pages.      
25e30 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61    ** being disca
25e40 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e  rded by the trun
25e50 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77  cation must be w
25e60 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
25e70 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
25e80 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
25e90 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
25ea0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 53  ;.        int iS
25eb0 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50  kip = PAGER_MJ_P
25ec0 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20 20 20  GNO(pPager);.   
25ed0 20 20 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75       for( i=nTru
25ee0 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d  nc+1; i<=pPager-
25ef0 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b  >origDbSize; i++
25f00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
25f10 28 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ( !(pPager->aInJ
25f20 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20 28 31  ournal[i/8] & (1
25f30 3c 3c 28 69 26 37 29 29 29 20 26 26 20 69 21 3d  <<(i&7))) && i!=
25f40 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20  iSkip ){.       
25f50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
25f60 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
25f70 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  , i, &pPg);.    
25f80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
25f90 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
25fa0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
25fb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
25fc0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
25fd0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
25fe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
25ff0 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ef(pPg);.       
26000 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26010 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
26020 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
26030 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a     }.        } .
26040 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
26050 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d       rc = writeM
26060 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
26070 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
26080 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26090 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
260a0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72  nc_exit;.      r
260b0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
260c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
260d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
260e0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
260f0 5f 65 78 69 74 3b 0a 0a 23 69 66 6e 64 65 66 20  _exit;..#ifndef 
26100 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
26110 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e  VACUUM.    if( n
26120 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
26130 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
26140 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67  gerTruncate(pPag
26150 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20  er, nTrunc);.   
26160 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26170 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
26180 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e  _exit;.    }.#en
26190 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74  dif..    /* Writ
261a0 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  e all dirty page
261b0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
261c0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50  e file */.    pP
261d0 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c  g = pager_get_al
261e0 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50  l_dirty_pages(pP
261f0 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  ager);.    rc = 
26200 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
26210 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69  list(pPg);.    i
26220 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26230 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ){.      while(
26240 20 70 50 67 20 26 26 20 21 70 50 67 2d 3e 64 69   pPg && !pPg->di
26250 72 74 79 20 29 7b 20 70 50 67 20 3d 20 70 50 67  rty ){ pPg = pPg
26260 2d 3e 70 44 69 72 74 79 3b 20 7d 0a 20 20 20 20  ->pDirty; }.    
26270 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
26280 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 67 6f   = pPg;.      go
26290 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
262a0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
262b0 70 44 69 72 74 79 20 3d 20 30 3b 0a 0a 20 20 20  pDirty = 0;..   
262c0 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74   /* Sync the dat
262d0 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
262e0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
262f0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
26300 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
26310 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
26320 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
26330 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f  s);.    }.    IO
26340 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20 25  TRACE(("DBSYNC %
26350 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a  p\n", pPager))..
26360 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
26370 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44  e = PAGER_SYNCED
26380 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d 45  ;.  }else if( ME
26390 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21 3d 30  MDB && nTrunc!=0
263a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
263b0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
263c0 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63  e(pPager, nTrunc
263d0 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69  );.  }..sync_exi
263e0 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  t:.  if( rc==SQL
263f0 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
26400 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65  D ){.    /* page
26410 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
26420 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74 65 6d  nter() may attem
26430 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  pt to obtain an 
26440 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20 20 2a  exclusive.     *
26450 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20 74   lock to spill t
26460 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 74  he cache and ret
26470 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  urn IOERR_BLOCKE
26480 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a 20 20  D. But since .  
26490 20 20 20 2a 20 74 68 65 72 65 20 69 73 20 6e 6f     * there is no
264a0 20 63 68 61 6e 63 65 20 74 68 65 20 63 61 63 68   chance the cach
264b0 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e  e is inconsisten
264c0 74 2c 20 69 74 27 73 0a 20 20 20 20 20 2a 20 62  t, it's.     * b
264d0 65 74 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20  etter to return 
264e0 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20  SQLITE_BUSY..   
264f0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
26500 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
26510 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
26520 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
26530 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  ;.}.../*.** Comm
26540 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74  it all changes t
26550 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  o the database a
26560 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  nd release the w
26570 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  rite lock..**.**
26580 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66   If the commit f
26590 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61  ails for any rea
265a0 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  son, a rollback 
265b0 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a  attempt is made.
265c0 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
265d0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
265e0 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  .  If the commit
265f0 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f   worked, SQLITE_
26600 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
26610 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
26620 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
26630 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67  eTwo(Pager *pPag
26640 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
26650 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
26660 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
26670 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ode ){.    retur
26680 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
26690 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
266a0 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52  ger->state<PAGER
266b0 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
266c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
266d0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 61 67 65  RROR;.  }.  page
266e0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
266f0 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43    PAGERTRACE2("C
26700 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47  OMMIT %d\n", PAG
26710 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
26720 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
26730 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65    pPg = pager_ge
26740 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
26750 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77  s(pPager);.    w
26760 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20  hile( pPg ){.   
26770 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
26780 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
26790 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
267a0 3b 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73  ;.      clearHis
267b0 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20  tory(pHist);.   
267c0 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
267d0 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  0;.      pPg->in
267e0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
267f0 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74     pHist->inStmt
26800 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
26810 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
26820 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65       pHist->pPre
26830 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70  vStmt = pHist->p
26840 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
26850 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70      pPg = pPg->p
26860 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20  Dirty;.    }.   
26870 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
26880 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  = 0;.#ifndef NDE
26890 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d  BUG.    for(pPg=
268a0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
268b0 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
268c0 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48  tAll){.      PgH
268d0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
268e0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
268f0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
26900 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
26910 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
26920 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
26930 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b  !pHist->pOrig );
26940 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
26950 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a  pHist->pStmt );.
26960 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
26970 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
26980 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
26990 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
269a0 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ARED;.    return
269b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
269c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
269d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
269e0 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43   !pPager->dirtyC
269f0 61 63 68 65 20 29 3b 0a 20 20 61 73 73 65 72 74  ache );.  assert
26a00 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
26a10 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c  =PAGER_SYNCED ||
26a20 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43   !pPager->dirtyC
26a30 61 63 68 65 20 29 3b 0a 20 20 72 63 20 3d 20 70  ache );.  rc = p
26a40 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
26a50 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
26a60 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
26a70 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
26a80 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
26a90 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
26aa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
26ab0 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
26ac0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61   The database fa
26ad0 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  lls back to PAGE
26ae0 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a  R_SHARED mode..*
26af0 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  * All in-memory 
26b00 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65  cache pages reve
26b10 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67  rt to their orig
26b20 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e  inal data conten
26b30 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ts..** The journ
26b40 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  al is deleted..*
26b50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26b60 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e  e cannot fail un
26b70 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20  less some other 
26b80 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
26b90 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20  ollowing.** the 
26ba0 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20  correct locking 
26bb0 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65  protocol or unle
26bc0 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  ss some other.**
26bd0 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
26be0 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74  ing trash into t
26bf0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26c00 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29  (SQLITE_CORRUPT)
26c10 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20   or.** unless a 
26c20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66  prior malloc() f
26c30 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f  ailed (SQLITE_NO
26c40 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61  MEM).  Appropria
26c50 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
26c60 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66  s are returned f
26c70 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63  or all these occ
26c80 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69  asions.  Otherwi
26c90 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  se,.** SQLITE_OK
26ca0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
26cb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
26cc0 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  rRollback(Pager 
26cd0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
26ce0 72 63 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  rc;.  PAGERTRACE
26cf0 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  2("ROLLBACK %d\n
26d00 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
26d10 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
26d20 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
26d30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67  ;.    for(p=pPag
26d40 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70  er->pAll; p; p=p
26d50 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
26d60 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
26d70 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ist;.      asser
26d80 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c  t( !p->alwaysRol
26d90 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  lback );.      i
26da0 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a  f( !p->dirty ){.
26db0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26dc0 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50  !((PgHistory *)P
26dd0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
26de0 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20  pPager))->pOrig 
26df0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
26e00 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20  t( !((PgHistory 
26e10 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  *)PGHDR_TO_HIST(
26e20 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74  p, pPager))->pSt
26e30 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  mt );.        co
26e40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
26e50 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50  .      pHist = P
26e60 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
26e70 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
26e80 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  f( pHist->pOrig 
26e90 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
26ea0 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
26eb0 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  p), pHist->pOrig
26ec0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
26ed0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  ze);.        PAG
26ee0 45 52 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41  ERTRACE3("ROLLBA
26ef0 43 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64  CK-PAGE %d of %d
26f00 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41  \n", p->pgno, PA
26f10 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
26f20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26f30 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
26f40 28 22 50 41 47 45 20 25 64 20 69 73 20 63 6c 65  ("PAGE %d is cle
26f50 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e  an on %d\n", p->
26f60 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
26f70 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ager));.      }.
26f80 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f        clearHisto
26f90 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20  ry(pHist);.     
26fa0 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20   p->dirty = 0;. 
26fb0 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61       p->inJourna
26fc0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69  l = 0;.      pHi
26fd0 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  st->inStmt = 0;.
26fe0 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72        pHist->pPr
26ff0 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e  evStmt = pHist->
27000 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
27010 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
27020 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
27030 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
27040 65 69 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65  einiter(p, pPage
27050 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
27060 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
27070 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
27080 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
27090 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70  pStmt = 0;.    p
270a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
270b0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
270c0 7a 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72  ze;.    pager_tr
270d0 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61  uncate_cache(pPa
270e0 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
270f0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
27100 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
27110 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
27120 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
27130 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
27140 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
27150 72 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  r);.  if( !pPage
27160 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c  r->dirtyCache ||
27170 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
27180 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
27190 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
271a0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
271b0 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28  .    pagerLeave(
271c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
271d0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
271e0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
271f0 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
27200 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
27210 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
27220 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
27230 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
27240 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
27250 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
27260 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
27270 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
27280 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
27290 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20  ->errCode;.  }. 
272a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
272b0 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
272c0 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ED ){.    int rc
272d0 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  2;.    rc = page
272e0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
272f0 72 2c 20 30 29 3b 0a 20 20 20 20 72 63 32 20 3d  r, 0);.    rc2 =
27300 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
27310 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
27320 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
27330 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
27340 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20  c = rc2;.    }. 
27350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
27360 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
27370 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a  pPager, 0);.  }.
27380 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 73 65 74    /* pager_reset
27390 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 70  (pPager); */.  p
273a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
273b0 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  -1;..  /* If an 
273c0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
273d0 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20  ing a ROLLBACK, 
273e0 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  we can no longer
273f0 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72   trust the pager
27400 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20  .  ** cache. So 
27410 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72  call pager_error
27420 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75  () on the way ou
27430 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72  t to make any er
27440 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73  ror .  ** persis
27450 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tent..  */.  rc 
27460 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
27470 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 70 61 67  ager, rc);.  pag
27480 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
27490 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
274a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
274b0 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
274c0 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
274d0 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
274e0 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
274f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
27500 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
27510 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
27520 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
27530 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
27540 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
27550 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
27560 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
27570 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
27580 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
27590 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pager..*/.int sq
275a0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
275b0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
275c0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
275d0 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66  er->nRef;.}..#if
275e0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
275f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
27600 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
27610 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
27620 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  sis only..*/.int
27630 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74   *sqlite3PagerSt
27640 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ats(Pager *pPage
27650 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  r){.  static int
27660 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d   a[11];.  a[0] =
27670 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20   pPager->nRef;. 
27680 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[1] = pPager->
27690 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20  nPage;.  a[2] = 
276a0 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a  pPager->mxPage;.
276b0 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d    a[3] = pPager-
276c0 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20  >dbSize;.  a[4] 
276d0 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b  = pPager->state;
276e0 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72  .  a[5] = pPager
276f0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36  ->errCode;.  a[6
27700 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74  ] = pPager->nHit
27710 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65  ;.  a[7] = pPage
27720 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d  r->nMiss;.  a[8]
27730 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74   = 0;  /* Used t
27740 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76  o be pPager->nOv
27750 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70  fl */.  a[9] = p
27760 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20  Pager->nRead;.  
27770 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e  a[10] = pPager->
27780 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
27790 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   a;.}.#endif../*
277a0 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74  .** Set the stat
277b0 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70  ement rollback p
277c0 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  oint..**.** This
277d0 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
277e0 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  be called with t
277f0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
27800 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a  ournal already.*
27810 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73  * open.  A new s
27820 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
27830 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74   is created that
27840 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
27850 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e  rollback.** chan
27860 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ges of a single 
27870 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68  SQL command with
27880 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e  in a larger tran
27890 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
278a0 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 6d 74  ic int pagerStmt
278b0 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Begin(Pager *pPa
278c0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
278d0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
278e0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a  r->stmtInUse );.
278f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27900 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
27910 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72  HARED );.  asser
27920 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
27930 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54  e>=0 );.  PAGERT
27940 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49  RACE2("STMT-BEGI
27950 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
27960 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
27970 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
27980 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
27990 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
279a0 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
279b0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
279c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
279d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
279e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
279f0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
27a00 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31  stmtAutoopen = 1
27a10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
27a20 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
27a30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
27a40 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70  urnalOpen );.  p
27a50 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
27a60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
27a70 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20  ger->aInStmt==0 
27a80 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
27a90 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 61  Stmt = sqlite3Ma
27aa0 6c 6c 6f 63 5a 65 72 6f 28 20 70 50 61 67 65 72  llocZero( pPager
27ab0 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
27ac0 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
27ad0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
27ae0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30  ager->aInStmt==0
27af0 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74   ){.    /* sqlit
27b00 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
27b10 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
27b20 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ); */.    return
27b30 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
27b40 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
27b50 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  G.  rc = sqlite3
27b60 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
27b70 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
27b80 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69  >stmtJSize);.  i
27b90 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d  f( rc ) goto stm
27ba0 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
27bb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27bc0 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70  ->stmtJSize == p
27bd0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
27be0 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50  f );.#endif.  pP
27bf0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
27c00 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
27c10 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e  lOff;.  pPager->
27c20 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
27c30 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61  r->dbSize;.  pPa
27c40 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20  ger->stmtHdrOff 
27c50 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
27c60 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65  tmtCksum = pPage
27c70 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20  r->cksumInit;.  
27c80 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  if( !pPager->stm
27c90 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  tOpen ){.    rc 
27ca0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
27cb0 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2d 3e 70  entemp(pPager->p
27cc0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 73 74 66  Vfs, pPager->stf
27cd0 64 2c 20 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74  d, pPager->zStmt
27ce0 4a 72 6e 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  Jrnl,.          
27cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d00 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
27d10 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  SUBJOURNAL);.   
27d20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
27d30 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e   goto stmt_begin
27d40 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
27d50 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
27d60 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  pen = 1;.    pPa
27d70 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
27d80 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
27d90 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
27da0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27db0 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e  OK;. .stmt_begin
27dc0 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70  _failed:.  if( p
27dd0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29  Pager->aInStmt )
27de0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
27df0 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  ee(pPager->aInSt
27e00 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  mt);.    pPager-
27e10 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  >aInStmt = 0;.  
27e20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
27e30 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
27e40 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72  rStmtBegin(Pager
27e50 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
27e60 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74 65   rc;.  pagerEnte
27e70 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20  r(pPager);.  rc 
27e80 3d 20 70 61 67 65 72 53 74 6d 74 42 65 67 69 6e  = pagerStmtBegin
27e90 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65  (pPager);.  page
27ea0 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
27eb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27ec0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73  /*.** Commit a s
27ed0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
27ee0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
27ef0 74 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  tCommit(Pager *p
27f00 50 61 67 65 72 29 7b 0a 20 20 70 61 67 65 72 45  Pager){.  pagerE
27f10 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
27f20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
27f30 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48  InUse ){.    PgH
27f40 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b  dr *pPg, *pNext;
27f50 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32  .    PAGERTRACE2
27f60 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64  ("STMT-COMMIT %d
27f70 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
27f80 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ger));.    if( !
27f90 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f  MEMDB ){.      /
27fa0 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  * sqlite3OsTrunc
27fb0 61 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64  ate(pPager->stfd
27fc0 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73  , 0); */.      s
27fd0 71 6c 69 74 65 33 5f 66 72 65 65 28 20 70 50 61  qlite3_free( pPa
27fe0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a  ger->aInStmt );.
27ff0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
28000 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  nStmt = 0;.    }
28010 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28  else{.      for(
28020 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d  pPg=pPager->pStm
28030 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  t; pPg; pPg=pNex
28040 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69  t){.        PgHi
28050 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
28060 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
28070 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
28080 20 20 20 70 4e 65 78 74 20 3d 20 70 48 69 73 74     pNext = pHist
28090 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20  ->pNextStmt;.   
280a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69       assert( pHi
280b0 73 74 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20  st->inStmt );.  
280c0 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53        pHist->inS
280d0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tmt = 0;.       
280e0 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d   pHist->pPrevStm
280f0 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74  t = pHist->pNext
28100 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
28110 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
28120 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
28130 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74        pHist->pSt
28140 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  mt = 0;.      }.
28150 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
28160 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
28170 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
28180 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70  InUse = 0;.    p
28190 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
281a0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
281b0 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
281c0 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
281d0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
281e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
281f0 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20  *.** Rollback a 
28200 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e  statement..*/.in
28210 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  t sqlite3PagerSt
28220 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  mtRollback(Pager
28230 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
28240 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74 65   rc;.  pagerEnte
28250 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
28260 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
28270 73 65 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  se ){.    PAGERT
28280 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c  RACE2("STMT-ROLL
28290 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
282a0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
282b0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
282c0 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
282d0 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
282e0 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 66   *pHist;.      f
282f0 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
28300 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70  Stmt; pPg; pPg=p
28310 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 29  Hist->pNextStmt)
28320 7b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 20  {.        pHist 
28330 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
28340 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
28350 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
28360 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
28370 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52      memcpy(PGHDR
28380 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
28390 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61  Hist->pStmt, pPa
283a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
283b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
283c0 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53  3_free(pHist->pS
283d0 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tmt);.          
283e0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
283f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28400 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
28410 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
28420 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20  r->stmtSize;.   
28430 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
28440 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  e_cache(pPager);
28450 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
28460 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
28470 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
28480 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  er_stmt_playback
28490 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
284a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
284b0 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65  StmtCommit(pPage
284c0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
284d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
284e0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
284f0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
28500 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
28510 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
28520 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
28530 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
28540 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74  hname of the dat
28550 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
28560 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
28570 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
28580 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
28590 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
285a0 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  >zFilename;.}../
285b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
285c0 56 46 53 20 73 74 72 75 63 74 75 72 65 20 66 6f  VFS structure fo
285d0 72 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a  r the pager..*/.
285e0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66  const sqlite3_vf
285f0 73 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56  s *sqlite3PagerV
28600 66 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  fs(Pager *pPager
28610 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
28620 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a  er->pVfs;.}../*.
28630 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69  ** Return the fi
28640 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68  le handle for th
28650 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
28660 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
28670 74 68 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  th the pager.  T
28680 68 69 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e  his might return
28690 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c   NULL if the fil
286a0 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74  e has.** not yet
286b0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f   been opened..*/
286c0 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73  .sqlite3_file *s
286d0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
286e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
286f0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
28700 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  >fd;.}../*.** Re
28710 74 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f  turn the directo
28720 72 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ry of the databa
28730 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
28740 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
28750 61 67 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65  agerDirname(Page
28760 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
28770 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69  turn pPager->zDi
28780 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  rectory;.}../*.*
28790 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
287a0 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
287b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
287c0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
287d0 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
287e0 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  alname(Pager *pP
287f0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
28800 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
28810 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
28820 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28  n true if fsync(
28830 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61  ) calls are disa
28840 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  bled for this pa
28850 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ger.  Return FAL
28860 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29  SE.** if fsync()
28870 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e  s are executed n
28880 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  ormally..*/.int 
28890 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
288a0 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
288b0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
288c0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23  er->noSync;.}..#
288d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
288e0 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74  _CODEC./*.** Set
288f0 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74   the codec for t
28900 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69  his pager.*/.voi
28910 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
28920 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20  tCodec(.  Pager 
28930 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20  *pPager,.  void 
28940 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
28950 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
28960 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  ,.  void *pCodec
28970 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d  Arg.){.  pPager-
28980 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63  >xCodec = xCodec
28990 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64  ;.  pPager->pCod
289a0 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72  ecArg = pCodecAr
289b0 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  g;.}.#endif..#if
289c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
289d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
289e0 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
289f0 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  pPg to location 
28a00 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65  pgno in the file
28a10 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  . .**.** There m
28a20 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65  ust be no refere
28a30 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
28a40 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61   previously loca
28a50 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28  ted at.** pgno (
28a60 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50  which we call pP
28a70 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61  gOld) though tha
28a80 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65  t page is allowe
28a90 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61  d to be.** in ca
28aa0 63 68 65 2e 20 20 49 66 20 74 68 65 20 70 61 67  che.  If the pag
28ab0 65 20 70 72 65 76 69 6f 75 73 20 6c 6f 63 61 74  e previous locat
28ac0 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f  ed at pgno is no
28ad0 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
28ae0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
28af0 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20  rnal, it is not 
28b00 70 75 74 20 74 68 65 72 65 20 62 79 20 62 79 20  put there by by 
28b10 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
28b20 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74  .** References t
28b30 6f 20 74 68 65 20 70 61 67 65 20 70 50 67 20 72  o the page pPg r
28b40 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64  emain valid. Upd
28b50 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74  ating any.** met
28b60 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  a-data associate
28b70 64 20 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e  d with pPg (i.e.
28b80 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20   data stored in 
28b90 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73  the nExtra bytes
28ba0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
28bb0 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67  ong with the pag
28bc0 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  e) is the respon
28bd0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
28be0 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20  caller..**.** A 
28bf0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
28c00 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20   be active when 
28c10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
28c20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20  called. It used 
28c30 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65  to be.** require
28c40 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65  d that a stateme
28c50 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
28c60 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62  as not active, b
28c70 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74  ut this restrict
28c80 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
28c90 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20  removed (CREATE 
28ca0 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d  INDEX needs to m
28cb0 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20  ove a page when 
28cc0 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  a statement.** t
28cd0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
28ce0 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tive)..*/.int sq
28cf0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
28d00 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
28d10 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50  , DbPage *pPg, P
28d20 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
28d30 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a 20  dr *pPgOld;  /* 
28d40 54 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f  The page being o
28d50 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20  verwritten. */. 
28d60 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e   int h;.  Pgno n
28d70 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b  eedSyncPgno = 0;
28d80 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ..  pagerEnter(p
28d90 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74  Pager);.  assert
28da0 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
28db0 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 35 28  ..  PAGERTRACE5(
28dc0 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25 64  "MOVE %d page %d
28dd0 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d   (needSync=%d) m
28de0 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a  oves to %d\n", .
28df0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
28e00 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
28e10 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c  , pPg->needSync,
28e20 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43   pgno);.  IOTRAC
28e30 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25  E(("MOVE %p %d %
28e40 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
28e50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a  g->pgno, pgno)).
28e60 0a 20 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e  .  pager_get_con
28e70 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28  tent(pPg);.  if(
28e80 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29   pPg->needSync )
28e90 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67  {.    needSyncPg
28ea0 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
28eb0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
28ec0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69  >inJournal || (i
28ed0 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  nt)pgno>pPager->
28ee0 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
28ef0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64    assert( pPg->d
28f00 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65  irty );.    asse
28f10 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
28f20 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Sync );.  }..  /
28f30 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f  * Unlink pPg fro
28f40 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68 61 69  m it's hash-chai
28f50 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73  n */.  unlinkHas
28f60 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
28f70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Pg);..  /* If th
28f80 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73  e cache contains
28f90 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67   a page with pag
28fa0 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72  e-number pgno, r
28fb0 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72  emove it.  ** fr
28fc0 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61  om it's hash cha
28fd0 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  in. Also, if the
28fe0 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
28ff0 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a  was set for .  *
29000 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f  * page pgno befo
29010 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70  re the 'move' op
29020 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64  eration, it need
29030 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64  s to be retained
29040 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70   .  ** for the p
29050 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e  age moved there.
29060 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 65 65  .  */.  pPg->nee
29070 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 67  dSync = 0;.  pPg
29080 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  Old = pager_look
29090 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
290a0 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29  ;.  if( pPgOld )
290b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
290c0 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  gOld->nRef==0 );
290d0 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43  .    unlinkHashC
290e0 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67  hain(pPager, pPg
290f0 4f 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c  Old);.    makeCl
29100 65 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20  ean(pPgOld);.   
29110 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
29120 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e   pPgOld->needSyn
29130 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  c;.  }else{.    
29140 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
29150 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
29160 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
29170 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50  && (int)pgno<=pP
29180 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
29190 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a   ){.    pPg->inJ
291a0 6f 75 72 6e 61 6c 20 3d 20 20 28 70 50 61 67 65  ournal =  (pPage
291b0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67  r->aInJournal[pg
291c0 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e  no/8] & (1<<(pgn
291d0 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 7d 65 6c  o&7)))!=0;.  }el
291e0 73 65 7b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a  se{.    pPg->inJ
291f0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
29200 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65  assert( pPg->nee
29210 64 53 79 6e 63 3d 3d 30 20 7c 7c 20 28 69 6e 74  dSync==0 || (int
29220 29 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  )pgno>pPager->or
29230 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 7d 0a  igDbSize );.  }.
29240 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65  .  /* Change the
29250 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
29260 20 70 50 67 20 61 6e 64 20 69 6e 73 65 72 74 20   pPg and insert 
29270 69 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20  it into the new 
29280 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20  hash-chain. */. 
29290 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
292a0 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20   );.  pPg->pgno 
292b0 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 67  = pgno;.  h = pg
292c0 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
292d0 61 73 68 2d 31 29 3b 0a 20 20 69 66 28 20 70 50  ash-1);.  if( pP
292e0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29  ager->aHash[h] )
292f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
29300 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e  ager->aHash[h]->
29310 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
29320 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
29330 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20  h[h]->pPrevHash 
29340 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67  = pPg;.  }.  pPg
29350 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
29360 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a  ager->aHash[h];.
29370 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
29380 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d  h] = pPg;.  pPg-
29390 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
293a0 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67  .  makeDirty(pPg
293b0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72  );.  pPager->dir
293c0 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20  tyCache = 1;..  
293d0 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  if( needSyncPgno
293e0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65   ){.    /* If ne
293f0 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f  edSyncPgno is no
29400 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
29410 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
29420 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a  eds to be .    *
29430 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  * sync()ed befor
29440 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77 72  e any data is wr
29450 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73  itten to databas
29460 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64  e file page need
29470 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a  SyncPgno..    **
29480 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73   Currently, no s
29490 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 20  uch page exists 
294a0 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
294b0 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a  e and the .    *
294c0 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e  * Pager.aInJourn
294d0 61 6c 20 62 69 74 20 68 61 73 20 62 65 65 6e 20  al bit has been 
294e0 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20  set. This needs 
294f0 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20 62  to be remedied b
29500 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a  y loading.    **
29510 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
29520 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61  he pager-cache a
29530 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  nd setting the P
29540 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  gHdr.needSync fl
29550 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ag..    **.    *
29560 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61 67  * The sqlite3Pag
29570 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79  erGet() call may
29580 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e   cause the journ
29590 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d  al to sync. So m
295a0 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
295b0 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
295c0 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  nc flag is set t
295d0 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oo..    */.    i
295e0 6e 74 20 72 63 3b 0a 20 20 20 20 50 67 48 64 72  nt rc;.    PgHdr
295f0 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73   *pPgHdr;.    as
29600 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
29610 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63  edSync );.    rc
29620 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
29630 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53  et(pPager, needS
29640 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72  yncPgno, &pPgHdr
29650 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
29660 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
29670 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72  n rc;.    pPager
29680 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
29690 20 20 20 20 70 50 67 48 64 72 2d 3e 6e 65 65 64      pPgHdr->need
296a0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50  Sync = 1;.    pP
296b0 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  gHdr->inJournal 
296c0 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44 69 72  = 1;.    makeDir
296d0 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ty(pPgHdr);.    
296e0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
296f0 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a  f(pPgHdr);.  }..
29700 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
29710 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
29720 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
29730 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
29740 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
29750 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73  e data for the s
29760 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
29770 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
29780 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61  agerGetData(DbPa
29790 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
297a0 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  rn PGHDR_TO_DATA
297b0 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
297c0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
297d0 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45   to the Pager.nE
297e0 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65  xtra bytes of "e
297f0 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20  xtra" space .** 
29800 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
29810 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69  with the specifi
29820 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  ed page..*/.void
29830 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65   *sqlite3PagerGe
29840 74 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70  tExtra(DbPage *p
29850 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
29860 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
29870 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50  er;.  return (pP
29880 61 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58  ager?PGHDR_TO_EX
29890 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
298a0 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  :0);.}../*.** Ge
298b0 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e  t/set the lockin
298c0 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20  g-mode for this 
298d0 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72  pager. Parameter
298e0 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f   eMode must be o
298f0 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c  ne.** of PAGER_L
29900 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
29910 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  , PAGER_LOCKINGM
29920 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a  ODE_NORMAL or .*
29930 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  * PAGER_LOCKINGM
29940 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49  ODE_EXCLUSIVE. I
29950 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
29960 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74  is not _QUERY, t
29970 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69  hen.** the locki
29980 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74  ng-mode is set t
29990 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63  o the value spec
299a0 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ified..**.** The
299b0 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
299c0 69 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f  is either PAGER_
299d0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
299e0 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c  AL or.** PAGER_L
299f0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
29a00 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67  SIVE, indicating
29a10 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f   the current (po
29a20 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a  ssibly updated).
29a30 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e  ** locking-mode.
29a40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
29a50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28  agerLockingMode(
29a60 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
29a70 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73  nt eMode){.  ass
29a80 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45  ert( eMode==PAGE
29a90 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
29aa0 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERY.            
29ab0 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
29ac0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
29ad0 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  AL.            |
29ae0 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  | eMode==PAGER_L
29af0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
29b00 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
29b10 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
29b20 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20  ODE_QUERY<0 );. 
29b30 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
29b40 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
29b50 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f  L>=0 && PAGER_LO
29b60 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
29b70 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  IVE>=0 );.  if( 
29b80 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61  eMode>=0 && !pPa
29b90 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
29ba0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63  .    pPager->exc
29bb0 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f  lusiveMode = eMo
29bc0 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  de;.  }.  return
29bd0 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78   (int)pPager->ex
29be0 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a  clusiveMode;.}..
29bf0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
29c00 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  BUG./*.** Print 
29c10 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c  a listing of all
29c20 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   referenced page
29c30 73 20 61 6e 64 20 74 68 65 69 72 20 72 65 66 20  s and their ref 
29c40 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  count..*/.void s
29c50 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 64 75  qlite3PagerRefdu
29c60 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  mp(Pager *pPager
29c70 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
29c80 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
29c90 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
29ca0 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
29cb0 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  {.    if( pPg->n
29cc0 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Ref<=0 ) continu
29cd0 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  e;.    sqlite3De
29ce0 62 75 67 50 72 69 6e 74 66 28 22 50 41 47 45 20  bugPrintf("PAGE 
29cf0 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66  %3d addr=%p nRef
29d00 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  =%d\n", .       
29d10 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52  pPg->pgno, PGHDR
29d20 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
29d30 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d  Pg->nRef);.  }.}
29d40 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20  .#endif..#endif 
29d50 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
29d60 49 53 4b 49 4f 20 2a 2f 0a                       ISKIO */.