/ Hex Artifact Content
Login

Artifact 50d373df61a42d9cebbad37dc56dedf03aa0d6b0:


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: 39 20 32 30 30 37 2f 31 32 2f 31 31 20 31 39 3a  9 2007/12/11 19:
0360: 33 34 3a 34 35 20 64 72 68 20 45 78 70 20 24 0a  34:45 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 2a   of the file..**
ee70: 0a 2a 2a 20 4d 69 67 68 74 20 6d 69 67 68 74 20  .** Might might 
ee80: 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
ee90: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
eea0: 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  k is smaller tha
eeb0: 6e 20 6e 50 61 67 65 2e 0a 2a 2a 20 54 68 69 73  n nPage..** This
eec0: 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72   can happen, for
eed0: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 77 65 20   example, if we 
eee0: 61 72 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  are in the middl
eef0: 65 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  e of a transacti
ef00: 6f 6e 0a 2a 2a 20 77 68 69 63 68 20 68 61 73 20  on.** which has 
ef10: 65 78 74 65 6e 64 65 64 20 74 68 65 20 66 69 6c  extended the fil
ef20: 65 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e  e size and the n
ef30: 65 77 20 70 61 67 65 73 20 61 72 65 20 73 74 69  ew pages are sti
ef40: 6c 6c 20 61 6c 6c 20 68 65 6c 64 0a 2a 2a 20 69  ll all held.** i
ef50: 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 20 61 6e  n cache, then an
ef60: 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54   INSERT or UPDAT
ef70: 45 20 64 6f 65 73 20 61 20 73 74 61 74 65 6d 65  E does a stateme
ef80: 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 53 6f  nt rollback.  So
ef90: 6d 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  me.** operating 
efa0: 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74  system implement
efb0: 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63  ations can get c
efc0: 6f 6e 66 75 73 65 64 20 69 66 20 79 6f 75 20 74  onfused if you t
efd0: 72 79 20 74 6f 0a 2a 2a 20 74 72 75 6e 63 61 74  ry to.** truncat
efe0: 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65  e a file to some
eff0: 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61   size that is la
f000: 72 67 65 72 20 74 68 61 6e 20 69 74 20 63 75 72  rger than it cur
f010: 72 65 6e 74 6c 79 20 69 73 2c 0a 2a 2a 20 73 6f  rently is,.** so
f020: 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73   detect this cas
f030: 65 20 61 6e 64 20 64 6f 20 6e 6f 74 20 64 6f 20  e and do not do 
f040: 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 2e 0a  the truncation..
f050: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
f060: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
f070: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
f080: 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
f090: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
f0a0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
f0b0: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
f0c0: 56 45 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64  VE && pPager->fd
f0d0: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
f0e0: 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a    i64 currentSiz
f0f0: 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20  e, newSize;.    
f100: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
f110: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
f120: 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29  d, &currentSize)
f130: 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20  ;.    newSize = 
f140: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f150: 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20  *(i64)nPage;.   
f160: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f170: 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a  OK && currentSiz
f180: 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  e>newSize ){.   
f190: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
f1a0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
f1b0: 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a  ->fd, newSize);.
f1c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
f1d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f1e0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
f1f0: 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
f200: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
f210: 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
f220: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
f230: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
f240: 20 73 65 63 74 6f 72 53 69 7a 65 20 66 6f 72 20   sectorSize for 
f250: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
f260: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 74 6f  .**.** The secto
f270: 72 20 73 69 7a 65 20 69 73 20 74 68 65 20 6c 61  r size is the la
f280: 72 67 65 72 20 6f 66 20 74 68 65 20 73 65 63 74  rger of the sect
f290: 6f 72 20 73 69 7a 65 20 72 65 70 6f 72 74 65 64  or size reported
f2a0: 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 33 4f 73  .** by sqlite3Os
f2b0: 53 65 63 74 6f 72 53 69 7a 65 28 29 20 61 6e 64  SectorSize() and
f2c0: 20 74 68 65 20 70 61 67 65 53 69 7a 65 2e 0a 2a   the pageSize..*
f2d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
f2e0: 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
f2f0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
f300: 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d  sert(pPager->fd-
f310: 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65  >pMethods||pPage
f320: 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
f330: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
f340: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  pFile ){.    /* 
f350: 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73  Sector size does
f360: 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74  n't matter for t
f370: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
f380: 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20  Also, the file. 
f390: 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61     ** may not ha
f3a0: 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79  ve been opened y
f3b0: 65 74 2c 20 69 6e 20 77 68 63 69 68 20 63 61 73  et, in whcih cas
f3c0: 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69  e the OsSectorSi
f3d0: 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ze().    ** call
f3e0: 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a   will segfault..
f3f0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
f400: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
f410: 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
f420: 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ize(pPager->fd);
f430: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
f440: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 70 50  r->sectorSize<pP
f450: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
f460: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  {.    pPager->se
f470: 63 74 6f 72 53 69 7a 65 20 3d 20 70 50 61 67 65  ctorSize = pPage
f480: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d  r->pageSize;.  }
f490: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
f4a0: 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ck the journal a
f4b0: 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20  nd thus restore 
f4c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
f4d0: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74  e to.** the stat
f4e0: 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f  e it was in befo
f4f0: 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61  re we started ma
f500: 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a  king changes.  .
f510: 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
f520: 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73  l file format is
f530: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a   as follows: .**
f540: 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65  .**  (1)  8 byte
f550: 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79   prefix.  A copy
f560: 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69   of aJournalMagi
f570: 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20  c[]..**  (2)  4 
f580: 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
f590: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
f5a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
f5b0: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
f5c0: 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68  s.**       in th
f5d0: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74  e journal.  If t
f5e0: 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66  his value is 0xf
f5f0: 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f  fffffff, then co
f600: 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  mpute the.**    
f610: 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67     number of pag
f620: 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  e records from t
f630: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e  he journal size.
f640: 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65  .**  (3)  4 byte
f650: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
f660: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
f670: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66   initial value f
f680: 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  or the .**      
f690: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d   sanity checksum
f6a0: 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74  ..**  (4)  4 byt
f6b0: 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
f6c0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
f6d0: 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61   pages to trunca
f6e0: 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
f6f0: 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69  database to duri
f700: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ng a rollback..*
f710: 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20 69  *  (5)  4 byte i
f720: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
f730: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
f740: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
f750: 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  r journal.**    
f760: 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61     name.  The va
f770: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20  lue may be zero 
f780: 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74  (indicate that t
f790: 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
f7a0: 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
f7b0: 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20  al.).**  (6)  N 
f7c0: 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73  bytes of the mas
f7d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
f7e0: 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c  .  The name will
f7f0: 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   be nul-terminat
f800: 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20  ed.**       and 
f810: 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 72  might be shorter
f820: 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20   than the value 
f830: 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20  read from (5).  
f840: 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  If the first byt
f850: 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68  e.**       of th
f860: 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74  e name is \000 t
f870: 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
f880: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
f890: 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20   The master.**  
f8a0: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d       journal nam
f8b0: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55  e is stored in U
f8c0: 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a  TF-8..**  (7)  Z
f8d0: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
f8e0: 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
f8f0: 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
f900: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
f910: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
f920: 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
f930: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
f940: 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
f950: 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
f960: 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
f970: 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
f980: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
f990: 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
f9a0: 66 69 72 73 74 20 36 20 69 74 65 6d 73 20 61 62  first 6 items ab
f9b0: 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
f9c0: 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
f9d0: 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
f9e0: 20 6f 66 20 74 68 65 20 37 74 68 20 69 74 65 6d   of the 7th item
f9f0: 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
fa00: 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
fa10: 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
fa20: 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
fa30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
fa40: 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
fa50: 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
fa60: 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
fa70: 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
fa80: 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
fa90: 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
faa0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
fab0: 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
fac0: 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
fad0: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
fae0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
faf0: 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
fb00: 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
fb10: 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
fb20: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
fb30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
fb40: 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
fb50: 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
fb60: 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
fb70: 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
fb80: 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
fb90: 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
fba0: 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
fbb0: 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
fbc0: 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
fbd0: 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
fbe0: 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
fbf0: 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
fc00: 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
fc10: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
fc20: 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
fc30: 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
fc40: 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
fc50: 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
fc60: 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
fc70: 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
fc80: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
fc90: 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
fca0: 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
fcb0: 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
fcc0: 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
fcd0: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
fce0: 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
fcf0: 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
fd00: 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
fd10: 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
fd20: 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
fd30: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
fd40: 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
fd50: 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
fd60: 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
fd70: 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
fd80: 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
fd90: 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
fda0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
fdb0: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
fdc0: 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
fdd0: 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
fde0: 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
fdf0: 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
fe00: 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
fe10: 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
fe20: 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
fe30: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
fe40: 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
fe50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
fe60: 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
fe70: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
fe80: 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
fe90: 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
fea0: 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
feb0: 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
fec0: 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
fed0: 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
fee0: 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
fef0: 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
ff00: 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
ff10: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
ff20: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
ff30: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
ff40: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
ff50: 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20  r, int isHot){. 
ff60: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
ff70: 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
ff80: 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  s;.  i64 szJ;   
ff90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ffa0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   Size of the jou
ffb0: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
ffc0: 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63  es */.  u32 nRec
ffd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ffe0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
fff0: 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75  cords in the jou
10000 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  rnal */.  int i;
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10020 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
10030 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
10040 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
10050 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
10060 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
10070 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
10080 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
10090 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
100a0 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ode of a subrout
100b0 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ine */.  char *z
100c0 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
100d0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
100e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
100f0 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a   if any */..  /*
10100 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
10110 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
10120 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
10130 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66    Abort early if
10140 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
10150 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f  l is empty..  */
10160 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
10170 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
10180 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
10190 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
101a0 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20  r->jfd, &szJ);. 
101b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
101c0 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a  OK || szJ==0 ){.
101d0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
101e0 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
101f0 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72   Read the master
10200 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72   journal name fr
10210 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
10220 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  if it is present
10230 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74  ..  ** If a mast
10240 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
10250 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  name is specifie
10260 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20  d, but the file 
10270 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73  is not.  ** pres
10280 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65  ent on disk, the
10290 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
102a0 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65   not hot and doe
102b0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
102c0 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63  .  ** played bac
102d0 6b 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  k..  */.  zMaste
102e0 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
102f0 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65  Space;.  rc = re
10300 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
10310 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
10320 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
10330 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
10340 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
10350 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
10360 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10370 5f 4f 4b 20 0a 20 20 20 7c 7c 20 28 7a 4d 61 73  _OK .   || (zMas
10380 74 65 72 5b 30 5d 20 26 26 20 21 73 71 6c 69 74  ter[0] && !sqlit
10390 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
103a0 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
103b0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 29  _ACCESS_EXISTS))
103c0 20 0a 20 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74   .  ){.    zMast
103d0 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
103e0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
103f0 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
10400 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  ;.    goto end_p
10410 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
10420 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10430 66 20 3d 20 30 3b 0a 20 20 7a 4d 61 73 74 65 72  f = 0;.  zMaster
10440 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73   = 0;..  /* This
10450 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
10460 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68 65   either when the
10470 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
10480 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20  ) call returns. 
10490 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20   ** SQLITE_DONE 
104a0 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  or an IO error o
104b0 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c  ccurs. */.  whil
104c0 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e( 1 ){..    /* 
104d0 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
104e0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
104f0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
10500 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
10510 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
10520 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
10530 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
10540 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
10550 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
10560 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
10570 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
10580 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c  ess must of fail
10590 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
105a0 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
105b0 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
105c0 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
105d0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
105e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
105f0 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
10600 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52  pPager, szJ, &nR
10610 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
10620 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10630 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
10640 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
10650 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
10660 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
10670 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
10680 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
10690 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
106a0 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
106b0 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
106c0 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
106d0 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
106e0 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
106f0 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
10700 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
10710 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
10720 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
10730 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
10740 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
10750 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
10760 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
10770 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
10780 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
10790 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
107a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
107b0 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
107c0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
107d0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
107e0 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
107f0 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
10800 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a        nRec = (sz
10810 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J - JOURNAL_HDR_
10820 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52  SZ(pPager))/JOUR
10830 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
10840 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
10850 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e   If nRec is 0 an
10860 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20  d this rollback 
10870 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  is of a transact
10880 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74  ion created by t
10890 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  his.    ** proce
108a0 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69  ss and if this i
108b0 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64  s the final head
108c0 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  er in the journa
108d0 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73  l, then it means
108e0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69  .    ** that thi
108f0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f  s part of the jo
10900 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
10910 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e  filled but has n
10920 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20  ot yet been.    
10930 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  ** synced to dis
10940 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20  k.  Compute the 
10950 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
10960 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d  based on the rem
10970 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69  aining.    ** si
10980 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a  ze of the file..
10990 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
109a0 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20  e third term of 
109b0 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64  the test was add
109c0 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74  ed to fix ticket
109d0 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2f 0a 20   #2565..    */. 
109e0 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26     if( nRec==0 &
109f0 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20  & !isHot &&.    
10a00 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
10a10 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
10a20 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
10a30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10a40 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20  f ){.      nRec 
10a50 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  = (szJ - pPager-
10a60 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
10a70 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
10a80 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ger);.    }..   
10a90 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
10aa0 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20  he first header 
10ab0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
10ac0 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20  urnal, truncate 
10ad0 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
10ae0 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f  ase file back to
10af0 20 69 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73   it's original s
10b00 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
10b10 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
10b20 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
10b30 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
10b40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
10b50 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
10b60 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
10b70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10b80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
10b90 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
10ba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
10bb0 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
10bc0 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
10bd0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
10be0 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
10bf0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
10c00 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
10c10 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b  0; i<nRec; i++){
10c20 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
10c30 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
10c40 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
10c50 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
10c60 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b  >journalOff, 1);
10c70 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
10c80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10c90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10ca0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
10cb0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
10cc0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _OK;.          p
10cd0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10ce0 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20  f = szJ;.       
10cf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10d00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10d10 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
10d20 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  back;.        }.
10d30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10d40 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44  }.  /*NOTREACHED
10d50 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29  */.  assert( 0 )
10d60 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a  ;..end_playback:
10d70 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
10d80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73  E_OK ){.    zMas
10d90 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
10da0 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20  mpSpace;.    rc 
10db0 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
10dc0 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
10dd0 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
10de0 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
10df0 6d 65 2b 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28  me+1);.  }.  if(
10e00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10e10 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
10e20 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
10e30 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
10e40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10e50 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
10e60 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
10e70 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
10e80 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
10e90 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
10ea0 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20  turn success,.  
10eb0 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
10ec0 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
10ed0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
10ee0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
10ef0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64      rc = pager_d
10f00 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c  elmaster(pPager,
10f10 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a   zMaster);.  }..
10f20 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
10f30 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
10f40 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
10f50 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
10f60 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
10f70 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
10f80 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
10f90 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
10fa0 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a   sector size.  *
10fb0 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
10fc0 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
10fd0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
10fe0 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
10ff0 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
11000 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
11010 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  rc;.}../*.** Pla
11020 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  yback the statem
11030 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ent journal..**.
11040 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  ** This is simil
11050 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  ar to playing ba
11060 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
11070 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77  on journal but w
11080 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74  ith.** a few ext
11090 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  ra twists..**.**
110a0 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d      (1)  The num
110b0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
110c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
110d0 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
110e0 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65  f.**         the
110f0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74   statement is st
11100 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e  ored in pPager->
11110 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e  stmtSize, not in
11120 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
11130 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73  journal file its
11140 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  elf..**.**    (2
11150 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  )  In addition t
11160 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
11170 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
11180 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20  rnal, also.**   
11190 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61        playback a
111a0 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20  ll pages of the 
111b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
111c0 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a  nal beginning.**
111d0 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73           at offs
111e0 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  et pPager->stmtJ
111f0 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
11200 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  int pager_stmt_p
11210 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
11220 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a  Pager){.  i64 sz
11230 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
11240 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
11250 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a  e full journal *
11260 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a  /.  i64 hdrOff;.
11270 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
11280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
11290 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
112a0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
112c0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
112d0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a  .  int rc;..  sz
112e0 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J = pPager->jour
112f0 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20  nalOff;.#ifndef 
11300 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20 20  NDEBUG .  {.    
11310 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20  i64 os_szJ;.    
11320 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
11330 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
11340 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20  fd, &os_szJ);.  
11350 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11360 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
11370 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a  .    assert( szJ
11380 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a  ==os_szJ );.  }.
11390 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74  #endif..  /* Set
113a0 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68   hdrOff to be th
113b0 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61 66  e offset just af
113c0 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
113d0 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a  he last journal.
113e0 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74 65    ** page writte
113f0 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  n before the fir
11400 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
11410 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  r for this state
11420 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ment.  ** transa
11430 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74 65  ction was writte
11440 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  n, or the end of
11450 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20   the file if no 
11460 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61  journal.  ** hea
11470 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e  der was written.
11480 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d  .  */.  hdrOff =
11490 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
114a0 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Off;.  assert( p
114b0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
114c0 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20  || !hdrOff );.  
114d0 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20  if( !hdrOff ){. 
114e0 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b     hdrOff = szJ;
114f0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75  .  }.  .  /* Tru
11500 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
11510 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  se back to its o
11520 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
11530 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
11540 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
11550 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
11560 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e);.  assert( pP
11570 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
11580 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20  ER_SHARED );..  
11590 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
115a0 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
115b0 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
115c0 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ent journal..  *
115d0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
115e0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
115f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11600 4f 70 65 6e 20 29 3b 0a 20 20 6e 52 65 63 20 3d  Open );.  nRec =
11610 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
11620 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20  c;.  .  /* Copy 
11630 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
11640 75 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  ut of the statem
11650 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
11660 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20  back into the.  
11670 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
11680 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
11690 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
116a0 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75  al omits checksu
116b0 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63  ms from.  ** eac
116c0 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70  h record since p
116d0 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63  ower-failure rec
116e0 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70  overy is not imp
116f0 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d  ortant to statem
11700 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ent.  ** journal
11710 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
11720 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b  0; i<nRec; i++){
11730 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
11740 3d 20 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  = i*(4+pPager->p
11750 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 63  ageSize);.    rc
11760 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
11770 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
11780 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  r, pPager->stfd,
11790 20 6f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20   offset, 0);.   
117a0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
117b0 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
117c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
117d0 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
117e0 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
117f0 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73  .  /* Now roll s
11800 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20 66  ome pages back f
11810 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74  rom the transact
11820 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67  ion journal. Pag
11830 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a  er.stmtJSize.  *
11840 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f  * was the size o
11850 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
11860 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73 74 61  le when this sta
11870 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74  tement was start
11880 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72  ed, so.  ** ever
11890 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68 61  ything after tha
118a0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
118b0 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65  lled back, eithe
118c0 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  r into the.  ** 
118d0 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65  database, the me
118e0 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62  mory cache, or b
118f0 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  oth..  **.  ** I
11900 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  f it is not zero
11910 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d  , then Pager.stm
11920 74 48 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f  tHdrOff is the o
11930 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
11940 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  rt.  ** of the f
11950 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
11960 64 65 72 20 77 72 69 74 74 65 6e 20 64 75 72 69  der written duri
11970 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ng this statemen
11980 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
11990 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   */.  pPager->jo
119a0 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65  urnalOff = pPage
119b0 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20  r->stmtJSize;.  
119c0 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
119d0 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  t = pPager->stmt
119e0 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28 20  Cksum;.  while( 
119f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11a00 66 66 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a 20  ff < hdrOff ){. 
11a10 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
11a20 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
11a30 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
11a40 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
11a50 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20  rnalOff, 1);.   
11a60 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
11a70 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
11a80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11a90 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
11aa0 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
11ab0 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72  .  while( pPager
11ac0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73  ->journalOff < s
11ad0 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a  zJ ){.    u32 nJ
11ae0 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Rec;         /* 
11af0 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61  Number of Journa
11b00 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20  l Records */.   
11b10 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
11b20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
11b30 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c  Hdr(pPager, szJ,
11b40 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29   &nJRec, &dummy)
11b50 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
11b60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11b70 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
11b80 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
11b90 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f    goto end_stmt_
11ba0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
11bb0 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
11bc0 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20   ){.      nJRec 
11bd0 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  = (szJ - pPager-
11be0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28  >journalOff) / (
11bf0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
11c00 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  +8);.    }.    f
11c10 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e  or(i=nJRec-1; i>
11c20 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  =0 && pPager->jo
11c30 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20  urnalOff < szJ; 
11c40 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i--){.      rc =
11c50 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
11c60 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
11c70 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50   pPager->jfd, pP
11c80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11c90 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 1);.      asse
11ca0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
11cb0 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ONE );.      if(
11cc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11cd0 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
11ce0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
11cf0 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
11d00 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
11d10 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79    .end_stmt_play
11d20 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d  back:.  if( rc==
11d30 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20  SQLITE_OK) {.   
11d40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11d50 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f  Off = szJ;.    /
11d60 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63  * pager_reload_c
11d70 61 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f  ache(pPager); */
11d80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11d90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
11da0 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
11db0 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
11dc0 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
11dd0 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69   allowed..*/.voi
11de0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
11df0 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72  tCachesize(Pager
11e00 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
11e10 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
11e20 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50  age>10 ){.    pP
11e30 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d  ager->mxPage = m
11e40 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xPage;.  }else{.
11e50 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61      pPager->mxPa
11e60 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a  ge = 10;.  }.}..
11e70 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65  /*.** Adjust the
11e80 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74   robustness of t
11e90 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
11ea0 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
11eb0 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f  crashes.** or po
11ec0 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20  wer failures by 
11ed0 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d  changing the num
11ee0 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20  ber of syncs()s 
11ef0 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20  when writing.** 
11f00 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
11f10 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65  rnal.  There are
11f20 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a   three levels:.*
11f30 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20  *.**    OFF     
11f40 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28    sqlite3OsSync(
11f50 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  ) is never calle
11f60 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
11f70 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20  default.**      
11f80 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70          for temp
11f90 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69  orary and transi
11fa0 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ent files..**.**
11fb0 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68      NORMAL    Th
11fc0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
11fd0 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20  ced once before 
11fe0 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
11ff0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
12000 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54      database.  T
12010 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
12020 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74  adequate protect
12030 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20  ion, but.**     
12040 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74           it is t
12050 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73  heoretically pos
12060 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65  sible, though ve
12070 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20  ry unlikely,.** 
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
12090 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20  t an inopertune 
120a0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
120b0 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f  uld leave the jo
120c0 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  urnal.**        
120d0 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65        in a state
120e0 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75   which would cau
120f0 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  se damage to the
12100 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
12110 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69            when i
12120 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t is rolled back
12130 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20  ..**.**    FULL 
12140 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c       The journal
12150 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65   is synced twice
12160 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
12170 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
12180 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
12190 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20  base (with some 
121a0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
121b0 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65  mation - the nRe
121c0 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20  c field.**      
121d0 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a          of the j
121e0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20  ournal header - 
121f0 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e  being written in
12200 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
12210 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12220 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20   syncs).  If we 
12230 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74  assume that writ
12240 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
12250 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73        single dis
12260 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d  k sector is atom
12270 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f  ic, then this mo
12280 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20  de provides.**  
12290 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75              assu
122a0 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a  rance that the j
122b0 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20  ournal will not 
122c0 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20  be corrupted to 
122d0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
122e0 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75      point of cau
122f0 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74  sing damage to t
12300 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69  he database duri
12310 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  ng rollback..**.
12320 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
12330 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
12340 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
12350 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
12360 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
12370 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
12380 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
12390 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
123a0 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66  lite3PagerSetSaf
123b0 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a  etyLevel(Pager *
123c0 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65  pPager, int leve
123d0 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e  l, int full_fsyn
123e0 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  c){.  pPager->no
123f0 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31  Sync =  level==1
12400 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
12410 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
12420 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c  fullSync = level
12430 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==3 && !pPager->
12440 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
12450 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d  er->sync_flags =
12460 20 28 66 75 6c 6c 5f 66 73 79 6e 63 3f 53 51 4c   (full_fsync?SQL
12470 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51  ITE_SYNC_FULL:SQ
12480 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
12490 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
124a0 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72  >noSync ) pPager
124b0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
124c0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
124d0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
124e0 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
124f0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
12500 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72  never the librar
12510 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  y.** attempts to
12520 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
12530 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e  y file.  This in
12540 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
12550 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
12560 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
12570 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20  ly.  .*/.#ifdef 
12580 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
12590 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
125a0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
125b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  if../*.** Open a
125c0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
125d0 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68   .**.** Write th
125e0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
125f0 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74  r into *fd.  Ret
12600 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
12610 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65   success or some
12620 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20  .** other error 
12630 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
12640 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
12650 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
12660 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  e the temporary.
12670 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ** file when it 
12680 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74  is closed..*/.st
12690 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
126a0 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20  PagerOpentemp(. 
126b0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
126c0 66 73 2c 20 20 20 20 2f 2a 20 54 68 65 20 76 69  fs,    /* The vi
126d0 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65  rtual file syste
126e0 6d 20 6c 61 79 65 72 20 2a 2f 0a 20 20 73 71 6c  m layer */.  sql
126f0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
12700 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  ,  /* Write the 
12710 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
12720 68 65 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  here */.  char *
12730 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20  zFilename,      
12740 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
12750 69 6c 65 2e 20 20 4d 69 67 68 74 20 62 65 20 4e  ile.  Might be N
12760 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ULL */.  int vfs
12770 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f  Flags          /
12780 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
12790 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46  hrough to the VF
127a0 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  S */.){.  int rc
127b0 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  ;.  assert( zFil
127c0 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 0a 23 69 66  ename!=0 );..#if
127d0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
127e0 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65    sqlite3_opente
127f0 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20  mp_count++;  /* 
12800 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
12810 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
12820 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ly */.#endif..  
12830 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c  vfsFlags |=  SQL
12840 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
12850 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
12860 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20  _CREATE |.      
12870 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
12880 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51  N_EXCLUSIVE | SQ
12890 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
128a0 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20  ONCLOSE;.  rc = 
128b0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
128c0 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  fs, zFilename, p
128d0 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20  File, vfsFlags, 
128e0 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  0);.  assert( rc
128f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
12900 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29  File->pMethods )
12910 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12920 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
12930 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20   new page cache 
12940 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
12950 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  r to the page ca
12960 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  che in *ppPager.
12970 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20  .** The file to 
12980 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e  be cached need n
12990 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 66  ot exist.  The f
129a0 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65  ile is not locke
129b0 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66  d until.** the f
129c0 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
129d0 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
129e0 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20  nd is only held 
129f0 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a  open until the.*
12a00 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72  * last page is r
12a10 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71  eleased using sq
12a20 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
12a30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  )..**.** If zFil
12a40 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
12a50 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
12a60 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
12a70 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
12a80 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
12a90 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
12aa0 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69  ed.  The file wi
12ab0 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  ll be deleted.**
12ac0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
12ad0 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
12ae0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
12af0 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
12b00 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f  :" then all info
12b10 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
12b20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20  in cache..** It 
12b30 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
12b40 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20   to disk.  This 
12b50 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
12b60 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69  mplement an.** i
12b70 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
12b80 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
12b90 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71  3PagerOpen(.  sq
12ba0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
12bb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
12bc0 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65  rtual file syste
12bd0 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61  m to use */.  Pa
12be0 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
12bf0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
12c00 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
12c10 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
12c20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
12c30 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
12c40 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12c50 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
12c60 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
12c70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
12c80 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
12c90 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
12ca0 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
12cb0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
12cc0 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
12cd0 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
12ce0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  file */.  int vf
12cf0 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
12d00 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73     /* flags pass
12d10 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
12d20 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
12d30 29 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50  ) */.){.  u8 *pP
12d40 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  tr;.  Pager *pPa
12d50 67 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ger = 0;.  int r
12d60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12d70 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65   int i;.  int te
12d80 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e  mpFile = 0;.  in
12d90 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69  t memDb = 0;.  i
12da0 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  nt readOnly = 0;
12db0 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
12dc0 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  l = (flags & PAG
12dd0 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29  ER_OMIT_JOURNAL)
12de0 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61  ==0;.  int noRea
12df0 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26  dlock = (flags &
12e00 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f   PAGER_NO_READLO
12e10 43 4b 29 21 3d 30 3b 0a 20 20 69 6e 74 20 6a 6f  CK)!=0;.  int jo
12e20 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20  urnalFileSize = 
12e30 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
12e40 7a 65 28 70 56 66 73 29 3b 0a 20 20 69 6e 74 20  ze(pVfs);.  int 
12e50 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20 53  nDefaultPage = S
12e60 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
12e70 47 45 5f 53 49 5a 45 3b 0a 20 20 63 68 61 72 20  GE_SIZE;.  char 
12e80 2a 7a 50 61 74 68 6e 61 6d 65 3b 0a 20 20 69 6e  *zPathname;.  in
12e90 74 20 6e 50 61 74 68 6e 61 6d 65 3b 0a 0a 20 20  t nPathname;..  
12ea0 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 72  /* The default r
12eb0 65 74 75 72 6e 20 69 73 20 61 20 4e 55 4c 4c 20  eturn is a NULL 
12ec0 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 2a 70 70  pointer */.  *pp
12ed0 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a  Pager = 0;..  /*
12ee0 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66 75 6c   Compute the ful
12ef0 6c 20 70 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  l pathname */.  
12f00 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  nPathname = pVfs
12f10 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
12f20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
12f30 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 50 61  lite3_malloc(nPa
12f40 74 68 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  thname);.  if( z
12f50 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Pathname==0 ){. 
12f60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12f70 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
12f80 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
12f90 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23  Filename[0] ){.#
12fa0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12fb0 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
12fc0 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
12fd0 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
12fe0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
12ff0 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50  Db = 1;.      zP
13000 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a  athname[0] = 0;.
13010 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
13020 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20  .    {.      rc 
13030 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
13040 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
13050 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
13060 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  me, zPathname);.
13070 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
13080 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
13090 73 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66  sGetTempname(pVf
130a0 73 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50  s, nPathname, zP
130b0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  athname);.  }.  
130c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
130d0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
130e0 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
130f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
13100 0a 20 20 7d 0a 20 20 6e 50 61 74 68 6e 61 6d 65  .  }.  nPathname
13110 20 3d 20 73 74 72 6c 65 6e 28 7a 50 61 74 68 6e   = strlen(zPathn
13120 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ame);..  /* Allo
13130 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
13140 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74  the pager struct
13150 75 72 65 20 2a 2f 0a 20 20 70 50 61 67 65 72 20  ure */.  pPager 
13160 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
13170 65 72 6f 28 0a 20 20 20 20 73 69 7a 65 6f 66 28  ero(.    sizeof(
13180 2a 70 50 61 67 65 72 29 20 2b 20 20 20 20 20 20  *pPager) +      
13190 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
131a0 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 6a  ructure */.    j
131b0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2b  ournalFileSize +
131c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
131d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
131e0 74 72 75 63 74 75 72 65 20 2a 2f 20 0a 20 20 20  tructure */ .   
131f0 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20   pVfs->szOsFile 
13200 2a 20 32 20 2b 20 20 20 20 20 20 20 20 2f 2a 20  * 2 +        /* 
13210 54 68 65 20 64 62 20 61 6e 64 20 73 74 6d 74 20  The db and stmt 
13220 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
13230 20 0a 20 20 20 20 34 2a 6e 50 61 74 68 6e 61 6d   .    4*nPathnam
13240 65 20 2b 20 34 30 20 20 20 20 20 20 20 20 20 20  e + 40          
13250 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c 20    /* zFilename, 
13260 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 4a 6f 75  zDirectory, zJou
13270 72 6e 61 6c 2c 20 7a 53 74 6d 74 4a 72 6e 6c 20  rnal, zStmtJrnl 
13280 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 21 70  */.  );.  if( !p
13290 50 61 67 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  Pager ){.    sql
132a0 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
132b0 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
132c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
132d0 20 7d 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20   }.  pPtr = (u8 
132e0 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20  *)&pPager[1];.  
132f0 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
13300 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 20 20 70   = vfsFlags;.  p
13310 50 61 67 65 72 2d 3e 66 64 20 3d 20 28 73 71 6c  Pager->fd = (sql
13320 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72  ite3_file*)&pPtr
13330 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a  [pVfs->szOsFile*
13340 30 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  0];.  pPager->st
13350 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
13360 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e  le*)&pPtr[pVfs->
13370 73 7a 4f 73 46 69 6c 65 2a 31 5d 3b 0a 20 20 70  szOsFile*1];.  p
13380 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 28 73 71  Pager->jfd = (sq
13390 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74  lite3_file*)&pPt
133a0 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  r[pVfs->szOsFile
133b0 2a 32 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  *2];.  pPager->z
133c0 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
133d0 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a  *)&pPtr[pVfs->sz
133e0 4f 73 46 69 6c 65 2a 32 2b 6a 6f 75 72 6e 61 6c  OsFile*2+journal
133f0 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61  FileSize];.  pPa
13400 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20  ger->zDirectory 
13410 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  = &pPager->zFile
13420 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31  name[nPathname+1
13430 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ];.  pPager->zJo
13440 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  urnal = &pPager-
13450 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 50 61 74  >zDirectory[nPat
13460 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67  hname+1];.  pPag
13470 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 20 3d 20  er->zStmtJrnl = 
13480 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
13490 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 30 5d 3b  l[nPathname+10];
134a0 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20  .  pPager->pVfs 
134b0 3d 20 70 56 66 73 3b 0a 20 20 6d 65 6d 63 70 79  = pVfs;.  memcpy
134c0 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
134d0 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  me, zPathname, n
134e0 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 73  Pathname+1);.  s
134f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
13500 68 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 4f 70  hname);..  /* Op
13510 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  en the pager fil
13520 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  e..  */.  if( zF
13530 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
13540 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44  name[0] && !memD
13550 62 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 50 61  b ){.    if( nPa
13560 74 68 6e 61 6d 65 3e 28 70 56 66 73 2d 3e 6d 78  thname>(pVfs->mx
13570 50 61 74 68 6e 61 6d 65 20 2d 20 73 69 7a 65 6f  Pathname - sizeo
13580 66 28 22 2d 6a 6f 75 72 6e 61 6c 22 29 29 20 29  f("-journal")) )
13590 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
135a0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
135b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
135c0 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20  nt fout = 0;.   
135d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
135e0 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
135f0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
13600 50 61 67 65 72 2d 3e 66 64 2c 0a 20 20 20 20 20  Pager->fd,.     
13610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13620 20 20 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46      pPager->vfsF
13630 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20  lags, &fout);.  
13640 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
13650 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
13660 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20  _READONLY);..   
13670 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
13680 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
13690 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65  ly opened for re
136a0 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c  ad/write access,
136b0 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65  .      ** choose
136c0 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20   a default page 
136d0 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20  size in case we 
136e0 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74  have to create t
136f0 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
13700 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64  base file. The d
13710 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
13720 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
13730 6f 66 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  of:.      **.   
13740 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
13750 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
13760 49 5a 45 2c 0a 20 20 20 20 20 20 2a 2a 20 20 20  IZE,.      **   
13770 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74   + The value ret
13780 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
13790 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
137a0 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65       **    + The
137b0 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
137c0 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
137d0 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
137e0 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
137f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13800 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79  _OK && !readOnly
13810 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
13820 69 53 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71  iSectorSize = sq
13830 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
13840 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
13850 20 20 20 20 20 20 20 69 66 28 20 6e 44 65 66 61         if( nDefa
13860 75 6c 74 50 61 67 65 3c 69 53 65 63 74 6f 72 53  ultPage<iSectorS
13870 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
13880 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20   nDefaultPage = 
13890 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  iSectorSize;.   
138a0 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
138b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
138c0 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  IC_WRITE.       
138d0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
138e0 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
138f0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
13900 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
13910 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
13920 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61   ii;.          a
13930 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
13940 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
13950 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
13960 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
13970 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
13980 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
13990 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
139a0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
139b0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
139c0 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20  536);.          
139d0 66 6f 72 28 69 69 3d 6e 44 65 66 61 75 6c 74 50  for(ii=nDefaultP
139e0 61 67 65 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f  age; ii<=SQLITE_
139f0 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
13a00 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b  _SIZE; ii=ii*2){
13a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
13a20 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43   iDc&(SQLITE_IOC
13a30 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38  AP_ATOMIC|(ii>>8
13a40 29 29 20 29 20 6e 44 65 66 61 75 6c 74 50 61 67  )) ) nDefaultPag
13a50 65 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20  e = ii;.        
13a60 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65    }.        }.#e
13a70 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28  ndif.        if(
13a80 20 6e 44 65 66 61 75 6c 74 50 61 67 65 3e 53 51   nDefaultPage>SQ
13a90 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
13aa0 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20  _PAGE_SIZE ){.  
13ab0 20 20 20 20 20 20 20 20 6e 44 65 66 61 75 6c 74          nDefault
13ac0 50 61 67 65 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Page = SQLITE_MA
13ad0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
13ae0 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  IZE;.        }. 
13af0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
13b00 65 6c 73 65 20 69 66 28 20 21 6d 65 6d 44 62 20  else if( !memDb 
13b10 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74  ){.    /* If a t
13b20 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
13b30 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
13b40 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d  s not opened imm
13b50 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
13b60 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
13b70 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61   accept the defa
13b80 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ult page size an
13b90 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79  d delay actually
13ba0 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
13bb0 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  the file until t
13bc0 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
13bd0 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20   OsWrite()..    
13be0 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65  */ .    tempFile
13bf0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
13c00 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
13c10 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 0a  EXCLUSIVE;.  }..
13c20 20 20 69 66 28 20 70 50 61 67 65 72 20 26 26 20    if( pPager && 
13c30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13c40 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d  .    pPager->pTm
13c50 70 53 70 61 63 65 20 3d 20 28 63 68 61 72 20 2a  pSpace = (char *
13c60 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
13c70 6e 44 65 66 61 75 6c 74 50 61 67 65 29 3b 0a 20  nDefaultPage);. 
13c80 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65   }..  /* If an e
13c90 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20  rror occured in 
13ca0 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c  either of the bl
13cb0 6f 63 6b 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2a  ocks above..  **
13cc0 20 46 72 65 65 20 74 68 65 20 50 61 67 65 72 20   Free the Pager 
13cd0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c  structure and cl
13ce0 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  ose the file..  
13cf0 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 70 61 67  ** Since the pag
13d00 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61  er is not alloca
13d10 74 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ted there is no 
13d20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20 2a  need to set .  *
13d30 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72 4d  * any Pager.errM
13d40 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a 20  ask variables.. 
13d50 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65   */.  if( !pPage
13d60 72 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 70 54  r || !pPager->pT
13d70 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 73  mpSpace ){.    s
13d80 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
13d90 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73  ager->fd);.    s
13da0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
13db0 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
13dc0 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  ((rc==SQLITE_OK)
13dd0 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63  ?SQLITE_NOMEM:rc
13de0 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  );.  }..  PAGERT
13df0 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25  RACE3("OPEN %d %
13e00 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
13e10 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20  ID(pPager->fd), 
13e20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
13e30 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  e);.  IOTRACE(("
13e40 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
13e50 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
13e60 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a  Filename))..  /*
13e70 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a   Fill in Pager.z
13e80 44 69 72 65 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20  Directory[] */. 
13e90 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
13ea0 7a 44 69 72 65 63 74 6f 72 79 2c 20 70 50 61 67  zDirectory, pPag
13eb0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  er->zFilename, n
13ec0 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 66  Pathname+1);.  f
13ed0 6f 72 28 69 3d 73 74 72 6c 65 6e 28 70 50 61 67  or(i=strlen(pPag
13ee0 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b  er->zDirectory);
13ef0 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e   i>0 && pPager->
13f00 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21  zDirectory[i-1]!
13f10 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69  ='/'; i--){}.  i
13f20 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d  f( i>0 ) pPager-
13f30 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
13f40 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c   = 0;..  /* Fill
13f50 20 69 6e 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e   in Pager.zJourn
13f60 61 6c 5b 5d 20 61 6e 64 20 50 61 67 65 72 2e 7a  al[] and Pager.z
13f70 53 74 6d 74 4a 72 6e 6c 5b 5d 20 2a 2f 0a 20 20  StmtJrnl[] */.  
13f80 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
13f90 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
13fa0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74  >zFilename, nPat
13fb0 68 6e 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70 79  hname);.  memcpy
13fc0 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  (&pPager->zJourn
13fd0 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
13fe0 2d 6a 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a 20  -journal", 9);. 
13ff0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
14000 7a 53 74 6d 74 4a 72 6e 6c 2c 20 70 50 61 67 65  zStmtJrnl, pPage
14010 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  r->zFilename, nP
14020 61 74 68 6e 61 6d 65 29 3b 0a 20 20 6d 65 6d 63  athname);.  memc
14030 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 53 74 6d  py(&pPager->zStm
14040 74 4a 72 6e 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  tJrnl[nPathname]
14050 2c 20 22 2d 73 74 6d 74 6a 72 6e 6c 22 2c 20 31  , "-stmtjrnl", 1
14060 30 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 72  0);..  /* pPager
14070 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
14080 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
14090 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65  useJournal = use
140a0 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44  Journal && !memD
140b0 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52  b;.  pPager->noR
140c0 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64  eadlock = noRead
140d0 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79  lock && readOnly
140e0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
140f0 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  tmtOpen = 0; */.
14100 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
14110 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20  tInUse = 0; */. 
14120 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   /* pPager->nRef
14130 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
14140 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44  r->dbSize = memD
14150 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  b-1;.  pPager->p
14160 61 67 65 53 69 7a 65 20 3d 20 6e 44 65 66 61 75  ageSize = nDefau
14170 6c 74 50 61 67 65 3b 0a 20 20 2f 2a 20 70 50 61  ltPage;.  /* pPa
14180 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
14190 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
141a0 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30  r->stmtJSize = 0
141b0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
141c0 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  ->nPage = 0; */.
141d0 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
141e0 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65 72   = 100;.  pPager
141f0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54  ->mxPgno = SQLIT
14200 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54  E_MAX_PAGE_COUNT
14210 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
14220 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
14230 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74  OCK; */.  assert
14240 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ( pPager->state 
14250 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50  == (tempFile ? P
14260 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a  AGER_EXCLUSIVE :
14270 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29   PAGER_UNLOCK) )
14280 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  ;.  /* pPager->e
14290 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20  rrMask = 0; */. 
142a0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
142b0 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20  e = tempFile;.  
142c0 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65  assert( tempFile
142d0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
142e0 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20  ODE_NORMAL .    
142f0 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c        || tempFil
14300 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
14310 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
14320 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
14330 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
14340 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20  CLUSIVE==1 );.  
14350 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
14360 65 4d 6f 64 65 20 3d 20 74 65 6d 70 46 69 6c 65  eMode = tempFile
14370 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ; .  pPager->mem
14380 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50  Db = memDb;.  pP
14390 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
143a0 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20   readOnly;.  /* 
143b0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
143c0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
143d0 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
143e0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20  er->tempFile || 
143f0 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  !useJournal;.  p
14400 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
14410 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = (pPager->noSyn
14420 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65 72  c?0:1);.  pPager
14430 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53  ->sync_flags = S
14440 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
14450 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  L;.  /* pPager->
14460 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  pFirst = 0; */. 
14470 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
14480 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f  stSynced = 0; */
14490 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c  .  /* pPager->pL
144a0 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ast = 0; */.  pP
144b0 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46  ager->nExtra = F
144c0 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e  ORCE_ALIGNMENT(n
144d0 45 78 74 72 61 29 3b 0a 20 20 61 73 73 65 72 74  Extra);.  assert
144e0 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
144f0 74 68 6f 64 73 7c 7c 6d 65 6d 44 62 7c 7c 74 65  thods||memDb||te
14500 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  mpFile);.  if( !
14510 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 65 74  memDb ){.    set
14520 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
14530 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  r);.  }.  /* pPa
14540 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
14550 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d  r = 0; */.  /* m
14560 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48  emset(pPager->aH
14570 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ash, 0, sizeof(p
14580 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20  Pager->aHash)); 
14590 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
145a0 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66 20 53  pPager;.#ifdef S
145b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
145c0 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
145d0 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d   pPager->iInUseM
145e0 4d 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  M = 0;.  pPager-
145f0 3e 69 49 6e 55 73 65 44 42 20 3d 20 30 3b 0a 20  >iInUseDB = 0;. 
14600 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20   if( !memDb ){. 
14610 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
14620 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65   *mutex = sqlite
14630 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
14640 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
14650 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20 73 71 6c  C_MEM2);.    sql
14660 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
14670 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 50 61  (mutex);.    pPa
14680 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20 73 71 6c  ger->pNext = sql
14690 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 0a 20  ite3PagerList;. 
146a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
146b0 67 65 72 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  gerList ){.     
146c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
146d0 50 61 67 65 72 4c 69 73 74 2d 3e 70 50 72 65 76  PagerList->pPrev
146e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
146f0 69 74 65 33 50 61 67 65 72 4c 69 73 74 2d 3e 70  ite3PagerList->p
14700 50 72 65 76 20 3d 20 70 50 61 67 65 72 3b 0a 20  Prev = pPager;. 
14710 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
14720 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
14730 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74  sqlite3PagerList
14740 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 73   = pPager;.    s
14750 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14760 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23  ve(mutex);.  }.#
14770 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
14780 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
14790 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
147a0 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
147b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
147c0 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
147d0 64 6c 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  dler(Pager *pPag
147e0 65 72 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20  er, BusyHandler 
147f0 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a  *pBusyHandler){.
14800 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
14810 61 6e 64 6c 65 72 20 3d 20 70 42 75 73 79 48 61  andler = pBusyHa
14820 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndler;.}../*.** 
14830 53 65 74 20 74 68 65 20 64 65 73 74 72 75 63 74  Set the destruct
14840 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  or for this page
14850 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
14860 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
14870 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65  is called.** whe
14880 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  n the reference 
14890 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61  count on each pa
148a0 67 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  ge reaches zero.
148b0 20 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72    The destructor
148c0 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20   can.** be used 
148d0 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f  to clean up info
148e0 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65  rmation in the e
148f0 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70  xtra segment app
14900 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70 61  ended to each pa
14910 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ge..**.** The de
14920 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20  structor is not 
14930 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75  called as a resu
14940 6c 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  lt sqlite3PagerC
14950 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73  lose().  .** Des
14960 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c  tructors are onl
14970 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69  y called by sqli
14980 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e  te3PagerUnref().
14990 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
149a0 50 61 67 65 72 53 65 74 44 65 73 74 72 75 63 74  PagerSetDestruct
149b0 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
149c0 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28  , void (*xDesc)(
149d0 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20  DbPage*,int)){. 
149e0 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
149f0 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a  ctor = xDesc;.}.
14a00 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72  ./*.** Set the r
14a10 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72  einitializer for
14a20 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
14a30 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72   not NULL, the r
14a40 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20  einitializer.** 
14a50 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
14a60 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
14a70 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73  page in cache is
14a80 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
14a90 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c   original.** val
14aa0 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ue as a result o
14ab0 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  f a rollback.  T
14ac0 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65  he callback give
14ad0 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63  s higher-level c
14ae0 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74  ode.** an opport
14af0 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65  unity to restore
14b00 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69   the EXTRA secti
14b10 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  on to agree with
14b20 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a   the restored.**
14b30 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76   page data..*/.v
14b40 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
14b50 53 65 74 52 65 69 6e 69 74 65 72 28 50 61 67 65  SetReiniter(Page
14b60 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
14b70 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67  (*xReinit)(DbPag
14b80 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  e*,int)){.  pPag
14b90 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
14ba0 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  xReinit;.}../*.*
14bb0 2a 20 53 65 74 20 74 68 65 20 70 61 67 65 20 73  * Set the page s
14bc0 69 7a 65 20 74 6f 20 2a 70 50 61 67 65 53 69 7a  ize to *pPageSiz
14bd0 65 2e 20 49 66 20 74 68 65 20 73 75 67 67 65 73  e. If the sugges
14be0 74 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  t new page size 
14bf0 69 73 0a 2a 2a 20 69 6e 61 70 70 72 6f 70 72 69  is.** inappropri
14c00 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74  ate, then an alt
14c10 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73 69  ernative page si
14c20 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 61  ze is set to tha
14c30 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65 66 6f 72  t.** value befor
14c40 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
14c50 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
14c60 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
14c70 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a  r *pPager, u16 *
14c80 70 50 61 67 65 53 69 7a 65 29 7b 0a 20 20 69 6e  pPageSize){.  in
14c90 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14ca0 3b 0a 20 20 75 31 36 20 70 61 67 65 53 69 7a 65  ;.  u16 pageSize
14cb0 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20   = *pPageSize;. 
14cc0 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
14cd0 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a  e==0 || (pageSiz
14ce0 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
14cf0 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
14d00 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69  AGE_SIZE) );.  i
14d10 66 28 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  f( pageSize && p
14d20 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d  ageSize!=pPager-
14d30 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20 26 26  >pageSize .   &&
14d40 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
14d50 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  && pPager->nRef=
14d60 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61  =0 .  ){.    cha
14d70 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 20  r *pNew = (char 
14d80 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
14d90 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  (pageSize);.    
14da0 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20  if( !pNew ){.   
14db0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
14dc0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
14dd0 0a 20 20 20 20 20 20 70 61 67 65 72 45 6e 74 65  .      pagerEnte
14de0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
14df0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
14e00 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ger);.      pPag
14e10 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
14e20 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 73  ageSize;.      s
14e30 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
14e40 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
14e50 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
14e60 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
14e70 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
14e80 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pace = pNew;.   
14e90 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50     pagerLeave(pP
14ea0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
14eb0 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20  .  *pPageSize = 
14ec0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14ed0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14ee0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
14ef0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
14f00 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22  "temporary page"
14f10 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74   buffer held int
14f20 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68  ernally.** by th
14f30 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69  e pager.  This i
14f40 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20  s a buffer that 
14f50 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  is big enough to
14f60 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74   hold the.** ent
14f70 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  ire content of a
14f80 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
14f90 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20   This buffer is 
14fa0 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  used internally.
14fb0 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ** during rollba
14fc0 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f  ck and will be o
14fd0 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65  verwritten whene
14fe0 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ver a rollback.*
14ff0 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f  * occurs.  But o
15000 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65  ther modules are
15010 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20   free to use it 
15020 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a  too, as long as.
15030 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20  ** no rollbacks 
15040 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a  are happening..*
15050 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
15060 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61  agerTempSpace(Pa
15070 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
15080 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
15090 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a  TmpSpace;.}../*.
150a0 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
150b0 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61  t the maximum da
150c0 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
150d0 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  t if mxPage is p
150e0 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b  ositive. .** Mak
150f0 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20  e no changes if 
15100 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f  mxPage is zero o
15110 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64  r negative.  And
15120 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68   never reduce th
15130 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67  e.** maximum pag
15140 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68  e count below th
15150 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
15160 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
15170 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  **.** Regardless
15180 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
15190 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  rn the current m
151a0 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
151b0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
151c0 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
151d0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
151e0 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
151f0 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b   if( mxPage>0 ){
15200 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
15210 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  gno = mxPage;.  
15220 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
15230 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
15240 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  );.  return pPag
15250 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f  er->mxPgno;.}../
15260 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
15270 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  ng set of routin
15280 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  es are used to d
15290 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c  isable the simul
152a0 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f  ated.** I/O erro
152b0 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68  r mechanism.  Th
152c0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
152d0 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73   used to avoid s
152e0 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f  imulated.** erro
152f0 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65  rs in places whe
15300 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  re we do not car
15310 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a  e about errors..
15320 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53  **.** Unless -DS
15330 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20  QLITE_TEST=1 is 
15340 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74  used, these rout
15350 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d  ines are all no-
15360 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  ops.** and gener
15370 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a  ate no code..*/.
15380 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
15390 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  ST.extern int sq
153a0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
153b0 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69  ending;.extern i
153c0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
153d0 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20  ror_hit;.static 
153e0 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76  int saved_cnt;.v
153f0 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  oid disable_simu
15400 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
15410 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63  void){.  saved_c
15420 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  nt = sqlite3_io_
15430 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
15440 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
15450 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
15460 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69  }.void enable_si
15470 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
15480 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  s(void){.  sqlit
15490 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
154a0 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b  ing = saved_cnt;
154b0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
154c0 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  e disable_simula
154d0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
154e0 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f  # define enable_
154f0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
15500 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ors().#endif../*
15510 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
15520 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
15530 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
15540 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
15550 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
15560 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a  est points to. .
15570 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63  **.** No error c
15580 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e  hecking is done.
15590 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f   The rational fo
155a0 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74  r this is that t
155b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
155c0 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65   may be called e
155d0 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20  ven if the file 
155e0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f  does not exist o
155f0 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64  r contain a head
15600 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65  er. In .** these
15610 20 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73   cases sqlite3Os
15620 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75  Read() will retu
15630 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20  rn an error, to 
15640 77 68 69 63 68 20 74 68 65 20 63 6f 72 72 65 63  which the correc
15650 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69  t .** response i
15660 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65  s to zero the me
15670 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20 61 6e  mory at pDest an
15680 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72  d continue.  A r
15690 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a  eal IO error .**
156a0 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79   will presumably
156b0 20 72 65 63 75 72 20 61 6e 64 20 62 65 20 70 69   recur and be pi
156c0 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28 54  cked up later (T
156d0 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74  odo: Think about
156e0 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73   this)..*/.int s
156f0 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
15700 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
15710 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
15720 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
15730 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
15740 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
15750 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
15760 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 4d 45 4d  N);.  assert(MEM
15770 44 42 7c 7c 70 50 61 67 65 72 2d 3e 66 64 2d 3e  DB||pPager->fd->
15780 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72  pMethods||pPager
15790 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69  ->tempFile);.  i
157a0 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  f( pPager->fd->p
157b0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 49  Methods ){.    I
157c0 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25  OTRACE(("DBHDR %
157d0 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  p 0 %d\n", pPage
157e0 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20  r, N)).    rc = 
157f0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
15800 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c  ager->fd, pDest,
15810 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   N, 0);.    if( 
15820 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
15830 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
15840 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15850 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
15860 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15870 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
15880 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
15890 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73  pages in the dis
158a0 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  k file associate
158b0 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72  d with.** pPager
158c0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
158d0 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65  PENDING_BYTE lie
158e0 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69  s on the page di
158f0 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68 65  rectly after the
15900 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66   end of the.** f
15910 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64  ile, then consid
15920 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61 72  er this page par
15930 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  t of the file to
15940 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  o. For example, 
15950 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59  if.** PENDING_BY
15960 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36 20  TE is byte 4096 
15970 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
15980 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20 74  of page 5) and t
15990 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
159a0 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20 62  * file is 4096 b
159b0 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75 72  ytes, 5 is retur
159c0 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34  ned instead of 4
159d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
159e0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  PagerPagecount(P
159f0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
15a00 20 69 36 34 20 6e 20 3d 20 30 3b 0a 20 20 69 6e   i64 n = 0;.  in
15a10 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
15a20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69  pPager!=0 );.  i
15a30 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
15a40 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
15a50 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
15a60 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
15a70 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65  ){.    n = pPage
15a80 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65  r->dbSize;.  } e
15a90 6c 73 65 20 7b 0a 20 20 20 20 61 73 73 65 72 74  lse {.    assert
15aa0 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
15ab0 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74  thods||pPager->t
15ac0 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  empFile);.    if
15ad0 28 20 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  ( (pPager->fd->p
15ae0 4d 65 74 68 6f 64 73 29 0a 20 20 20 20 20 26 26  Methods).     &&
15af0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
15b00 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
15b10 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54  >fd, &n))!=SQLIT
15b20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
15b30 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
15b40 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
15b50 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
15b60 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d     pPager->nRef-
15b70 2d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  -;.      return 
15b80 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
15b90 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72   n>0 && n<pPager
15ba0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
15bb0 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d      n = 1;.    }
15bc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d  else{.      n /=
15bd0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
15be0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
15bf0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
15c00 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
15c10 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
15c20 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a  Size = n;.    }.
15c30 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45    }.  if( n==(PE
15c40 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65  NDING_BYTE/pPage
15c50 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a  r->pageSize) ){.
15c60 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69      n++;.  }.  i
15c70 66 28 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50  f( n>pPager->mxP
15c80 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
15c90 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20  r->mxPgno = n;. 
15ca0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
15cb0 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
15cc0 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
15cd0 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67  /*.** Clear a Pg
15ce0 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f  History block.*/
15cf0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65  .static void cle
15d00 61 72 48 69 73 74 6f 72 79 28 50 67 48 69 73 74  arHistory(PgHist
15d10 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73  ory *pHist){.  s
15d20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69 73  qlite3_free(pHis
15d30 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c  t->pOrig);.  sql
15d40 69 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d  ite3_free(pHist-
15d50 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74  >pStmt);.  pHist
15d60 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70  ->pOrig = 0;.  p
15d70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
15d80 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
15d90 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 78 29   clearHistory(x)
15da0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
15db0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
15dc0 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
15dd0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
15de0 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  er*);../*.** Unl
15df0 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27  ink pPg from it'
15e00 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c  s hash chain. Al
15e10 73 6f 20 73 65 74 20 74 68 65 20 70 61 67 65 20  so set the page 
15e20 6e 75 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69  number to 0 to i
15e30 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20  ndicate.** that 
15e40 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
15e50 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68  part of any hash
15e60 20 63 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20   chain. This is 
15e70 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65  required because
15e80 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50   the.** sqlite3P
15e90 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 20 72  agerMovepage() r
15ea0 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65 61 76 65  outine can leave
15eb0 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a   a page in the .
15ec0 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f 70 50 72  ** pNextFree/pPr
15ed0 65 76 46 72 65 65 20 6c 69 73 74 20 74 68 61 74  evFree list that
15ee0 20 69 73 20 6e 6f 74 20 61 20 70 61 72 74 20 6f   is not a part o
15ef0 66 20 61 6e 79 20 68 61 73 68 2d 63 68 61 69 6e  f any hash-chain
15f00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15f10 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
15f20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
15f30 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
15f40 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20  f( pPg->pgno==0 
15f50 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15f60 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30  Pg->pNextHash==0
15f70 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61   && pPg->pPrevHa
15f80 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  sh==0 );.    ret
15f90 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
15fa0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
15fb0 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
15fc0 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
15fd0 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b   pPg->pPrevHash;
15fe0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
15ff0 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20  pPrevHash ){.   
16000 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16010 3e 61 48 61 73 68 5b 70 50 67 2d 3e 70 67 6e 6f  >aHash[pPg->pgno
16020 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
16030 68 2d 31 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20  h-1)]!=pPg );.  
16040 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
16050 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
16060 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
16070 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68  }else{.    int h
16080 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28   = pPg->pgno & (
16090 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
160a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
160b0 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e  ash[h] = pPg->pN
160c0 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69  extHash;.  }.  i
160d0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
160e0 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48  clearHistory(PGH
160f0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
16100 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20  pPager));.  }.  
16110 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20  pPg->pgno = 0;. 
16120 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
16130 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
16140 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   = 0;.}../*.** U
16150 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66 72 6f  nlink a page fro
16160 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20  m the free list 
16170 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c  (the list of all
16180 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52 65   pages where nRe
16190 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f  f==0).** and fro
161a0 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c 6c 69  m its hash colli
161b0 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73  sion chain..*/.s
161c0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e  tatic void unlin
161d0 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
161e0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
161f0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
16200 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66  ;..  /* Unlink f
16210 72 6f 6d 20 66 72 65 65 20 70 61 67 65 20 6c 69  rom free page li
16220 73 74 20 2a 2f 0a 20 20 6c 72 75 4c 69 73 74 52  st */.  lruListR
16230 65 6d 6f 76 65 28 70 50 67 29 3b 0a 0a 20 20 2f  emove(pPg);..  /
16240 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68  * Unlink from th
16250 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c  e pgno hash tabl
16260 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73  e */.  unlinkHas
16270 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
16280 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Pg);.}../*.** Th
16290 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
162a0 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  ed to truncate t
162b0 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 61 20  he cache when a 
162c0 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20 74  database.** is t
162d0 72 75 6e 63 61 74 65 64 2e 20 20 44 72 6f 70 20  runcated.  Drop 
162e0 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 61  from the cache a
162f0 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20 70  ll pages whose p
16300 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72 67 65 72  gno is.** larger
16310 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
16320 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65  Size and is unre
16330 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  ferenced..**.** 
16340 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73  Referenced pages
16350 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61   larger than pPa
16360 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20  ger->dbSize are 
16370 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 63  zeroed..**.** Ac
16380 74 75 61 6c 6c 79 2c 20 61 74 20 74 68 65 20 70  tually, at the p
16390 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74 69 6e  oint this routin
163a0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  e is called, it 
163b0 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 6e 20 65  would be.** an e
163c0 72 72 6f 72 20 74 6f 20 68 61 76 65 20 61 20 72  rror to have a r
163d0 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 2e 20  eferenced page. 
163e0 20 42 75 74 20 72 61 74 68 65 72 20 74 68 61 6e   But rather than
163f0 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68 61 74 20   delete.** that 
16400 70 61 67 65 20 61 6e 64 20 67 75 61 72 61 6e 74  page and guarant
16410 65 65 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  ee a subsequent 
16420 73 65 67 66 61 75 6c 74 2c 20 69 74 20 73 65 65  segfault, it see
16430 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20 74 6f 20  ms better.** to 
16440 7a 65 72 6f 20 69 74 20 61 6e 64 20 68 6f 70 65  zero it and hope
16450 20 74 68 61 74 20 77 65 20 65 72 72 6f 72 20 6f   that we error o
16460 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f 0a 73 74  ut sanely..*/.st
16470 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
16480 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50  truncate_cache(P
16490 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
164a0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50   PgHdr *pPg;.  P
164b0 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69  gHdr **ppPg;.  i
164c0 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67  nt dbSize = pPag
164d0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70  er->dbSize;..  p
164e0 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70  pPg = &pPager->p
164f0 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  All;.  while( (p
16500 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29  Pg = *ppPg)!=0 )
16510 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  {.    if( pPg->p
16520 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20  gno<=dbSize ){. 
16530 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67       ppPg = &pPg
16540 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
16550 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e  }else if( pPg->n
16560 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d  Ref>0 ){.      m
16570 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
16580 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61  ATA(pPg), 0, pPa
16590 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
165a0 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50        ppPg = &pP
165b0 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
165c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
165d0 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  pPg = pPg->pNext
165e0 41 6c 6c 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  All;.      IOTRA
165f0 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20 25  CE(("PGFREE %p %
16600 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
16610 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  g->pgno));.     
16620 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
16630 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65  te3_pager_pgfree
16640 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 75  _count);.      u
16650 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a  nlinkPage(pPg);.
16660 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28        makeClean(
16670 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pPg);.      sqli
16680 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a 20  te3_free(pPg);. 
16690 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61       pPager->nPa
166a0 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ge--;.    }.  }.
166b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
166c0 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e  obtain a lock on
166d0 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65   a file.  Invoke
166e0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
166f0 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a  ck if the lock.*
16700 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  * is currently n
16710 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52  ot available.  R
16720 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20  epeat until the 
16730 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
16740 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f  turns.** false o
16750 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b  r until the lock
16760 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
16770 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
16780 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
16790 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
167a0 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
167b0 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a  in.** the lock..
167c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
167d0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
167e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
167f0 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
16800 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
16810 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65  he OS lock value
16820 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  s must be the sa
16830 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20  me as the Pager 
16840 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20  lock values */. 
16850 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53   assert( PAGER_S
16860 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f  HARED==SHARED_LO
16870 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
16880 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d  PAGER_RESERVED==
16890 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
168a0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
168b0 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c  _EXCLUSIVE==EXCL
168c0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  USIVE_LOCK );.. 
168d0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
168e0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c  is currently unl
168f0 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73  ocked then the s
16900 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e  ize must be unkn
16910 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  own */.  assert(
16920 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
16930 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
16940 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30  pPager->dbSize<0
16950 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20   || MEMDB );..  
16960 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
16970 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
16980 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
16990 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
169a0 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  do {.      rc = 
169b0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
169c0 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79  ager->fd, lockty
169d0 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  pe);.    }while(
169e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
169f0 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b   && sqlite3Invok
16a00 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61  eBusyHandler(pPa
16a10 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
16a20 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  r) );.    if( rc
16a30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16a40 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
16a50 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  te = locktype;. 
16a60 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
16a70 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
16a80 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29  ager, locktype))
16a90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
16aa0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16ab0 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   Truncate the fi
16ac0 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  le to the number
16ad0 20 6f 66 20 70 61 67 65 73 20 73 70 65 63 69 66   of pages specif
16ae0 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ied..*/.int sqli
16af0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
16b00 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
16b10 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
16b20 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
16b30 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
16b40 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
16b50 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c 69 74  MEMDB );.  sqlit
16b60 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
16b70 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
16b80 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
16b90 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
16ba0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
16bb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
16bc0 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e    if( nPage>=(un
16bd0 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64  signed)pPager->d
16be0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
16bf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16c00 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29   }.  if( MEMDB )
16c10 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
16c20 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
16c30 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
16c40 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
16c50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16c60 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 61 67 65  E_OK;.  }.  page
16c70 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
16c80 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
16c90 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61  al(pPager);.  pa
16ca0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
16cb0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
16cc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
16cd0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
16ce0 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69  * Get an exclusi
16cf0 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
16d00 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
16d10 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20  runcating. */.  
16d20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
16d30 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  r);.  rc = pager
16d40 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
16d50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
16d60 4c 4f 43 4b 29 3b 0a 20 20 70 61 67 65 72 4c 65  LOCK);.  pagerLe
16d70 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ave(pPager);.  i
16d80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16d90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
16da0 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70  c;.  }..  rc = p
16db0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
16dc0 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20  ager, nPage);.  
16dd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16de0 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
16df0 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
16e00 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
16e10 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
16e20 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
16e30 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
16e40 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
16e50 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
16e60 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
16e70 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
16e80 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
16e90 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
16ea0 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
16eb0 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
16ec0 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
16ed0 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
16ee0 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
16ef0 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
16f00 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
16f10 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
16f20 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
16f30 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
16f40 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
16f50 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
16f60 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  on always succee
16f70 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  ds. If a transac
16f80 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
16f90 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20  n attempt.** is 
16fa0 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  made to roll it 
16fb0 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f  back. If an erro
16fc0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
16fd0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a  the rollback .**
16fe0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d   a hot journal m
16ff0 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ay be left in th
17000 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74  e filesystem but
17010 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74   no error is ret
17020 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  urned.** to the 
17030 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  caller..*/.int s
17040 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
17050 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
17060 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
17070 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
17080 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 4d  AGEMENT.  if( !M
17090 45 4d 44 42 20 29 7b 0a 20 20 20 20 73 71 6c 69  EMDB ){.    sqli
170a0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
170b0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
170c0 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
170d0 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29  TEX_STATIC_MEM2)
170e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
170f0 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29  tex_enter(mutex)
17100 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
17110 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
17120 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 2d 3e   pPager->pPrev->
17130 70 4e 65 78 74 20 3d 20 70 50 61 67 65 72 2d 3e  pNext = pPager->
17140 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
17150 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
17160 61 67 65 72 4c 69 73 74 20 3d 20 70 50 61 67 65  agerList = pPage
17170 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
17180 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17190 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  pNext ){.      p
171a0 50 61 67 65 72 2d 3e 70 4e 65 78 74 2d 3e 70 50  Pager->pNext->pP
171b0 72 65 76 20 3d 20 70 50 61 67 65 72 2d 3e 70 50  rev = pPager->pP
171c0 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  rev;.    }.    s
171d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
171e0 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23  ve(mutex);.  }.#
171f0 65 6e 64 69 66 0a 0a 20 20 64 69 73 61 62 6c 65  endif..  disable
17200 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
17210 72 6f 72 73 28 29 3b 0a 20 20 70 50 61 67 65 72  rors();.  pPager
17220 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
17230 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
17240 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61  veMode = 0;.  pa
17250 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
17260 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  );.  pagerUnlock
17270 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
17280 65 72 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69  er);.  enable_si
17290 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
172a0 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  s();.  PAGERTRAC
172b0 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E2("CLOSE %d\n",
172c0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
172d0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43  );.  IOTRACE(("C
172e0 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOSE %p\n", pPag
172f0 65 72 29 29 0a 20 20 61 73 73 65 72 74 28 20 70  er)).  assert( p
17300 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c  Pager->errCode |
17310 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | (pPager->journ
17320 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50 61  alOpen==0 && pPa
17330 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30  ger->stmtOpen==0
17340 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
17350 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
17360 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
17370 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
17380 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
17390 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  _free(pPager->aI
173a0 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  nJournal);.  if(
173b0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
173c0 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
173d0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
173e0 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  stfd);.  }.  sql
173f0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
17400 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65  er->fd);.  /* Te
17410 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74  mp files are aut
17420 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
17430 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a  ed by the OS.  *
17440 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65  * if( pPager->te
17450 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20  mpFile ){.  **  
17460 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
17470 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
17480 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f  me);.  ** }.  */
17490 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
174a0 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b  (pPager->aHash);
174b0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
174c0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
174d0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
174e0 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ee(pPager);.  re
174f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17500 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
17510 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  NDEBUG) || defin
17520 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
17530 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
17540 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
17550 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
17560 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71  data..*/.Pgno sq
17570 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
17580 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b  mber(DbPage *p){
17590 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e  .  return p->pgn
175a0 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  o;.}.#endif../*.
175b0 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28  ** The page_ref(
175c0 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65  ) function incre
175d0 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65  ments the refere
175e0 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
175f0 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20  page..** If the 
17600 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c  page is currentl
17610 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  y on the freelis
17620 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65  t (the reference
17630 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20   count is zero) 
17640 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69  then.** remove i
17650 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  t from the freel
17660 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e  ist..**.** For n
17670 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c  on-test systems,
17680 20 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61   page_ref() is a
17690 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c   macro that call
176a0 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a  s _page_ref().**
176b0 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72   online of the r
176c0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
176d0 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73  s zero.  For tes
176e0 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f  t systems, page_
176f0 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65  ref().** is a re
17700 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74  al function so t
17710 68 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62  hat we can set b
17720 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74  reakpoints and t
17730 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  race it..*/.stat
17740 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65  ic void _page_re
17750 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  f(PgHdr *pPg){. 
17760 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
17770 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
17780 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c  page is currentl
17790 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  y on the freelis
177a0 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a  t.  Remove it. *
177b0 2f 0a 20 20 20 20 6c 72 75 4c 69 73 74 52 65 6d  /.    lruListRem
177c0 6f 76 65 28 70 50 67 29 3b 0a 20 20 20 20 70 50  ove(pPg);.    pP
177d0 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b  g->pPager->nRef+
177e0 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52  +;.  }.  pPg->nR
177f0 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28  ef++;.  REFINFO(
17800 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53  pPg);.}.#ifdef S
17810 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 74  QLITE_DEBUG.  st
17820 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72  atic void page_r
17830 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ef(PgHdr *pPg){.
17840 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65      if( pPg->nRe
17850 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f 70  f==0 ){.      _p
17860 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
17870 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
17880 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Pg->nRef++;.    
17890 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
178a0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
178b0 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72 65  # define page_re
178c0 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52 65  f(P)   ((P)->nRe
178d0 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28 50  f==0?_page_ref(P
178e0 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65  ):(void)(P)->nRe
178f0 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  f++).#endif../*.
17900 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
17910 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
17920 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68   for a page.  Th
17930 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20  e input pointer 
17940 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  is.** a referenc
17950 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 61  e to the page da
17960 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ta..*/.int sqlit
17970 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67  e3PagerRef(DbPag
17980 65 20 2a 70 50 67 29 7b 0a 20 20 70 61 67 65 72  e *pPg){.  pager
17990 45 6e 74 65 72 28 70 50 67 2d 3e 70 50 61 67 65  Enter(pPg->pPage
179a0 72 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70  r);.  page_ref(p
179b0 50 67 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  Pg);.  pagerLeav
179c0 65 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pPg->pPager);.
179d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
179e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
179f0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  c the journal.  
17a00 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
17a10 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  make sure all th
17a20 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  e pages that hav
17a30 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65  e.** been writte
17a40 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
17a50 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72   have actually r
17a60 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61  eached the surfa
17a70 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73  ce of the.** dis
17a80 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61  k.  It is not sa
17a90 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  fe to modify the
17aa0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
17ab0 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66  se file until af
17ac0 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ter.** the journ
17ad0 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  al has been sync
17ae0 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67  ed.  If the orig
17af0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  inal database is
17b00 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65   modified before
17b10 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
17b20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20  is synced and a 
17b30 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
17b40 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63  curs, the unsync
17b50 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61  ed journal.** da
17b60 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74  ta would be lost
17b70 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65   and we would be
17b80 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c   unable to compl
17b90 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74  etely rollback t
17ba0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
17bb0 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73  hanges.  Databas
17bc0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75  e corruption wou
17bd0 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a  ld occur..** .**
17be0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
17bf0 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20 6e  so updates the n
17c00 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65  Rec field in the
17c10 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a   header of the j
17c20 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20  ournal..** (See 
17c30 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20  comments on the 
17c40 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
17c50 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64   routine for add
17c60 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
17c70 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20  ion.).** If the 
17c80 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c  sync mode is FUL
17c90 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c  L, two syncs wil
17ca0 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20  l occur.  First 
17cb0 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61  the whole journa
17cc0 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20  l.** is synced, 
17cd0 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
17ce0 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20  eld is updated, 
17cf0 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79  then a second sy
17d00 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
17d10 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64   For temporary d
17d20 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20  atabases, we do 
17d30 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20 61  not care if we a
17d40 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  re able to rollb
17d50 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70  ack.** after a p
17d60 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f  ower failure, so
17d70 20 6e 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e   no sync occurs.
17d80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4f  .**.** If the IO
17d90 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 66  CAP_SEQUENTIAL f
17da0 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 74  lag is set for t
17db0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
17dc0 64 69 61 20 6f 6e 20 77 68 69 63 68 0a 2a 2a 20  dia on which.** 
17dd0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
17de0 73 74 6f 72 65 64 2c 20 74 68 65 6e 20 4f 73 53  stored, then OsS
17df0 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
17e00 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  alled on the jou
17e10 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49 6e  rnal.** file. In
17e20 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 74   this case all t
17e30 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20  hat is required 
17e40 69 73 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  is to update the
17e50 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 0a 2a   nRec field in.*
17e60 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * the journal he
17e70 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ader..**.** This
17e80 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
17e90 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65  the needSync fie
17ea0 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  ld of every page
17eb0 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e   current held in
17ec0 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  .** memory..*/.s
17ed0 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
17ee0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
17ef0 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
17f00 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
17f10 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a  QLITE_OK;...  /*
17f20 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
17f30 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69  l before modifyi
17f40 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ng the main data
17f50 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d  base.  ** (assum
17f60 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a  ing there is a j
17f70 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65  ournal and it ne
17f80 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eds to be synced
17f90 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  .).  */.  if( pP
17fa0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
17fb0 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
17fc0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
17fd0 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
17fe0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
17ff0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
18000 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
18010 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18020 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
18030 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74  .      /* assert
18040 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
18050 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d  c ); // noSync m
18060 69 67 68 74 20 62 65 20 73 65 74 20 69 66 20 73  ight be set if s
18070 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20  ynchronous.     
18080 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f   ** was turned o
18090 66 66 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ff after the tra
180a0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61  nsaction was sta
180b0 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36  rted.  Ticket #6
180c0 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  15 */.#ifndef ND
180d0 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20  EBUG.      {.   
180e0 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
180f0 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52  e the pPager->nR
18100 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72  ec counter we ar
18110 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73  e keeping agrees
18120 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68  .        ** with
18130 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74   the nRec comput
18140 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ed from the size
18150 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
18160 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
18170 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a  .        i64 jSz
18180 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
18190 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
181a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
181b0 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Sz);.        if(
181c0 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
181d0 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rc;.        asse
181e0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
181f0 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20  nalOff==jSz );. 
18200 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
18210 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
18220 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
18230 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
18240 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
18250 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
18260 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
18270 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
18280 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
18290 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
182a0 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
182b0 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
182c0 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
182d0 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
182e0 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
182f0 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
18300 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
18310 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
18320 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
18330 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
18340 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
18350 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
18360 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66   not required if
18370 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
18380 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74  media supports t
18390 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41  he.        ** SA
183a0 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
183b0 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74  ty. Because in t
183c0 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
183d0 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20  ot possible .   
183e0 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62       ** for garb
183f0 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61  age data to be a
18400 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66  ppended to the f
18410 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69  ile, the nRec fi
18420 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  eld.        ** i
18430 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
18440 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e   0xFFFFFFFF when
18450 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
18460 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20  der is written. 
18470 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65         ** and ne
18480 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
18490 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20  updated..       
184a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
184b0 6a 72 6e 6c 4f 66 66 3b 0a 20 20 20 20 20 20 20  jrnlOff;.       
184c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
184d0 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63  lSync && 0==(iDc
184e0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
184f0 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
18500 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
18510 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E2("SYNC journal
18520 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
18530 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
18540 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
18550 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
18560 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20  ager)).         
18570 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
18580 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
18590 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
185a0 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ags);.          
185b0 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
185c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
185d0 0a 0a 20 20 20 20 20 20 20 20 6a 72 6e 6c 4f 66  ..        jrnlOf
185e0 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
185f0 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28  nalHdr + sizeof(
18600 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a  aJournalMagic);.
18610 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
18620 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
18630 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6a 72  d\n", pPager, jr
18640 6e 6c 4f 66 66 2c 20 34 29 29 3b 0a 20 20 20 20  nlOff, 4));.    
18650 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
18660 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
18670 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 50 61 67 65  , jrnlOff, pPage
18680 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20  r->nRec);.      
18690 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
186a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
186b0 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
186c0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
186d0 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
186e0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
186f0 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
18700 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
18710 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
18720 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
18730 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
18740 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ).        rc = s
18750 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
18760 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
18770 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20  ->sync_flags| . 
18780 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
18790 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51  ->sync_flags==SQ
187a0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53  LITE_SYNC_FULL?S
187b0 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
187c0 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29  NLY:0).        )
187d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
187e0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
187f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
18800 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
18810 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  arted = 1;.    }
18820 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
18830 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20  dSync = 0;..    
18840 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65 65  /* Erase the nee
18850 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20  dSync flag from 
18860 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20  every page..    
18870 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  */.    for(pPg=p
18880 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
18890 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
188a0 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  All){.      pPg-
188b0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
188c0 20 20 20 7d 0a 20 20 20 20 6c 72 75 4c 69 73 74     }.    lruList
188d0 53 65 74 46 69 72 73 74 53 79 6e 63 65 64 28 70  SetFirstSynced(p
188e0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 23 69 66  Pager);.  }..#if
188f0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
18900 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65   If the Pager.ne
18910 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63  edSync flag is c
18920 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20 50 67  lear then the Pg
18930 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a  Hdr.needSync.  *
18940 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f  * flag must also
18950 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c   be clear for al
18960 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69 66 79  l pages.  Verify
18970 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20   that this.  ** 
18980 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72 75  invariant is tru
18990 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a  e..  */.  else{.
189a0 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
189b0 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
189c0 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
189d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
189e0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
189f0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  0 );.    }.    a
18a00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6c  ssert( pPager->l
18a10 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  ru.pFirstSynced=
18a20 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69  =pPager->lru.pFi
18a30 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rst );.  }.#endi
18a40 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
18a50 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74  }../*.** Merge t
18a60 77 6f 20 6c 69 73 74 73 20 6f 66 20 70 61 67 65  wo lists of page
18a70 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70  s connected by p
18a80 44 69 72 74 79 20 61 6e 64 20 69 6e 20 70 67 6e  Dirty and in pgn
18a90 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e  o order..** Do n
18aa0 6f 74 20 62 6f 74 68 20 66 69 78 69 6e 67 20 74  ot both fixing t
18ab0 68 65 20 70 50 72 65 76 44 69 72 74 79 20 70 6f  he pPrevDirty po
18ac0 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  inters..*/.stati
18ad0 63 20 50 67 48 64 72 20 2a 6d 65 72 67 65 5f 70  c PgHdr *merge_p
18ae0 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
18af0 41 2c 20 50 67 48 64 72 20 2a 70 42 29 7b 0a 20  A, PgHdr *pB){. 
18b00 20 50 67 48 64 72 20 72 65 73 75 6c 74 2c 20 2a   PgHdr result, *
18b10 70 54 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d  pTail;.  pTail =
18b20 20 26 72 65 73 75 6c 74 3b 0a 20 20 77 68 69 6c   &result;.  whil
18b30 65 28 20 70 41 20 26 26 20 70 42 20 29 7b 0a 20  e( pA && pB ){. 
18b40 20 20 20 69 66 28 20 70 41 2d 3e 70 67 6e 6f 3c     if( pA->pgno<
18b50 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  pB->pgno ){.    
18b60 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
18b70 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 54 61 69  = pA;.      pTai
18b80 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 41  l = pA;.      pA
18b90 20 3d 20 70 41 2d 3e 70 44 69 72 74 79 3b 0a 20   = pA->pDirty;. 
18ba0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18bb0 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
18bc0 70 42 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20  pB;.      pTail 
18bd0 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 42 20 3d  = pB;.      pB =
18be0 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   pB->pDirty;.   
18bf0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 20   }.  }.  if( pA 
18c00 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  ){.    pTail->pD
18c10 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 7d 65 6c  irty = pA;.  }el
18c20 73 65 20 69 66 28 20 70 42 20 29 7b 0a 20 20 20  se if( pB ){.   
18c30 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
18c40 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   pB;.  }else{.  
18c50 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
18c60 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
18c70 6e 20 72 65 73 75 6c 74 2e 70 44 69 72 74 79 3b  n result.pDirty;
18c80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74  .}../*.** Sort t
18c90 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  he list of pages
18ca0 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
18cb0 64 65 72 20 62 79 20 70 67 6e 6f 2e 20 20 50 61  der by pgno.  Pa
18cc0 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65  ges are.** conne
18cd0 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20 70  cted by pDirty p
18ce0 6f 69 6e 74 65 72 73 2e 20 20 54 68 65 20 70 50  ointers.  The pP
18cf0 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72  revDirty pointer
18d00 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72 75 70 74  s are.** corrupt
18d10 65 64 20 62 79 20 74 68 69 73 20 73 6f 72 74 2e  ed by this sort.
18d20 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f  .*/.#define N_SO
18d30 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 20  RT_BUCKET_ALLOC 
18d40 32 35 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52  25.#define N_SOR
18d50 54 5f 42 55 43 4b 45 54 20 20 20 20 20 20 20 32  T_BUCKET       2
18d60 35 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  5.#ifdef SQLITE_
18d70 54 45 53 54 0a 20 20 69 6e 74 20 73 71 6c 69 74  TEST.  int sqlit
18d80 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
18d90 62 75 63 6b 65 74 20 3d 20 30 3b 0a 20 20 23 75  bucket = 0;.  #u
18da0 6e 64 65 66 20 4e 5f 53 4f 52 54 5f 42 55 43 4b  ndef N_SORT_BUCK
18db0 45 54 0a 20 20 23 64 65 66 69 6e 65 20 4e 5f 53  ET.  #define N_S
18dc0 4f 52 54 5f 42 55 43 4b 45 54 20 5c 0a 20 20 20  ORT_BUCKET \.   
18dd0 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e  (sqlite3_pager_n
18de0 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3f 73 71 6c  _sort_bucket?sql
18df0 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72  ite3_pager_n_sor
18e00 74 5f 62 75 63 6b 65 74 3a 4e 5f 53 4f 52 54 5f  t_bucket:N_SORT_
18e10 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 29 0a 23 65  BUCKET_ALLOC).#e
18e20 6e 64 69 66 0a 73 74 61 74 69 63 20 50 67 48 64  ndif.static PgHd
18e30 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c 69 73 74  r *sort_pagelist
18e40 28 50 67 48 64 72 20 2a 70 49 6e 29 7b 0a 20 20  (PgHdr *pIn){.  
18e50 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f 52 54 5f  PgHdr *a[N_SORT_
18e60 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 5d 2c 20 2a  BUCKET_ALLOC], *
18e70 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65  p;.  int i;.  me
18e80 6d 73 65 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f  mset(a, 0, sizeo
18e90 66 28 61 29 29 3b 0a 20 20 77 68 69 6c 65 28 20  f(a));.  while( 
18ea0 70 49 6e 20 29 7b 0a 20 20 20 20 70 20 3d 20 70  pIn ){.    p = p
18eb0 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 2d  In;.    pIn = p-
18ec0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e  >pDirty;.    p->
18ed0 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
18ee0 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52  for(i=0; i<N_SOR
18ef0 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69 2b 2b 29  T_BUCKET-1; i++)
18f00 7b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 69 5d  {.      if( a[i]
18f10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
18f20 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  [i] = p;.       
18f30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
18f40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d  lse{.        p =
18f50 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28   merge_pagelist(
18f60 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20  a[i], p);.      
18f70 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20    a[i] = 0;.    
18f80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
18f90 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b  ( i==N_SORT_BUCK
18fa0 45 54 2d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ET-1 ){.      /*
18fb0 20 43 6f 76 65 72 61 67 65 3a 20 54 6f 20 67 65   Coverage: To ge
18fc0 74 20 68 65 72 65 2c 20 74 68 65 72 65 20 6e 65  t here, there ne
18fd0 65 64 20 74 6f 20 62 65 20 32 5e 28 4e 5f 53 4f  ed to be 2^(N_SO
18fe0 52 54 5f 42 55 43 4b 45 54 29 20 0a 20 20 20 20  RT_BUCKET) .    
18ff0 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 69 6e    ** elements in
19000 20 74 68 65 20 69 6e 70 75 74 20 6c 69 73 74 2e   the input list.
19010 20 54 68 69 73 20 69 73 20 70 6f 73 73 69 62 6c   This is possibl
19020 65 2c 20 62 75 74 20 69 6d 70 72 61 63 74 69 63  e, but impractic
19030 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 20 54 65 73  al..      ** Tes
19040 74 69 6e 67 20 74 68 69 73 20 6c 69 6e 65 20 69  ting this line i
19050 73 20 74 68 65 20 70 6f 69 6e 74 20 6f 66 20 67  s the point of g
19060 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 0a 20  lobal variable. 
19070 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f       ** sqlite3_
19080 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63  pager_n_sort_buc
19090 6b 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ket..      */.  
190a0 20 20 20 20 61 5b 69 5d 20 3d 20 6d 65 72 67 65      a[i] = merge
190b0 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20  _pagelist(a[i], 
190c0 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  p);.    }.  }.  
190d0 70 20 3d 20 61 5b 30 5d 3b 0a 20 20 66 6f 72 28  p = a[0];.  for(
190e0 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55  i=1; i<N_SORT_BU
190f0 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  CKET; i++){.    
19100 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69  p = merge_pageli
19110 73 74 28 70 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d  st(p, a[i]);.  }
19120 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
19130 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69  /*.** Given a li
19140 73 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e  st of pages (con
19150 6e 65 63 74 65 64 20 62 79 20 74 68 65 20 50 67  nected by the Pg
19160 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
19170 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65  er) write.** eve
19180 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  ry one of those 
19190 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65  pages out to the
191a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
191b0 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c  nd mark them all
191c0 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f  .** as clean..*/
191d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
191e0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
191f0 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a  (PgHdr *pList){.
19200 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
19210 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 69  .  PgHdr *p;.  i
19220 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c  nt rc;..  if( pL
19230 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
19240 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
19250 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61  ger = pList->pPa
19260 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ger;..  /* At th
19270 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d  is point there m
19280 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52  ay be either a R
19290 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
192a0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
192b0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
192c0 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
192d0 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c   already an EXCL
192e0 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20  USIVE lock, the 
192f0 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63  following.  ** c
19300 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f  alls to sqlite3O
19310 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f  sLock() are no-o
19320 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  ps..  **.  ** Mo
19330 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72  ving the lock fr
19340 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20 45  om RESERVED to E
19350 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c  XCLUSIVE actuall
19360 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67  y involves going
19370 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e  .  ** through an
19380 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
19390 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41  ate PENDING.   A
193a0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72   PENDING lock pr
193b0 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20  events new.  ** 
193c0 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74  readers from att
193d0 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  aching to the da
193e0 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75 6e  tabase but is un
193f0 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75  sufficient for u
19400 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e  s to.  ** write.
19410 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61 20    The idea of a 
19420 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
19430 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72  to prevent new r
19440 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a  eaders from.  **
19450 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65   coming in while
19460 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78 69   we wait for exi
19470 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f  sting readers to
19480 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a   clear..  **.  *
19490 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  * While the page
194a0 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53 45  r is in the RESE
194b0 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 20  RVED state, the 
194c0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
194d0 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75  e file.  ** is u
194e0 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20  nchanged and we 
194f0 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74  can rollback wit
19500 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70  hout having to p
19510 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a  layback the.  **
19520 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68   journal into th
19530 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
19540 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20  ase file.  Once 
19550 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f  we transition to
19560 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c  .  ** EXCLUSIVE,
19570 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61   it means the da
19580 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
19590 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64  been changed and
195a0 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   any rollback.  
195b0 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  ** will require 
195c0 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  a journal playba
195d0 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ck..  */.  rc = 
195e0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
195f0 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
19600 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  SIVE_LOCK);.  if
19610 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19620 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
19630 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d  ;.  }..  pList =
19640 20 73 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 70   sort_pagelist(p
19650 4c 69 73 74 29 3b 0a 20 20 66 6f 72 28 70 3d 70  List);.  for(p=p
19660 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44  List; p; p=p->pD
19670 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72  irty){.    asser
19680 74 28 20 70 2d 3e 64 69 72 74 79 20 29 3b 0a 20  t( p->dirty );. 
19690 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b     p->dirty = 0;
196a0 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 4c  .  }.  while( pL
196b0 69 73 74 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 49  ist ){..    /* I
196c0 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 6e  f the file has n
196d0 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
196e0 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
196f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
19700 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
19710 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  s ){.      asser
19720 74 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  t(pPager->tempFi
19730 6c 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  le);.      rc = 
19740 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
19750 74 65 6d 70 28 70 50 61 67 65 72 2d 3e 70 56 66  temp(pPager->pVf
19760 73 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  s, pPager->fd, p
19770 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
19780 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197a0 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61    pPager->vfsFla
197b0 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  gs);.      if( r
197c0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
197d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
197e0 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20  there are dirty 
197f0 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
19800 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67  e cache with pag
19810 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
19820 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61  r.    ** than Pa
19830 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73  ger.dbSize, this
19840 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61   means sqlite3Pa
19850 67 65 72 54 72 75 6e 63 61 74 65 28 29 20 77 61  gerTruncate() wa
19860 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20  s called to.    
19870 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
19880 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d   smaller (presum
19890 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63  ably by auto-vac
198a0 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f  uum code). Do no
198b0 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61  t write.    ** a
198c0 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f  ny such pages to
198d0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
198e0 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  /.    if( pList-
198f0 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64  >pgno<=pPager->d
19900 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  bSize ){.      i
19910 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 4c 69  64 offset = (pLi
19920 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34  st->pgno-1)*(i64
19930 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
19940 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  e;.      char *p
19950 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28 70 50  Data = CODEC2(pP
19960 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
19970 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73  ATA(pList), pLis
19980 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20  t->pgno, 6);.   
19990 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22     PAGERTRACE4("
199a0 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
199b0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
199c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199d0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
199e0 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c  r), pList->pgno,
199f0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
19a00 70 4c 69 73 74 29 29 3b 0a 20 20 20 20 20 20 49  pList));.      I
19a10 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25  OTRACE(("PGOUT %
19a20 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
19a30 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a   pList->pgno));.
19a40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19a50 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
19a60 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
19a70 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
19a80 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 50 41  ffset);.      PA
19a90 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
19aa0 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
19ab0 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47  ount);.      PAG
19ac0 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
19ad0 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 69  nWrite);.      i
19ae0 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d  f( pList->pgno==
19af0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 ){.        mem
19b00 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
19b10 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b  ileVers, &pData[
19b20 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  24], sizeof(pPag
19b30 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
19b40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19b50 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
19b60 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 50     else{.      P
19b70 41 47 45 52 54 52 41 43 45 33 28 22 4e 4f 53 54  AGERTRACE3("NOST
19b80 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
19b90 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
19ba0 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  r), pList->pgno)
19bb0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
19bc0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
19bd0 72 6e 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51  rn rc;.#ifdef SQ
19be0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
19bf0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
19c00 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
19c10 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
19c20 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
19c30 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
19c40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
19c50 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
19c60 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64   Collect every d
19c70 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61  irty page into a
19c80 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a   dirty list and.
19c90 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** return a poin
19ca0 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
19cb0 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41  of that list.  A
19cc0 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ll pages are.** 
19cd0 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69  collected even i
19ce0 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c  f they are still
19cf0 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
19d00 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
19d10 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
19d20 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ges(Pager *pPage
19d30 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
19d40 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a  ger->pDirty;.}..
19d50 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
19d60 45 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  E if there is a 
19d70 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74  hot journal on t
19d80 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
19d90 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** A hot journal
19da0 20 69 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65   is one that nee
19db0 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
19dc0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
19dd0 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
19de0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19df0 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20  file is 0 but a 
19e00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
19e10 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20  exists, that is 
19e20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20  probably an old 
19e30 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65  journal left ove
19e40 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a  r from a prior.*
19e50 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  * database with 
19e60 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
19e70 4a 75 73 74 20 64 65 6c 65 74 65 20 74 68 65 20  Just delete the 
19e80 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
19e90 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75  ic int hasHotJou
19ea0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
19eb0 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
19ec0 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
19ed0 72 2d 3e 70 56 66 73 3b 0a 20 20 69 66 28 20 21  r->pVfs;.  if( !
19ee0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
19ef0 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  al ) return 0;. 
19f00 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64   if( !pPager->fd
19f10 2d 3e 70 4d 65 74 68 6f 64 73 20 29 20 72 65 74  ->pMethods ) ret
19f20 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
19f30 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
19f40 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
19f50 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
19f60 45 53 53 5f 45 58 49 53 54 53 29 20 29 7b 0a 20  ESS_EXISTS) ){. 
19f70 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
19f80 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73  .  if( sqlite3Os
19f90 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
19fa0 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  k(pPager->fd) ){
19fb0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
19fc0 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
19fd0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
19fe0 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20  Pager)==0 ){.   
19ff0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
1a000 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
1a010 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
1a020 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
1a030 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
1a040 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
1a050 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ry to find a pag
1a060 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  e in the cache t
1a070 68 61 74 20 63 61 6e 20 62 65 20 72 65 63 79 63  hat can be recyc
1a080 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  led. .**.** This
1a090 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74   routine may ret
1a0a0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1a0b0 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72  , SQLITE_FULL or
1a0c0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a   SQLITE_OK. It .
1a0d0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20  ** does not set 
1a0e0 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43  the pPager->errC
1a0f0 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ode variable..*/
1a100 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1a110 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72 20  r_recycle(Pager 
1a120 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
1a130 2a 70 70 50 67 29 7b 0a 20 20 50 67 48 64 72 20  *ppPg){.  PgHdr 
1a140 2a 70 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d 20  *pPg;.  *ppPg = 
1a150 30 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69  0;..  /* It is i
1a160 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 74  llegal to call t
1a170 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 6e 6c  his function unl
1a180 65 73 73 20 74 68 65 20 70 61 67 65 72 20 6f 62  ess the pager ob
1a190 6a 65 63 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  ject.  ** pointe
1a1a0 64 20 74 6f 20 62 79 20 70 50 61 67 65 72 20 68  d to by pPager h
1a1b0 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  as at least one 
1a1c0 66 72 65 65 20 70 61 67 65 20 28 70 61 67 65 20  free page (page 
1a1d0 77 69 74 68 20 6e 52 65 66 3d 3d 30 29 2e 0a 20  with nRef==0).. 
1a1e0 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 21 4d   */ .  assert(!M
1a1f0 45 4d 44 42 29 3b 0a 20 20 61 73 73 65 72 74 28  EMDB);.  assert(
1a200 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
1a210 73 74 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  st);..  /* Find 
1a220 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c  a page to recycl
1a230 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74  e.  Try to locat
1a240 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f  e a page that do
1a250 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75  es not.  ** requ
1a260 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20  ire us to do an 
1a270 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a  fsync() on the j
1a280 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70  ournal..  */.  p
1a290 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72 75  Pg = pPager->lru
1a2a0 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a  .pFirstSynced;..
1a2b0 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64    /* If we could
1a2c0 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65   not find a page
1a2d0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
1a2e0 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28  equire an fsync(
1a2f0 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f  ).  ** on the jo
1a300 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
1a310 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61  fsync the journa
1a320 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  l file.  This is
1a330 20 61 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f   a.  ** very slo
1a340 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20  w operation, so 
1a350 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20  we work hard to 
1a360 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73  avoid it.  But s
1a370 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74  ometimes.  ** it
1a380 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64   can't be helped
1a390 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
1a3a0 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6c  ==0 && pPager->l
1a3b0 72 75 2e 70 46 69 72 73 74 29 7b 0a 20 20 20 20  ru.pFirst){.    
1a3c0 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
1a3d0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
1a3e0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
1a3f0 3e 66 64 29 3b 0a 20 20 20 20 69 6e 74 20 72 63  >fd);.    int rc
1a400 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
1a410 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1a420 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  rc!=0 ){.      r
1a430 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1a440 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1a450 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28  fullSync && 0==(
1a460 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
1a470 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
1a480 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20  .      /* If in 
1a490 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
1a4a0 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72  write a new jour
1a4b0 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20  nal header into 
1a4c0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  the.      ** jou
1a4d0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
1a4e0 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64  is done to avoid
1a4f0 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20   ever modifying 
1a500 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  a journal.      
1a510 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20 69  ** header that i
1a520 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
1a530 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61  e rollback of pa
1a540 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20 20  ges that have.  
1a550 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62      ** already b
1a560 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1a570 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 20  he database (in 
1a580 63 61 73 65 20 74 68 65 20 68 65 61 64 65 72 20  case the header 
1a590 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 73  is.      ** tras
1a5a0 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65  hed when the nRe
1a5b0 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
1a5c0 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ed)..      */.  
1a5d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
1a5e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
1a5f0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1a600 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20  nalOff > 0 );.  
1a610 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1a620 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30  er->doNotSync==0
1a630 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   );.      rc = w
1a640 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
1a650 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
1a660 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
1a670 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1a680 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1a690 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72  pPg = pPager->lr
1a6a0 75 2e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 20  u.pFirst;.  }.. 
1a6b0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
1a6c0 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57  ef==0 );..  /* W
1a6d0 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74 6f  rite the page to
1a6e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a6f0 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72 74  le if it is dirt
1a700 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  y..  */.  if( pP
1a710 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
1a720 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65  int rc;.    asse
1a730 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
1a740 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b 65  c==0 );.    make
1a750 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
1a760 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
1a770 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
1a780 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  = 0;.    rc = pa
1a790 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
1a7a0 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 70  st( pPg );.    p
1a7b0 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
1a7c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a7d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1a7e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1a7f0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
1a800 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20  ->dirty==0 );.. 
1a810 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
1a820 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67  we are recycling
1a830 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   is marked as al
1a840 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68  waysRollback, th
1a850 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20  en.  ** set the 
1a860 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c  global alwaysRol
1a870 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73  lback flag, thus
1a880 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20   disabling the. 
1a890 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
1a8a0 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 6f  DontRollback() o
1a8b0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
1a8c0 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73  the rest of this
1a8d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
1a8e0 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61  ** It is necessa
1a8f0 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ry to do this be
1a900 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d  cause the page m
1a910 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c  arked alwaysRoll
1a920 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20  back.  ** might 
1a930 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61  be reloaded at a
1a940 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20   later time but 
1a950 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  at that point we
1a960 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a   won't remember.
1a970 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73    ** that is was
1a980 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
1a990 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65  llback.  This me
1a9a0 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ans that all pag
1a9b0 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  es must.  ** be 
1a9c0 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
1a9d0 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65  Rollback from he
1a9e0 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a  re on out..  */.
1a9f0 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
1aa00 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  sRollback ){.   
1aa10 20 49 4f 54 52 41 43 45 28 28 22 41 4c 57 41 59   IOTRACE(("ALWAY
1aa20 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e 22  S_ROLLBACK %p\n"
1aa30 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 70  , pPager)).    p
1aa40 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
1aa50 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a  lback = 1;.  }..
1aa60 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20    /* Unlink the 
1aa70 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68  old page from th
1aa80 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20  e free list and 
1aa90 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20  the hash table. 
1aaa0 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65   */.  unlinkPage
1aab0 28 70 50 67 29 3b 0a 20 20 61 73 73 65 72 74 28  (pPg);.  assert(
1aac0 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b   pPg->pgno==0 );
1aad0 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b  ..  *ppPg = pPg;
1aae0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1aaf0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
1ab00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
1ab10 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 2f  ORY_MANAGEMENT./
1ab20 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1ab30 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1ab40 66 72 65 65 20 73 75 70 65 72 66 6c 75 6f 75 73  free superfluous
1ab50 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
1ab60 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a  ocated memory.**
1ab70 20 68 65 6c 64 20 62 79 20 74 68 65 20 70 61 67   held by the pag
1ab80 65 72 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72  er system. Memor
1ab90 79 20 69 6e 20 75 73 65 20 62 79 20 61 6e 79 20  y in use by any 
1aba0 53 51 4c 69 74 65 20 70 61 67 65 72 20 61 6c 6c  SQLite pager all
1abb0 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  ocated.** by the
1abc0 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
1abd0 6d 61 79 20 62 65 20 73 71 6c 69 74 65 33 5f 66  may be sqlite3_f
1abe0 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e  ree()ed..**.** n
1abf0 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Req is the numbe
1ac00 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65  r of bytes of me
1ac10 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e 20 4f  mory required. O
1ac20 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20 68 61  nce this much ha
1ac30 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61 73  s.** been releas
1ac40 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ed, the function
1ac50 20 72 65 74 75 72 6e 73 2e 20 54 68 65 20 72 65   returns. The re
1ac60 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
1ac70 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a  e total number .
1ac80 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  ** of bytes of m
1ac90 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a  emory released..
1aca0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1acb0 67 65 72 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79  gerReleaseMemory
1acc0 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20 20 69 6e  (int nReq){.  in
1acd0 74 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30 3b  t nReleased = 0;
1ace0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
1acf0 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c  es of memory rel
1ad00 65 61 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  eased so far */.
1ad10 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
1ad20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 20 2f 2a  *mutex;       /*
1ad30 20 54 68 65 20 4d 45 4d 32 20 6d 75 74 65 78 20   The MEM2 mutex 
1ad40 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  */.  Pager *pPag
1ad50 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
1ad60 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1ad70 6f 76 65 72 20 70 61 67 65 72 73 20 2a 2f 0a 20  over pagers */. 
1ad80 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 73 61   BusyHandler *sa
1ad90 76 65 64 42 75 73 79 3b 20 20 20 20 20 2f 2a 20  vedBusy;     /* 
1ada0 53 61 76 65 64 20 63 6f 70 79 20 6f 66 20 74 68  Saved copy of th
1adb0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2a  e busy handler *
1adc0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
1add0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 41 63  ITE_OK;..  /* Ac
1ade0 71 75 69 72 65 20 74 68 65 20 6d 65 6d 6f 72 79  quire the memory
1adf0 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 6d 75 74 65  -management mute
1ae00 78 0a 20 20 2a 2f 0a 20 20 6d 75 74 65 78 20 3d  x.  */.  mutex =
1ae10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
1ae20 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1ae30 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a  X_STATIC_MEM2);.
1ae40 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1ae50 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 0a 20  enter(mutex);.. 
1ae60 20 2f 2a 20 53 69 67 6e 61 6c 20 61 6c 6c 20 64   /* Signal all d
1ae70 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1ae80 6f 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20  ons that memory 
1ae90 6d 61 6e 61 67 65 6d 65 6e 74 20 77 61 6e 74 73  management wants
1aea0 0a 20 20 2a 2a 20 74 6f 20 68 61 76 65 20 61 63  .  ** to have ac
1aeb0 63 65 73 73 20 74 6f 20 74 68 65 20 70 61 67 65  cess to the page
1aec0 72 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  rs..  */.  for(p
1aed0 50 61 67 65 72 3d 73 71 6c 69 74 65 33 50 61 67  Pager=sqlite3Pag
1aee0 65 72 4c 69 73 74 3b 20 70 50 61 67 65 72 3b 20  erList; pPager; 
1aef0 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70  pPager=pPager->p
1af00 4e 65 78 74 29 7b 0a 20 20 20 20 20 70 50 61 67  Next){.     pPag
1af10 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 31  er->iInUseMM = 1
1af20 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
1af30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1af40 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c   (nReq<0 || nRel
1af50 65 61 73 65 64 3c 6e 52 65 71 29 20 29 7b 0a 20  eased<nReq) ){. 
1af60 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
1af70 20 20 20 50 67 48 64 72 20 2a 70 52 65 63 79 63     PgHdr *pRecyc
1af80 6c 65 64 3b 0a 20 0a 20 20 20 20 2f 2a 20 54 72  led;. .    /* Tr
1af90 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  y to find a page
1afa0 20 74 6f 20 72 65 63 79 63 6c 65 20 74 68 61 74   to recycle that
1afb0 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
1afc0 65 20 61 20 73 79 6e 63 28 29 2e 20 49 66 0a 20  e a sync(). If. 
1afd0 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 6e 6f     ** this is no
1afe0 74 20 70 6f 73 73 69 62 6c 65 2c 20 66 69 6e 64  t possible, find
1aff0 20 6f 6e 65 20 74 68 61 74 20 64 6f 65 73 20 72   one that does r
1b000 65 71 75 69 72 65 20 61 20 73 79 6e 63 28 29 2e  equire a sync().
1b010 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
1b020 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1b030 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
1b040 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1b050 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20  _STATIC_LRU));. 
1b060 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33     pPg = sqlite3
1b070 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72  LruPageList.pFir
1b080 73 74 53 79 6e 63 65 64 3b 0a 20 20 20 20 77 68  stSynced;.    wh
1b090 69 6c 65 28 20 70 50 67 20 26 26 20 28 70 50 67  ile( pPg && (pPg
1b0a0 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70 50  ->needSync || pP
1b0b0 67 2d 3e 70 50 61 67 65 72 2d 3e 69 49 6e 55 73  g->pPager->iInUs
1b0c0 65 44 42 29 20 29 7b 0a 20 20 20 20 20 20 70 50  eDB) ){.      pP
1b0d0 67 20 3d 20 70 50 67 2d 3e 67 66 72 65 65 2e 70  g = pPg->gfree.p
1b0e0 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
1b0f0 69 66 28 20 21 70 50 67 20 29 7b 0a 20 20 20 20  if( !pPg ){.    
1b100 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 4c    pPg = sqlite3L
1b110 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73  ruPageList.pFirs
1b120 74 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  t;.      while( 
1b130 70 50 67 20 26 26 20 70 50 67 2d 3e 70 50 61 67  pPg && pPg->pPag
1b140 65 72 2d 3e 69 49 6e 55 73 65 44 42 20 29 7b 0a  er->iInUseDB ){.
1b150 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 70 50          pPg = pP
1b160 67 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74 3b 0a  g->gfree.pNext;.
1b170 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b180 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1b190 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75  leave(sqlite3_mu
1b1a0 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
1b1b0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52  _MUTEX_STATIC_LR
1b1c0 55 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  U));..    /* If 
1b1d0 70 50 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  pPg==0, then the
1b1e0 20 62 6c 6f 63 6b 20 61 62 6f 76 65 20 68 61 73   block above has
1b1f0 20 66 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20   failed to find 
1b200 61 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  a page to.    **
1b210 20 72 65 63 79 63 6c 65 2e 20 49 6e 20 74 68 69   recycle. In thi
1b220 73 20 63 61 73 65 20 72 65 74 75 72 6e 20 65 61  s case return ea
1b230 72 6c 79 20 2d 20 6e 6f 20 66 75 72 74 68 65 72  rly - no further
1b240 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 0a 20 20 20   memory will.   
1b250 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
1b260 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1b270 21 70 50 67 20 29 20 62 72 65 61 6b 3b 0a 0a 20  !pPg ) break;.. 
1b280 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d     pPager = pPg-
1b290 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 61 73 73  >pPager;.    ass
1b2a0 65 72 74 28 21 70 50 67 2d 3e 6e 65 65 64 53 79  ert(!pPg->needSy
1b2b0 6e 63 20 7c 7c 20 70 50 67 3d 3d 70 50 61 67 65  nc || pPg==pPage
1b2c0 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29 3b 0a  r->lru.pFirst);.
1b2d0 20 20 20 20 61 73 73 65 72 74 28 70 50 67 2d 3e      assert(pPg->
1b2e0 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70 50 67 3d  needSync || pPg=
1b2f0 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69  =pPager->lru.pFi
1b300 72 73 74 53 79 6e 63 65 64 29 3b 0a 20 20 0a 20  rstSynced);.  . 
1b310 20 20 20 73 61 76 65 64 42 75 73 79 20 3d 20 70     savedBusy = p
1b320 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
1b330 6c 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ler;.    pPager-
1b340 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >pBusyHandler = 
1b350 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  0;.    rc = page
1b360 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65 72  r_recycle(pPager
1b370 2c 20 26 70 52 65 63 79 63 6c 65 64 29 3b 0a 20  , &pRecycled);. 
1b380 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79     pPager->pBusy
1b390 48 61 6e 64 6c 65 72 20 3d 20 73 61 76 65 64 42  Handler = savedB
1b3a0 75 73 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28  usy;.    assert(
1b3b0 70 52 65 63 79 63 6c 65 64 3d 3d 70 50 67 20 7c  pRecycled==pPg |
1b3c0 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  | rc!=SQLITE_OK)
1b3d0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1b3e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b3f0 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e 64 20   /* We've found 
1b400 61 20 70 61 67 65 20 74 6f 20 66 72 65 65 2e 20  a page to free. 
1b410 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
1b420 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
1b430 0a 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65  .      ** remove
1b440 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  d from the page 
1b450 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65  hash-table, free
1b460 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64  -list and synced
1b470 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20  -list .      ** 
1b480 28 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e 20  (pFirstSynced). 
1b490 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 74  It is still in t
1b4a0 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70 41  he all pages (pA
1b4b0 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20 20  ll) list. .     
1b4c0 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20 66 72   ** Remove it fr
1b4d0 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 62 65 66  om this list bef
1b4e0 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a 20 20 20  ore freeing..   
1b4f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
1b500 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65 20 50  odo: Check the P
1b510 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73 74 20  ager.pStmt list 
1b520 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69  to make sure thi
1b530 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20  s is Ok. It .   
1b540 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69     ** probably i
1b550 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20 20 20  s though..      
1b560 2a 2f 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  */.      PgHdr *
1b570 70 54 6d 70 3b 0a 20 20 20 20 20 20 61 73 73 65  pTmp;.      asse
1b580 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20  rt( pPg );.     
1b590 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72   if( pPg==pPager
1b5a0 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20  ->pAll ){.      
1b5b0 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20     pPager->pAll 
1b5c0 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
1b5d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b5e0 20 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70 3d        for( pTmp=
1b5f0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 54  pPager->pAll; pT
1b600 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50  mp->pNextAll!=pP
1b610 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e  g; pTmp=pTmp->pN
1b620 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20 20  extAll ){}.     
1b630 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c     pTmp->pNextAl
1b640 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  l = pPg->pNextAl
1b650 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
1b660 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 28 0a   nReleased += (.
1b670 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
1b680 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d  (*pPg) + pPager-
1b690 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20  >pageSize.      
1b6a0 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32      + sizeof(u32
1b6b0 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
1b6c0 72 61 0a 20 20 20 20 20 20 20 20 20 20 2b 20 4d  ra.          + M
1b6d0 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69  EMDB*sizeof(PgHi
1b6e0 73 74 6f 72 79 29 20 0a 20 20 20 20 20 20 29 3b  story) .      );
1b6f0 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
1b700 22 50 47 46 52 45 45 20 25 70 20 25 64 20 2a 5c  "PGFREE %p %d *\
1b710 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
1b720 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50  >pgno));.      P
1b730 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
1b740 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63  3_pager_pgfree_c
1b750 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  ount);.      sql
1b760 69 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a  ite3_free(pPg);.
1b770 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
1b780 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65  age--;.    }else
1b790 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72  {.      /* An er
1b7a0 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c  ror occured whil
1b7b0 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
1b7c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1b7d0 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  or .      ** jou
1b7e0 72 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f 72 65  rnal in pager_re
1b7f0 63 79 63 6c 65 28 29 2e 20 54 68 65 20 65 72 72  cycle(). The err
1b800 6f 72 20 69 73 20 6e 6f 74 20 72 65 74 75 72 6e  or is not return
1b810 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20 20 20  ed to the .     
1b820 20 2a 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74 68   ** caller of th
1b830 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73  is function. Ins
1b840 74 65 61 64 2c 20 73 65 74 20 74 68 65 20 50 61  tead, set the Pa
1b850 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69  ger.errCode vari
1b860 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54  able..      ** T
1b870 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65  he error will be
1b880 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1b890 20 75 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c   user (or users,
1b8a0 20 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20   in the case .  
1b8b0 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72      ** of a shar
1b8c0 65 64 20 70 61 67 65 72 20 63 61 63 68 65 29 20  ed pager cache) 
1b8d0 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 6f 72  of the pager for
1b8e0 20 77 68 69 63 68 20 74 68 65 20 65 72 72 6f 72   which the error
1b8f0 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20   occured..      
1b900 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1b910 0a 20 20 20 20 20 20 20 20 20 20 28 72 63 26 30  .          (rc&0
1b920 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
1b930 52 52 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  RR ||.          
1b940 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rc==SQLITE_FULL 
1b950 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d  ||.          rc=
1b960 3d 53 51 4c 49 54 45 5f 42 55 53 59 0a 20 20 20  =SQLITE_BUSY.   
1b970 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
1b980 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1b990 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
1b9a0 44 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72  D );.      pager
1b9b0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
1b9c0 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  c);.    }.  }.. 
1b9d0 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 6d 65   /* Clear the me
1b9e0 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20  mory management 
1b9f0 66 6c 61 67 73 20 61 6e 64 20 72 65 6c 65 61 73  flags and releas
1ba00 65 20 74 68 65 20 6d 75 74 65 78 0a 20 20 2a 2f  e the mutex.  */
1ba10 0a 20 20 66 6f 72 28 70 50 61 67 65 72 3d 73 71  .  for(pPager=sq
1ba20 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 20  lite3PagerList; 
1ba30 70 50 61 67 65 72 3b 20 70 50 61 67 65 72 3d 70  pPager; pPager=p
1ba40 50 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  Pager->pNext){. 
1ba50 20 20 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55      pPager->iInU
1ba60 73 65 4d 4d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  seMM = 0;.  }.  
1ba70 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1ba80 61 76 65 28 6d 75 74 65 78 29 3b 0a 0a 20 20 2f  ave(mutex);..  /
1ba90 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1baa0 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 6c  ber of bytes rel
1bab0 65 61 73 65 64 0a 20 20 2a 2f 0a 20 20 72 65 74  eased.  */.  ret
1bac0 75 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d  urn nReleased;.}
1bad0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1bae0 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
1baf0 4d 41 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f  MANAGEMENT */../
1bb00 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
1bb10 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 70 50  ntent of page pP
1bb20 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
1bb30 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  abase file..*/.s
1bb40 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62  tatic int readDb
1bb50 50 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  Page(Pager *pPag
1bb60 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 2c 20  er, PgHdr *pPg, 
1bb70 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
1bb80 74 20 72 63 3b 0a 20 20 69 36 34 20 6f 66 66 73  t rc;.  i64 offs
1bb90 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45  et;.  assert( ME
1bba0 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  MDB==0 );.  asse
1bbb0 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
1bbc0 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d  Methods||pPager-
1bbd0 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66  >tempFile);.  if
1bbe0 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  ( !pPager->fd->p
1bbf0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72  Methods ){.    r
1bc00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1bc10 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
1bc20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 28 70   }.  offset = (p
1bc30 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
1bc40 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
1bc50 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1bc60 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 50  ad(pPager->fd, P
1bc70 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1bc80 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
1bc90 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ize, offset);.  
1bca0 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
1bcb0 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
1bcc0 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f  count);.  PAGER_
1bcd0 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
1bce0 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  ad);.  IOTRACE((
1bcf0 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20  "PGIN %p %d\n", 
1bd00 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
1bd10 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
1bd20 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
1bd30 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
1bd40 20 26 28 28 75 38 2a 29 50 47 48 44 52 5f 54 4f   &((u8*)PGHDR_TO
1bd50 5f 44 41 54 41 28 70 50 67 29 29 5b 32 34 5d 2c  _DATA(pPg))[24],
1bd60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1bd90 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1bda0 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d 0a  FileVers));.  }.
1bdb0 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
1bdc0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
1bdd0 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  Pg), pPg->pgno, 
1bde0 33 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  3);.  PAGERTRACE
1bdf0 34 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  4("FETCH %d page
1be00 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
1be10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1be20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1be30 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61  ), pPg->pgno, pa
1be40 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
1be50 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
1be60 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1be70 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1be80 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
1be90 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65 71   shared lock req
1bea0 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  uired before.** 
1beb0 64 61 74 61 20 6d 61 79 20 62 65 20 72 65 61 64  data may be read
1bec0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
1bed0 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 73 68  cache. If the sh
1bee0 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c  ared lock has al
1bef0 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62  ready.** been ob
1bf00 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e  tained, this fun
1bf10 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
1bf20 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74  ..**.** Immediat
1bf30 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e  ely after obtain
1bf40 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
1bf50 6f 63 6b 20 28 69 66 20 72 65 71 75 69 72 65 64  ock (if required
1bf60 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
1bf70 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72 20 61  .** checks for a
1bf80 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
1bf90 65 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75  e. If one is fou
1bfa0 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63 79  nd, an emergency
1bfb0 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20   rollback.** is 
1bfc0 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69  performed immedi
1bfd0 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
1bfe0 20 69 6e 74 20 70 61 67 65 72 53 68 61 72 65 64   int pagerShared
1bff0 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
1c000 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
1c010 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
1c020 20 69 73 48 6f 74 20 3d 20 30 3b 0a 0a 20 20 2f   isHot = 0;..  /
1c030 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61  * If this databa
1c040 73 65 20 69 73 20 6f 70 65 6e 65 64 20 66 6f 72  se is opened for
1c050 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
1c060 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  s, has no outsta
1c070 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70 61 67 65  nding .  ** page
1c080 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
1c090 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d 73  is in an error-s
1c0a0 74 61 74 65 2c 20 6e 6f 77 20 69 73 20 74 68 65  tate, now is the
1c0b0 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61 72   chance to clear
1c0c0 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e  .  ** the error.
1c0d0 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   Discard the con
1c0e0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
1c0f0 65 72 2d 63 61 63 68 65 20 61 6e 64 20 74 72 65  er-cache and tre
1c100 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f 70 65 6e  at any.  ** open
1c110 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73   journal file as
1c120 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2e 0a   a hot-journal..
1c130 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d 44    */.  if( !MEMD
1c140 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78 63  B && pPager->exc
1c150 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
1c160 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26  ager->nRef==0 &&
1c170 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1c180 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
1c190 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1c1a0 29 7b 0a 20 20 20 20 20 20 69 73 48 6f 74 20 3d  ){.      isHot =
1c1b0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61   1;.    }.    pa
1c1c0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1c1d0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
1c1e0 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  rrCode = SQLITE_
1c1f0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
1c200 20 74 68 65 20 70 61 67 65 72 20 69 73 20 73 74   the pager is st
1c210 69 6c 6c 20 69 6e 20 61 6e 20 65 72 72 6f 72 20  ill in an error 
1c220 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 70 72  state, do not pr
1c230 6f 63 65 65 64 2e 20 54 68 65 20 65 72 72 6f 72  oceed. The error
1c240 20 0a 20 20 2a 2a 20 73 74 61 74 65 20 77 69 6c   .  ** state wil
1c250 6c 20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20  l be cleared at 
1c260 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
1c270 65 20 66 75 74 75 72 65 20 77 68 65 6e 20 61 6c  e future when al
1c280 6c 20 70 61 67 65 20 0a 20 20 2a 2a 20 72 65 66  l page .  ** ref
1c290 65 72 65 6e 63 65 73 20 61 72 65 20 64 72 6f 70  erences are drop
1c2a0 70 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68  ped and the cach
1c2b0 65 20 63 61 6e 20 62 65 20 64 69 73 63 61 72 64  e can be discard
1c2c0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
1c2d0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
1c2e0 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
1c2f0 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
1c300 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
1c310 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1c320 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
1c330 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
1c340 4c 4f 43 4b 20 7c 7c 20 69 73 48 6f 74 20 29 7b  LOCK || isHot ){
1c350 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
1c360 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
1c370 3e 70 56 66 73 3b 0a 20 20 20 20 69 66 28 20 21  >pVfs;.    if( !
1c380 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 61  MEMDB ){.      a
1c390 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1c3a0 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Ref==0 );.      
1c3b0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52  if( !pPager->noR
1c3c0 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  eadlock ){.     
1c3d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
1c3e0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
1c3f0 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
1c400 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1c410 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c420 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
1c430 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
1c440 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
1c450 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
1c460 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1c470 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
1c480 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
1c490 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
1c4a0 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
1c4b0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
1c4c0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
1c4d0 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
1c4e0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
1c4f0 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
1c500 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
1c510 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
1c520 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1c530 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
1c540 50 61 67 65 72 29 20 7c 7c 20 69 73 48 6f 74 20  Pager) || isHot 
1c550 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ){.        /* Ge
1c560 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
1c570 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1c580 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
1c590 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
1c5a0 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
1c5b0 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
1c5c0 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
1c5d0 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
1c5e0 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
1c5f0 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
1c600 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
1c610 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
1c620 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
1c630 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62          ** datab
1c640 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74  ase file, detect
1c650 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
1c660 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65  ck, and conclude
1c670 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
1c680 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
1c690 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
1c6a0 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
1c6b0 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
1c6c0 67 20 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  g it .        **
1c6d0 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   back..        *
1c6e0 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65  * .        ** Be
1c6f0 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d  cause the interm
1c700 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20  ediate RESERVED 
1c710 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
1c720 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20  ested, the.     
1c730 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f     ** second pro
1c740 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f  cess will get to
1c750 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
1c760 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
1c770 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f   to.        ** o
1c780 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45  btain it's own E
1c790 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1c7a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c7b0 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
1c7c0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1c7d0 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49  r->state<EXCLUSI
1c7e0 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
1c7f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1c800 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
1c810 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  fd, EXCLUSIVE_LO
1c820 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  CK);.          i
1c830 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c840 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1c850 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
1c860 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
1c870 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
1c880 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
1c890 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1c8a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1c8b0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
1c8c0 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 20  CLUSIVE;.       
1c8d0 20 7d 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20   }. .        /* 
1c8e0 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
1c8f0 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c   for reading onl
1c900 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  y.  Return SQLIT
1c910 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20  E_BUSY if.      
1c920 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62    ** we are unab
1c930 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  le to open the j
1c940 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20  ournal file. .  
1c950 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1c960 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   ** The journal 
1c970 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65  file does not ne
1c980 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  ed to be locked 
1c990 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20  itself.  The.   
1c9a0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
1c9b0 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70  file is never op
1c9c0 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61  en unless the ma
1c9d0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
1c9e0 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 20 2a   holds.        *
1c9f0 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20  * a write lock, 
1ca00 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65  so there is neve
1ca10 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20  r any chance of 
1ca20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20  two or more.    
1ca30 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73      ** processes
1ca40 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75   opening the jou
1ca50 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65  rnal at the same
1ca60 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a   time..        *
1ca70 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65  *.        ** Ope
1ca80 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  n the journal fo
1ca90 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
1caa0 65 73 73 2e 20 54 68 69 73 20 69 73 20 62 65 63  ess. This is bec
1cab0 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20 20  ause in .       
1cac0 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63   ** exclusive-ac
1cad0 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69  cess mode the fi
1cae0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
1caf0 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20  ll be kept open 
1cb00 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  and.        ** p
1cb10 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
1cb20 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
1cb30 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65  ater on. On some
1cb40 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20   systems, the.  
1cb50 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63        ** OsTrunc
1cb60 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20  ate() call used 
1cb70 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
1cb80 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65  ess mode also re
1cb90 71 75 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a  quires.        *
1cba0 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66  * a read/write f
1cbb0 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20  ile handle..    
1cbc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1cbd0 66 28 20 21 69 73 48 6f 74 20 29 7b 0a 20 20 20  f( !isHot ){.   
1cbe0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1cbf0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
1cc00 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73     if( sqlite3Os
1cc10 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61  Access(pVfs, pPa
1cc20 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53  ger->zJournal, S
1cc30 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1cc40 53 54 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20  STS) ){.        
1cc50 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
1cc60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
1cc70 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
1cc80 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
1cc90 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
1cca0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
1ccb0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1ccc0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
1ccd0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1cce0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
1ccf0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
1cd00 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
1cd10 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20  d, f, &fout);.  
1cd20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1cd30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cd40 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e  || pPager->jfd->
1cd50 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20  pMethods );.    
1cd60 20 20 20 20 20 20 20 20 69 66 28 20 66 6f 75 74          if( fout
1cd70 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
1cd80 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  DONLY ){.       
1cd90 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1cda0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
1cdb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
1cdc0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
1cdd0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
1cde0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1cdf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ce00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ce10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
1ce20 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
1ce30 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
1ce40 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49  eturn ((rc==SQLI
1ce50 54 45 5f 4e 4f 4d 45 4d 7c 7c 72 63 3d 3d 53 51  TE_NOMEM||rc==SQ
1ce60 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1ce70 29 3f 72 63 3a 53 51 4c 49 54 45 5f 42 55 53 59  )?rc:SQLITE_BUSY
1ce80 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1ce90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1cea0 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  rnalOpen = 1;.  
1ceb0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1cec0 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
1ced0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
1cee0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
1cef0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
1cf00 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
1cf10 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1cf20 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
1cf30 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 6c  . .        /* Pl
1cf40 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
1cf50 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
1cf60 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
1cf70 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 20  e write.        
1cf80 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
1cf90 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
1cfa0 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ock..        */.
1cfb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1cfc0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
1cfd0 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
1cfe0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1cff0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1d000 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
1d010 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
1d020 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d030 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
1d040 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
1d050 52 45 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  RED || .        
1d060 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 78 63      (pPager->exc
1d070 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
1d080 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45  ager->state>PAGE
1d090 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  R_SHARED).      
1d0a0 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20    );.      }..  
1d0b0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1d0c0 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pAll ){.        
1d0d0 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f  /* The shared-lo
1d0e0 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ck has just been
1d0f0 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65   acquired on the
1d100 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
1d110 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68         ** and th
1d120 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
1d130 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
1d140 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69  he (from a previ
1d150 6f 75 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  ous.        ** r
1d160 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1d170 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63  nsaction).  Chec
1d180 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
1d190 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20  database.       
1d1a0 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64   ** has been mod
1d1b0 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64  ified.  If the d
1d1c0 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e  atabase has chan
1d1d0 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20  ged, flush the. 
1d1e0 20 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e         ** cache.
1d1f0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1d200 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20      ** Database 
1d210 63 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63  changes is detec
1d220 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  ted by looking a
1d230 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e  t 15 bytes begin
1d240 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ning.        ** 
1d250 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74  at offset 24 int
1d260 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  o the file.  The
1d270 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73   first 4 of thes
1d280 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20  e 16 bytes are. 
1d290 20 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62         ** a 32-b
1d2a0 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20  it counter that 
1d2b0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
1d2c0 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e  ith each change.
1d2d0 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a    The.        **
1d2e0 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
1d2f0 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
1d300 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
1d310 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20  ge when.        
1d320 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e  ** a codec is in
1d330 20 75 73 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a   use..        **
1d340 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65   .        ** The
1d350 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e  re is a vanishin
1d360 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65  gly small chance
1d370 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77   that a change w
1d380 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  ill not be .    
1d390 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e      ** detected.
1d3a0 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20    The chance of 
1d3b0 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68  an undetected ch
1d3c0 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c  ange is so small
1d3d0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
1d3e0 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65   it can be negle
1d3f0 63 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  cted..        */
1d400 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 64 62  .        char db
1d410 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28  FileVers[sizeof(
1d420 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d430 72 73 29 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  rs)];.        sq
1d440 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1d450 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  unt(pPager);..  
1d460 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1d470 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
1d480 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 50         return pP
1d490 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1d4a0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1d4b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
1d4c0 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Size>0 ){.      
1d4d0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
1d4e0 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
1d4f0 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
1d500 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
1d510 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1d520 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1d530 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72  ->fd, &dbFileVer
1d540 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
1d550 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20  Vers), 24);.    
1d560 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d570 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d580 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1d590 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1d5a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d5b0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62         memset(db
1d5c0 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a  FileVers, 0, siz
1d5d0 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
1d5e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1d5f0 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
1d600 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d610 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
1d620 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
1d630 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  s))!=0 ){.      
1d640 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1d650 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1d660 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1d670 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1d680 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
1d690 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  de || pPager->st
1d6a0 61 74 65 3c 3d 50 41 47 45 52 5f 53 48 41 52 45  ate<=PAGER_SHARE
1d6b0 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  D );.    if( pPa
1d6c0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1d6d0 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
1d6e0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1d6f0 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
1d700 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1d710 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d720 20 41 6c 6c 6f 63 61 74 65 20 61 20 50 67 48 64   Allocate a PgHd
1d730 72 20 6f 62 6a 65 63 74 2e 20 20 20 45 69 74 68  r object.   Eith
1d740 65 72 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  er create a new 
1d750 6f 6e 65 20 6f 72 20 72 65 75 73 65 0a 2a 2a 20  one or reuse.** 
1d760 61 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e 65 20  an existing one 
1d770 74 68 61 74 20 69 73 20 6e 6f 74 20 6f 74 68 65  that is not othe
1d780 72 77 69 73 65 20 69 6e 20 75 73 65 2e 0a 2a 2a  rwise in use..**
1d790 0a 2a 2a 20 41 20 6e 65 77 20 50 67 48 64 72 20  .** A new PgHdr 
1d7a0 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
1d7b0 61 74 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74  ated if any of t
1d7c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1d7d0 0a 2a 2a 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  .** true:.**.** 
1d7e0 20 20 20 20 28 31 29 20 20 57 65 20 68 61 76 65      (1)  We have
1d7f0 20 6e 6f 74 20 65 78 63 65 65 64 65 64 20 6f 75   not exceeded ou
1d800 72 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 63 61  r maximum alloca
1d810 74 65 64 20 63 61 63 68 65 20 73 69 7a 65 0a 2a  ted cache size.*
1d820 2a 20 20 20 20 20 20 20 20 20 20 61 73 20 73 65  *          as se
1d830 74 20 62 79 20 74 68 65 20 22 50 52 41 47 4d 41  t by the "PRAGMA
1d840 20 63 61 63 68 65 5f 73 69 7a 65 22 20 63 6f 6d   cache_size" com
1d850 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mand..**.**     
1d860 28 32 29 20 20 54 68 65 72 65 20 61 72 65 20 6e  (2)  There are n
1d870 6f 20 75 6e 75 73 65 64 20 50 67 48 64 72 20 6f  o unused PgHdr o
1d880 62 6a 65 63 74 73 20 61 76 61 69 6c 61 62 6c 65  bjects available
1d890 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 2a   at this time..*
1d8a0 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 54 68  *.**     (3)  Th
1d8b0 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
1d8c0 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ry database..**.
1d8d0 2a 2a 20 20 20 20 20 28 34 29 20 20 54 68 65 72  **     (4)  Ther
1d8e0 65 20 61 72 65 20 6e 6f 20 50 67 48 64 72 20 6f  e are no PgHdr o
1d8f0 62 6a 65 63 74 73 20 74 68 61 74 20 64 6f 20 6e  bjects that do n
1d900 6f 74 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ot require a jou
1d910 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
1d920 20 66 69 6c 65 20 73 79 6e 63 20 61 6e 64 20 61   file sync and a
1d930 20 73 79 6e 63 20 6f 66 20 74 68 65 20 6a 6f 75   sync of the jou
1d940 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 75 72  rnal file is cur
1d950 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20  rently.**       
1d960 20 20 20 70 72 6f 68 69 62 69 74 65 64 2e 0a 2a     prohibited..*
1d970 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1d980 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  reuse an existin
1d990 67 20 50 67 48 64 72 2e 20 20 49 6e 20 6f 74 68  g PgHdr.  In oth
1d9a0 65 72 20 77 6f 72 64 73 2c 20 72 65 75 73 65 20  er words, reuse 
1d9b0 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 50  an.** existing P
1d9c0 67 48 64 72 20 69 66 20 61 6c 6c 20 6f 66 20 74  gHdr if all of t
1d9d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1d9e0 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   true:.**.**    
1d9f0 20 28 31 29 20 20 57 65 20 68 61 76 65 20 72 65   (1)  We have re
1da00 61 63 68 65 64 20 6f 72 20 65 78 63 65 65 64 65  ached or exceede
1da10 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 63 61  d the maximum ca
1da20 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20  che size.**     
1da30 20 20 20 20 20 61 6c 6c 6f 77 65 64 20 62 79 20       allowed by 
1da40 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69  "PRAGMA cache_si
1da50 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ze"..**.**     (
1da60 32 29 20 20 54 68 65 72 65 20 69 73 20 61 20 50  2)  There is a P
1da70 67 48 64 72 20 61 76 61 69 6c 61 62 6c 65 20 77  gHdr available w
1da80 69 74 68 20 50 67 48 64 72 2d 3e 6e 52 65 66 3d  ith PgHdr->nRef=
1da90 3d 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29  =0.**.**     (3)
1daa0 20 20 57 65 20 61 72 65 20 6e 6f 74 20 69 6e 20    We are not in 
1dab0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
1dac0 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20  abase.**.**     
1dad0 28 34 29 20 20 45 69 74 68 65 72 20 74 68 65 72  (4)  Either ther
1dae0 65 20 69 73 20 61 6e 20 61 76 61 69 6c 61 62 6c  e is an availabl
1daf0 65 20 50 67 48 64 72 20 74 68 61 74 20 64 6f 65  e PgHdr that doe
1db00 73 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20 20 20  s not need.**   
1db10 20 20 20 20 20 20 20 74 6f 20 62 65 20 73 79 6e         to be syn
1db20 63 65 64 20 74 6f 20 64 69 73 6b 20 6f 72 20 65  ced to disk or e
1db30 6c 73 65 20 64 69 73 6b 20 73 79 6e 63 69 6e 67  lse disk syncing
1db40 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
1db50 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65            allowe
1db60 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1db70 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61   pagerAllocatePa
1db80 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
1db90 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b  , PgHdr **ppPg){
1dba0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1dbb0 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a  TE_OK;.  PgHdr *
1dbc0 70 50 67 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  pPg;.  int nByte
1dbd0 48 64 72 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  Hdr;..  /* Creat
1dbe0 65 20 61 20 6e 65 77 20 50 67 48 64 72 20 69 66  e a new PgHdr if
1dbf0 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 75 72   any of the four
1dc00 20 63 6f 6e 64 69 74 69 6f 6e 73 20 64 65 66 69   conditions defi
1dc10 6e 65 64 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20  ned .  ** above 
1dc20 61 72 65 20 6d 65 74 3a 20 2a 2f 0a 20 20 69 66  are met: */.  if
1dc30 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c  ( pPager->nPage<
1dc40 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 0a 20  pPager->mxPage. 
1dc50 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6c 72 75    || pPager->lru
1dc60 2e 70 46 69 72 73 74 3d 3d 30 20 0a 20 20 20 7c  .pFirst==0 .   |
1dc70 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c 20 28 70  | MEMDB.   || (p
1dc80 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73  Pager->lru.pFirs
1dc90 74 53 79 6e 63 65 64 3d 3d 30 20 26 26 20 70 50  tSynced==0 && pP
1dca0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29  ager->doNotSync)
1dcb0 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  .  ){.    if( pP
1dcc0 61 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61  ager->nPage>=pPa
1dcd0 67 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20  ger->nHash ){.  
1dce0 20 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65      pager_resize
1dcf0 5f 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67  _hash_table(pPag
1dd00 65 72 2c 0a 20 20 20 20 20 20 20 20 20 70 50 61  er,.         pPa
1dd10 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f  ger->nHash<256 ?
1dd20 20 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e   256 : pPager->n
1dd30 48 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 69  Hash*2);.      i
1dd40 66 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  f( pPager->nHash
1dd50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1dd60 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1dd70 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
1dd80 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75  ager_allocate_ou
1dd90 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1dda0 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28  .    pagerLeave(
1ddb0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 6e 42 79  pPager);.    nBy
1ddc0 74 65 48 64 72 20 3d 20 73 69 7a 65 6f 66 28 2a  teHdr = sizeof(*
1ddd0 70 50 67 29 20 2b 20 73 69 7a 65 6f 66 28 75 33  pPg) + sizeof(u3
1dde0 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  2) + pPager->nEx
1ddf0 74 72 61 0a 20 20 20 20 20 20 20 20 20 20 20 20  tra.            
1de00 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66    + MEMDB*sizeof
1de10 28 50 67 48 69 73 74 6f 72 79 29 3b 0a 20 20 20  (PgHistory);.   
1de20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d   pPg = sqlite3_m
1de30 61 6c 6c 6f 63 28 20 6e 42 79 74 65 48 64 72 20  alloc( nByteHdr 
1de40 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  + pPager->pageSi
1de50 7a 65 20 29 3b 0a 20 20 20 20 70 61 67 65 72 45  ze );.    pagerE
1de60 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
1de70 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
1de80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1de90 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
1dea0 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61  oto pager_alloca
1deb0 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  te_out;.    }.  
1dec0 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c    memset(pPg, 0,
1ded0 20 6e 42 79 74 65 48 64 72 29 3b 0a 20 20 20 20   nByteHdr);.    
1dee0 70 50 67 2d 3e 70 44 61 74 61 20 3d 20 28 76 6f  pPg->pData = (vo
1def0 69 64 2a 29 28 6e 42 79 74 65 48 64 72 20 2b 20  id*)(nByteHdr + 
1df00 28 63 68 61 72 2a 29 70 50 67 29 3b 0a 20 20 20  (char*)pPg);.   
1df10 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
1df20 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e  Pager;.    pPg->
1df30 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65  pNextAll = pPage
1df40 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 70 50 61  r->pAll;.    pPa
1df50 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b  ger->pAll = pPg;
1df60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61  .    pPager->nPa
1df70 67 65 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ge++;.  }else{. 
1df80 20 20 20 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e     /* Recycle an
1df90 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 77   existing page w
1dfa0 69 74 68 20 61 20 7a 65 72 6f 20 72 65 66 2d 63  ith a zero ref-c
1dfb0 6f 75 6e 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ount. */.    rc 
1dfc0 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  = pager_recycle(
1dfd0 70 50 61 67 65 72 2c 20 26 70 50 67 29 3b 0a 20  pPager, &pPg);. 
1dfe0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1dff0 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
1e000 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
1e010 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d  R_BLOCKED;.    }
1e020 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1e030 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e040 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63  goto pager_alloc
1e050 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ate_out;.    }. 
1e060 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1e070 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44  r->state>=SHARED
1e080 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
1e090 65 72 74 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ert(pPg);.  }.  
1e0a0 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61  *ppPg = pPg;..pa
1e0b0 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74  ger_allocate_out
1e0c0 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
1e0d0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1e0e0 65 20 77 65 20 68 61 76 65 20 74 68 65 20 63 6f  e we have the co
1e0f0 6e 74 65 6e 74 20 66 6f 72 20 61 20 70 61 67 65  ntent for a page
1e100 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 77  .  If the page w
1e110 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  as.** previously
1e120 20 61 63 71 75 69 72 65 64 20 77 69 74 68 20 6e   acquired with n
1e130 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65  oContent==1, the
1e140 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 61  n the content wa
1e150 73 0a 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69 61  s.** just initia
1e160 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 69  lized to zeros i
1e170 6e 73 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20  nstead of being 
1e180 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a  read from disk..
1e190 2a 2a 20 42 75 74 20 6e 6f 77 20 77 65 20 6e 65  ** But now we ne
1e1a0 65 64 20 74 68 65 20 72 65 61 6c 20 64 61 74 61  ed the real data
1e1b0 20 6f 66 66 20 6f 66 20 64 69 73 6b 2e 20 20 53   off of disk.  S
1e1c0 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65 0a 2a  o make sure we.*
1e1d0 2a 20 68 61 76 65 20 69 74 2e 20 20 52 65 61 64  * have it.  Read
1e1e0 20 69 74 20 69 6e 20 69 66 20 77 65 20 64 6f 20   it in if we do 
1e1f0 6e 6f 74 20 68 61 76 65 20 69 74 20 61 6c 72 65  not have it alre
1e200 61 64 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ady..*/.static i
1e210 6e 74 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e  nt pager_get_con
1e220 74 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29  tent(PgHdr *pPg)
1e230 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65  {.  if( pPg->nee
1e240 64 52 65 61 64 20 29 7b 0a 20 20 20 20 69 6e 74  dRead ){.    int
1e250 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
1e260 28 70 50 67 2d 3e 70 50 61 67 65 72 2c 20 70 50  (pPg->pPager, pP
1e270 67 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  g, pPg->pgno);. 
1e280 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e290 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
1e2a0 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b  g->needRead = 0;
1e2b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e2c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1e2d0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1e2e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1e2f0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
1e300 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64  ge..**.** A read
1e310 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73   lock on the dis
1e320 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e  k file is obtain
1e330 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  ed when the firs
1e340 74 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72  t page is acquir
1e350 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61  ed. .** This rea
1e360 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65  d lock is droppe
1e370 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  d when the last 
1e380 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
1e390 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1e3a0 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61  tine works for a
1e3b0 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67  ny page number g
1e3c0 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20  reater than 0.  
1e3d0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  If the database.
1e3e0 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c  ** file is small
1e3f0 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
1e400 65 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e  ested page, then
1e410 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a   no actual disk.
1e420 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61  ** read occurs a
1e430 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  nd the memory im
1e440 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  age of the page 
1e450 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
1e460 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  o.** all zeros. 
1e470 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
1e480 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
1e490 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
1e4a0 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a  tialized.** to z
1e4b0 65 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74  eros the first t
1e4c0 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
1e4d0 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
1e4e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75  ..**.** The acqu
1e4f0 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61  isition might fa
1e500 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72  il for several r
1e510 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20  easons.  In all 
1e520 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70  cases,.** an app
1e530 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
1e540 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
1e550 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73  and *ppPage is s
1e560 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
1e570 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
1e580 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e  e3PagerLookup().
1e590 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74    Both this rout
1e5a0 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29  ine and Lookup()
1e5b0 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66   attempt.** to f
1e5c0 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
1e5d0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
1e5e0 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65  e first.  If the
1e5f0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
1e600 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  eady.** in memor
1e610 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
1e620 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20  goes to disk to 
1e630 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65  read it in where
1e640 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a  as Lookup().** j
1e650 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20  ust returns 0.  
1e660 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71  This routine acq
1e670 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
1e680 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
1e690 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f   it.** has to go
1e6a0 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f   to disk, and co
1e6b0 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63  uld also playbac
1e6c0 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  k an old journal
1e6d0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
1e6e0 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29  * Since Lookup()
1e6f0 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64   never goes to d
1e700 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61  isk, it never ha
1e710 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c  s to deal with l
1e720 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e  ocks.** or journ
1e730 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
1e740 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
1e750 66 61 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20  false, the page 
1e760 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74  contents are act
1e770 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  ually read from 
1e780 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f  disk..** If noCo
1e790 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69  ntent is true, i
1e7a0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
1e7b0 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
1e7c0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  t the contents.*
1e7d0 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  * of the page at
1e7e0 20 74 68 69 73 20 74 69 6d 65 2c 20 73 6f 20 64   this time, so d
1e7f0 6f 20 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b 20  o not do a disk 
1e800 72 65 61 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c  read.  Just fill
1e810 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   in the.** page 
1e820 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72  content with zer
1e830 6f 73 2e 20 20 42 75 74 20 6d 61 72 6b 20 74 68  os.  But mark th
1e840 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20 68  e fact that we h
1e850 61 76 65 20 6e 6f 74 20 72 65 61 64 20 74 68 65  ave not read the
1e860 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20 73  .** content by s
1e870 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72  etting the PgHdr
1e880 2e 6e 65 65 64 52 65 61 64 20 66 6c 61 67 2e 20  .needRead flag. 
1e890 20 4c 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a   Later on, if .*
1e8a0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  * sqlite3PagerWr
1e8b0 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1e8c0 6f 6e 20 74 68 69 73 20 70 61 67 65 20 6f 72 20  on this page or 
1e8d0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
1e8e0 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61  is.** called aga
1e8f0 69 6e 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e  in with noConten
1e900 74 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73  t==0, that means
1e910 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
1e920 74 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61  t is needed.** a
1e930 6e 64 20 74 68 65 20 64 69 73 6b 20 72 65 61 64  nd the disk read
1e940 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
1e950 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
1e960 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1e970 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72  Acquire(.  Pager
1e980 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
1e990 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
1e9a0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1e9b0 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
1e9c0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
1e9d0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
1e9e0 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
1e9f0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
1ea00 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
1ea10 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
1ea20 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ere */.  int noC
1ea30 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20  ontent       /* 
1ea40 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65  Do not bother re
1ea50 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72  ading content fr
1ea60 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20  om disk if true 
1ea70 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  */.){.  PgHdr *p
1ea80 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  Pg;.  int rc;.. 
1ea90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1eaa0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
1eab0 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  LOCK || pPager->
1eac0 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d  nRef>0 || pgno==
1ead0 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  1 );..  /* The m
1eae0 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62  aximum page numb
1eaf0 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75  er is 2^31. Retu
1eb00 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1eb10 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a  T if a page.  **
1eb20 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
1eb30 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65  than this, or ze
1eb40 72 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65 64  ro, is requested
1eb50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
1eb60 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
1eb70 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70   || pgno==0 || p
1eb80 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
1eb90 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
1eba0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ebb0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1ebc0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
1ebd0 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69  e we have not hi
1ebe0 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65  t any critical e
1ebf0 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61  rrors..  */ .  a
1ec00 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
1ec10 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   );.  *ppPage = 
1ec20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  0;..  /* If this
1ec30 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61   is the first pa
1ec40 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65  ge accessed, the
1ec50 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c  n get a SHARED l
1ec60 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
1ec70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 70  database file. p
1ec80 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
1ec90 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a   is a no-op if .
1eca0 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20    ** a database 
1ecb0 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
1ecc0 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  held..  */.  rc 
1ecd0 3d 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  = pagerSharedLoc
1ece0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  k(pPager);.  if(
1ecf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ed00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1ed10 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1ed20 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1ed30 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20  GER_UNLOCK );.. 
1ed40 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
1ed50 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
1ed60 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20  );.  if( pPg==0 
1ed70 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ){.    /* The re
1ed80 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
1ed90 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20  not in the page 
1eda0 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  cache. */.    in
1edb0 74 20 6e 4d 61 78 3b 0a 20 20 20 20 69 6e 74 20  t nMax;.    int 
1edc0 68 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  h;.    PAGER_INC
1edd0 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29  R(pPager->nMiss)
1ede0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1edf0 41 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 50 61  AllocatePage(pPa
1ee00 67 65 72 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  ger, &pPg);.    
1ee10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ee20 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1ee30 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
1ee40 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e   pPg->pgno = pgn
1ee50 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  o;.    assert( !
1ee60 4d 45 4d 44 42 20 7c 7c 20 70 67 6e 6f 3e 70 50  MEMDB || pgno>pP
1ee70 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29  ager->stmtSize )
1ee80 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1ee90 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  ->aInJournal && 
1eea0 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
1eeb0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
1eec0 0a 23 69 66 20 30 0a 20 20 20 20 20 20 73 71 6c  .#if 0.      sql
1eed0 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28  ite3CheckMemory(
1eee0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1eef0 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 23 65 6e  al, pgno/8);.#en
1ef00 64 69 66 0a 20 20 20 20 20 20 61 73 73 65 72 74  dif.      assert
1ef10 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1ef20 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70  lOpen );.      p
1ef30 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
1ef40 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
1ef50 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31  nal[pgno/8] & (1
1ef60 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b  <<(pgno&7)))!=0;
1ef70 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
1ef80 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Sync = 0;.    }e
1ef90 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
1efa0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
1efb0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
1efc0 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  nc = 0;.    }.. 
1efd0 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
1efe0 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66  );.    pPg->nRef
1eff0 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46   = 1;.    REFINF
1f000 4f 28 70 50 67 29 3b 0a 0a 20 20 20 20 70 50 61  O(pPg);..    pPa
1f010 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ger->nRef++;.   
1f020 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78   if( pPager->nEx
1f030 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d  tra>0 ){.      m
1f040 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45  emset(PGHDR_TO_E
1f050 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72  XTRA(pPg, pPager
1f060 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45  ), 0, pPager->nE
1f070 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xtra);.    }.   
1f080 20 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 50   nMax = sqlite3P
1f090 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1f0a0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
1f0b0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
1f0c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 50 61  {.      rc = pPa
1f0d0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1f0e0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1f0f0 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
1f100 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1f110 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c   }..    /* Popul
1f120 61 74 65 20 74 68 65 20 70 61 67 65 20 77 69 74  ate the page wit
1f130 68 20 64 61 74 61 2c 20 65 69 74 68 65 72 20 62  h data, either b
1f140 79 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74  y reading from t
1f150 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
1f160 2a 2a 20 66 69 6c 65 2c 20 6f 72 20 62 79 20 73  ** file, or by s
1f170 65 74 74 69 6e 67 20 74 68 65 20 65 6e 74 69 72  etting the entir
1f180 65 20 70 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a  e page to zero..
1f190 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1f1a0 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c  Max<(int)pgno ||
1f1b0 20 4d 45 4d 44 42 20 7c 7c 20 28 6e 6f 43 6f 6e   MEMDB || (noCon
1f1c0 74 65 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d  tent && !pPager-
1f1d0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29  >alwaysRollback)
1f1e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67   ){.      if( pg
1f1f0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  no>pPager->mxPgn
1f200 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  o ){.        sql
1f210 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1f220 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  Pg);.        ret
1f230 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
1f240 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
1f250 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
1f260 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61  ATA(pPg), 0, pPa
1f270 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1f280 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52        pPg->needR
1f290 65 61 64 20 3d 20 6e 6f 43 6f 6e 74 65 6e 74 20  ead = noContent 
1f2a0 26 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61  && !pPager->alwa
1f2b0 79 73 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20  ysRollback;.    
1f2c0 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f    IOTRACE(("ZERO
1f2d0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1f2e0 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  r, pgno));.    }
1f2f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1f300 20 72 65 61 64 44 62 50 61 67 65 28 70 50 61 67   readDbPage(pPag
1f310 65 72 2c 20 70 50 67 2c 20 70 67 6e 6f 29 3b 0a  er, pPg, pgno);.
1f320 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1f330 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
1f340 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1f350 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1f360 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b    pPg->pgno = 0;
1f370 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f380 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
1f390 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1f3a0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1f3b0 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20    pPg->needRead 
1f3c0 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
1f3d0 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 70 61 67 65  /* Link the page
1f3e0 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 68   into the page h
1f3f0 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ash table */.   
1f400 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61   h = pgno & (pPa
1f410 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20  ger->nHash-1);. 
1f420 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21     assert( pgno!
1f430 3d 30 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  =0 );.    pPg->p
1f440 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65  NextHash = pPage
1f450 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20  r->aHash[h];.   
1f460 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
1f470 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  ] = pPg;.    if(
1f480 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
1f490 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1f4a0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
1f4b0 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
1f4c0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
1f4d0 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
1f4e0 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 0a 23   = pPg;.    }..#
1f4f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
1f500 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
1f510 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
1f520 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
1f530 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
1f540 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
1f550 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69  uested page is i
1f560 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
1f570 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
1f580 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c  pPager->nRef>0 |
1f590 7c 20 70 67 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20  | pgno==1);.    
1f5a0 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
1f5b0 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20 69 66  r->nHit);.    if
1f5c0 28 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  ( !noContent ){.
1f5d0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1f5e0 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67  _get_content(pPg
1f5f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1f600 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1f610 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1f620 20 20 7d 0a 20 20 20 20 70 61 67 65 5f 72 65 66    }.    page_ref
1f630 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70  (pPg);.  }.  *pp
1f640 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 72 65  Page = pPg;.  re
1f650 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f660 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  }.int sqlite3Pag
1f670 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67  erAcquire(.  Pag
1f680 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1f690 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
1f6a0 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
1f6b0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
1f6c0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
1f6d0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
1f6e0 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
1f6f0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
1f700 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
1f710 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
1f720 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   here */.  int n
1f730 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f  oContent       /
1f740 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
1f750 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20  reading content 
1f760 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75  from disk if tru
1f770 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
1f780 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
1f790 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70  Pager);.  rc = p
1f7a0 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67  agerAcquire(pPag
1f7b0 65 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  er, pgno, ppPage
1f7c0 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  , noContent);.  
1f7d0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
1f7e0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
1f7f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  .}.../*.** Acqui
1f800 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
1f810 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
1f820 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
1f830 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
1f840 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
1f850 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
1f860 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1f870 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
1f880 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
1f890 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a   in cache..**.**
1f8a0 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
1f8b0 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68  3PagerGet().  Th
1f8c0 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
1f8d0 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
1f8e0 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
1f8f0 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68  PagerGet() is th
1f900 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
1f910 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
1f920 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
1f930 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
1f940 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
1f950 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
1f960 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
1f970 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
1f980 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
1f990 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
1f9a0 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
1f9b0 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
1f9c0 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71  d..*/.DbPage *sq
1f9d0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
1f9e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1f9f0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
1fa00 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 0a 20  Hdr *pPg = 0;.. 
1fa10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
1fa20 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1fa30 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 70 61  pgno!=0 );..  pa
1fa40 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
1fa50 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1fa60 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
1fa70 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
1fa80 74 28 20 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c  t( !pPager->pAll
1fa90 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 6c   || pPager->excl
1faa0 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20 7d  usiveMode );.  }
1fab0 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
1fac0 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67  >errCode && pPag
1fad0 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
1fae0 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_FULL ){.    
1faf0 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
1fb00 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50  .  }else if( (pP
1fb10 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
1fb20 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 21  (pPager, pgno))!
1fb30 3d 30 20 29 7b 0a 20 20 20 20 70 61 67 65 5f 72  =0 ){.    page_r
1fb40 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  ef(pPg);.  }.  p
1fb50 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
1fb60 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b  );.  return pPg;
1fb70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
1fb80 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
1fb90 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
1fba0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1fbb0 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20  he page drop to 
1fbc0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
1fbd0 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20  * page is added 
1fbe0 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e  to the LRU list.
1fbf0 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72    When all refer
1fc00 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67  ences to all pag
1fc10 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73  es.** are releas
1fc20 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed, a rollback o
1fc30 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f  ccurs and the lo
1fc40 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1fc50 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64  se is.** removed
1fc60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1fc70 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67  PagerUnref(DbPag
1fc80 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
1fc90 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1fca0 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 44 65  pPager;..  /* De
1fcb0 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
1fcc0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
1fcd0 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20  this page.  */. 
1fce0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
1fcf0 65 66 3e 30 20 29 3b 0a 20 20 70 61 67 65 72 45  ef>0 );.  pagerE
1fd00 6e 74 65 72 28 70 50 67 2d 3e 70 50 61 67 65 72  nter(pPg->pPager
1fd10 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d  );.  pPg->nRef--
1fd20 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29  ;.  REFINFO(pPg)
1fd30 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
1fd40 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  pPg);..  /* When
1fd50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
1fd60 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70  eferences to a p
1fd70 61 67 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c  age reach 0, cal
1fd80 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72  l the.  ** destr
1fd90 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68  uctor and add th
1fda0 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72  e page to the fr
1fdb0 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  eelist..  */.  i
1fdc0 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
1fdd0 29 7b 0a 0a 20 20 20 20 6c 72 75 4c 69 73 74 41  ){..    lruListA
1fde0 64 64 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  dd(pPg);.    if(
1fdf0 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
1fe00 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50  ctor ){.      pP
1fe10 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
1fe20 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70  r(pPg, pPager->p
1fe30 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
1fe40 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61    .    /* When a
1fe50 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74  ll pages reach t
1fe60 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f  he freelist, dro
1fe70 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20  p the read lock 
1fe80 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
1fe90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
1fea0 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
1feb0 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73  ->nRef--;.    as
1fec0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52  sert( pPager->nR
1fed0 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ef>=0 );.    if(
1fee0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
1fef0 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78   && (!pPager->ex
1ff00 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
1ff10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1ff20 66 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 70 61  f>0) ){.      pa
1ff30 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
1ff40 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
1ff50 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c    }.  }.  pagerL
1ff60 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
1ff70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ff80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1ff90 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  e a journal file
1ffa0 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68   for pPager.  Th
1ffb0 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  ere should alrea
1ffc0 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
1ffd0 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45  .** or EXCLUSIVE
1ffe0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1fff0 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
20000 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
20010 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  called..**.** Re
20020 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
20030 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52  f everything.  R
20040 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
20050 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ode and release 
20060 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63  the.** write loc
20070 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  k if anything go
20080 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
20090 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
200a0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
200b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
200c0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
200d0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
200e0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
200f0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
20100 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
20110 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45  EXCLUSIVE|SQLITE
20120 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 0a  _OPEN_CREATE);..
20130 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
20140 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
20150 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20160 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
20170 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72  ERVED );.  asser
20180 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
20190 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61  alOpen==0 );.  a
201a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
201b0 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  seJournal );.  a
201c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
201d0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
201e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
201f0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
20200 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
20210 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  ager);.  pPager-
20220 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >aInJournal = sq
20230 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
20240 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f   pPager->dbSize/
20250 38 20 2b 20 31 20 29 3b 0a 20 20 70 61 67 65 72  8 + 1 );.  pager
20260 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
20270 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
20280 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
20290 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
202a0 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61  MEM;.    goto fa
202b0 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
202c0 72 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rnal;.  }..  if(
202d0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
202e0 65 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  e ){.    flags |
202f0 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  = (SQLITE_OPEN_D
20300 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c  ELETEONCLOSE|SQL
20310 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
20320 55 52 4e 41 4c 29 3b 0a 20 20 7d 65 6c 73 65 7b  URNAL);.  }else{
20330 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53  .    flags |= (S
20340 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
20350 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 7d 0a 23 69  JOURNAL);.  }.#i
20360 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
20370 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
20380 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
20390 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20  urnalOpen(.     
203a0 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
203b0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
203c0 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e  >jfd, flags, jrn
203d0 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
203e0 65 72 29 0a 20 20 29 3b 0a 23 65 6c 73 65 0a 20  er).  );.#else. 
203f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
20400 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
20410 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
20420 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
20430 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  0);.#endif.  ass
20440 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
20450 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66  OK || pPager->jf
20460 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20  d->pMethods );. 
20470 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20480 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Off = 0;.  pPage
20490 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
204a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
204b0 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66  nalHdr = 0;.  if
204c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
204d0 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
204e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
204f0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
20500 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
20510 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
20520 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20  .    }.    goto 
20530 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
20540 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50  ournal;.  }.  pP
20550 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
20560 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d  n = 1;.  pPager-
20570 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
20580 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
20590 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
205a0 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
205b0 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61  lback = 0;.  pPa
205c0 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
205d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
205e0 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Code ){.    rc =
205f0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
20600 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  ;.    goto faile
20610 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
20620 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  l;.  }.  pPager-
20630 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
20640 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
20650 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
20660 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a  alHdr(pPager);..
20670 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
20680 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63  mtAutoopen && rc
20690 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
206a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
206b0 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50  agerStmtBegin(pP
206c0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
206d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
206e0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
206f0 45 4d 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  EM && rc!=SQLITE
20700 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a  _IOERR_NOMEM ){.
20710 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
20720 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
20730 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
20740 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20750 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
20760 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
20770 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20780 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f  .failed_to_open_
20790 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74  journal:.  sqlit
207a0 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
207b0 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  aInJournal);.  p
207c0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
207d0 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  l = 0;.  return 
207e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  rc;.}../*.** Acq
207f0 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
20800 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
20810 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20  e.  The lock is 
20820 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20  removed when.** 
20830 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66  the any of the f
20840 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a  ollowing happen:
20850 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  .**.**   *  sqli
20860 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
20870 61 73 65 54 77 6f 28 29 20 69 73 20 63 61 6c 6c  aseTwo() is call
20880 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
20890 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
208a0 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
208b0 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
208c0 65 72 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  erClose() is cal
208d0 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
208e0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
208f0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e   is called to on
20900 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69   every outstandi
20910 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ng page..**.** T
20920 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74  he first paramet
20930 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  er to this routi
20940 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ne is a pointer 
20950 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65  to any open page
20960 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
20970 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69  ase file.  Nothi
20980 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74  ng changes about
20990 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69   the page - it i
209a0 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f  s used merely to
209b0 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f  .** acquire a po
209c0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
209d0 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
209e0 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74   as proof that t
209f0 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61  here is.** alrea
20a00 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  dy a read-lock o
20a10 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
20a20 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  **.** The second
20a30 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
20a40 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70  ates how much sp
20a50 61 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20  ace in bytes to 
20a60 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a  reserve for a.**
20a70 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
20a80 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65  file-name at the
20a90 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
20aa0 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73  urnal when it is
20ab0 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
20ac0 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  A journal file i
20ad0 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73  s opened if this
20ae0 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72   is not a tempor
20af0 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74  ary file.  For t
20b00 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65  emporary.** file
20b10 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f  s, the opening o
20b20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
20b30 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75  le is deferred u
20b40 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e  ntil there is an
20b50 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20  .** actual need 
20b60 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
20b70 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
20b80 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
20b90 73 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76  s already reserv
20ba0 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20  ed for writing, 
20bb0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
20bc0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
20bd0 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
20be0 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67  , go ahead and g
20bf0 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
20c00 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
20c10 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
20c20 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69  instead of waiti
20c30 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20  ng until we try 
20c40 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63  to flush the cac
20c50 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c  he.  The.** exFl
20c60 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  ag is ignored if
20c70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
20c80 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
20c90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20ca0 50 61 67 65 72 42 65 67 69 6e 28 44 62 50 61 67  PagerBegin(DbPag
20cb0 65 20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46 6c  e *pPg, int exFl
20cc0 61 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  ag){.  Pager *pP
20cd0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
20ce0 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
20cf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 61 67 65  QLITE_OK;.  page
20d00 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
20d10 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
20d20 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Ref>0 );.  asser
20d30 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
20d40 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
20d50 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
20d60 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
20d70 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  RED ){.    asser
20d80 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
20d90 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
20da0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
20db0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
20dc0 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
20dd0 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  VE;.      pPager
20de0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
20df0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
20e00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20e10 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
20e20 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  ck(pPager->fd, R
20e30 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
20e40 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
20e50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20e60 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
20e70 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  = PAGER_RESERVED
20e80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78  ;.        if( ex
20e90 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
20ea0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
20eb0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
20ec0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
20ed0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
20ee0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
20ef0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20f00 20 20 20 20 20 20 20 20 70 61 67 65 72 4c 65 61          pagerLea
20f10 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ve(pPager);.    
20f20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
20f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
20f40 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
20f50 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47 45 52  = 0;.      PAGER
20f60 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43 54  TRACE2("TRANSACT
20f70 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
20f80 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
20f90 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75     if( pPager->u
20fa0 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50  seJournal && !pP
20fb0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
20fc0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
20fd0 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
20fe0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
20ff0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
21000 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
21010 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67  rnalOpen && pPag
21020 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
21030 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
21040 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68   happens when th
21050 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
21060 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
21070 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a  mode last.    **
21080 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72   time a (read or
21090 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
210a0 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66  ion was successf
210b0 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20  ully concluded. 
210c0 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f     ** by this co
210d0 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61  nnection. Instea
210e0 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68  d of deleting th
210f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
21100 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65  t was .    ** ke
21110 70 74 20 6f 70 65 6e 20 61 6e 64 20 74 72 75 6e  pt open and trun
21120 63 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73  cated to 0 bytes
21130 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
21140 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
21150 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
21160 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  rt( pPager->orig
21170 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20  DbSize==0 );.   
21180 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21190 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
211a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
211b0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
211c0 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 4c 65  er);.    pagerLe
211d0 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
211e0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
211f0 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nal = sqlite3Mal
21200 6c 6f 63 5a 65 72 6f 28 20 70 50 61 67 65 72 2d  locZero( pPager-
21210 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
21220 0a 20 20 20 20 70 61 67 65 72 45 6e 74 65 72 28  .    pagerEnter(
21230 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
21240 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75   !pPager->aInJou
21250 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
21260 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
21270 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21280 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
21290 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
212a0 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63 20  bSize;.      rc 
212b0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
212c0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  r(pPager);.    }
212d0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
212e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
212f0 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  pen || pPager->j
21300 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72  ournalOff>0 || r
21310 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
21320 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
21330 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
21340 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
21350 20 61 20 70 61 67 65 20 64 69 72 74 79 2e 20 20   a page dirty.  
21360 53 65 74 20 69 74 73 20 64 69 72 74 79 20 66 6c  Set its dirty fl
21370 61 67 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f  ag and add it to
21380 20 74 68 65 20 64 69 72 74 79 0a 2a 2a 20 70 61   the dirty.** pa
21390 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ge list..*/.stat
213a0 69 63 20 76 6f 69 64 20 6d 61 6b 65 44 69 72 74  ic void makeDirt
213b0 79 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  y(PgHdr *pPg){. 
213c0 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 3d   if( pPg->dirty=
213d0 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  =0 ){.    Pager 
213e0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
213f0 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e  Pager;.    pPg->
21400 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70  dirty = 1;.    p
21410 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61  Pg->pDirty = pPa
21420 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ger->pDirty;.   
21430 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 44 69   if( pPager->pDi
21440 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 61  rty ){.      pPa
21450 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72  ger->pDirty->pPr
21460 65 76 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20  evDirty = pPg;. 
21470 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50     }.    pPg->pP
21480 72 65 76 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  revDirty = 0;.  
21490 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
214a0 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = pPg;.  }.}../
214b0 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65  *.** Make a page
214c0 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20 69   clean.  Clear i
214d0 74 73 20 64 69 72 74 79 20 62 69 74 20 61 6e 64  ts dirty bit and
214e0 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
214f0 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  the.** dirty pag
21500 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
21510 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e  c void makeClean
21520 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
21530 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  if( pPg->dirty )
21540 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  {.    pPg->dirty
21550 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
21560 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20  g->pDirty ){.   
21570 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
21580 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72  pDirty->pPrevDir
21590 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20  ty==pPg );.     
215a0 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50   pPg->pDirty->pP
215b0 72 65 76 44 69 72 74 79 20 3d 20 70 50 67 2d 3e  revDirty = pPg->
215c0 70 50 72 65 76 44 69 72 74 79 3b 0a 20 20 20 20  pPrevDirty;.    
215d0 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  }.    if( pPg->p
215e0 50 72 65 76 44 69 72 74 79 20 29 7b 0a 20 20 20  PrevDirty ){.   
215f0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
21600 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72  pPrevDirty->pDir
21610 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20  ty==pPg );.     
21620 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
21630 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e  ->pDirty = pPg->
21640 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73  pDirty;.    }els
21650 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
21660 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44   pPg->pPager->pD
21670 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20  irty==pPg );.   
21680 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
21690 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44  pDirty = pPg->pD
216a0 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  irty;.    }.  }.
216b0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  }.../*.** Mark a
216c0 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
216d0 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61  iteable.  The pa
216e0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
216f0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  to the journal .
21700 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  ** if it is not 
21710 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20  there already.  
21720 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
21730 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
21740 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61  re making.** cha
21750 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a  nges to a page..
21760 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
21770 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
21780 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
21790 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61   pager creates a
217a0 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   new.** journal 
217b0 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52  and acquires a R
217c0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
217d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
217e0 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a  f the RESERVED.*
217f0 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  * lock could not
21800 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68   be acquired, th
21810 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
21820 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  ns SQLITE_BUSY. 
21830 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
21840 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65  routine must che
21850 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75  ck for that retu
21860 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20  rn value and be 
21870 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a  careful not to.*
21880 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  * change any pag
21890 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69  e data until thi
218a0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
218b0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
218c0 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
218d0 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74  l file could not
218e0 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61   be written beca
218f0 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20  use the disk is 
21900 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  full,.** then th
21910 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
21920 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61  ns SQLITE_FULL a
21930 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64  nd does an immed
21940 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  iate rollback..*
21950 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  * All subsequent
21960 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20   write attempts 
21970 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  also return SQLI
21980 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68  TE_FULL until th
21990 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c  ere.** is a call
219a0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
219b0 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69  Commit() or sqli
219c0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
219d0 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a  () to.** reset..
219e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
219f0 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20  ger_write(PgHdr 
21a00 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70  *pPg){.  void *p
21a10 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Data = PGHDR_TO_
21a20 44 41 54 41 28 70 50 67 29 3b 0a 20 20 50 61 67  DATA(pPg);.  Pag
21a30 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
21a40 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
21a50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
21a60 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
21a70 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66  errors.  */.  if
21a80 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
21a90 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e  e ){ .    return
21aa0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
21ab0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
21ac0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  er->readOnly ){.
21ad0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21ae0 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61  E_PERM;.  }..  a
21af0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
21b00 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20  setMaster );..  
21b10 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
21b20 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
21b30 61 67 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  age was previous
21b40 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74 68  ly acquired with
21b50 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74   noContent==1, t
21b60 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 77  hat means.  ** w
21b70 65 20 64 69 64 6e 27 74 20 72 65 61 6c 6c 79 20  e didn't really 
21b80 72 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6e 74  read in the cont
21b90 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
21ba0 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65    This can happe
21bb0 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78 61 6d  n.  ** (for exam
21bc0 70 6c 65 29 20 77 68 65 6e 20 74 68 65 20 70 61  ple) when the pa
21bd0 67 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 76 65  ge is being move
21be0 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
21bf0 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f 77  t.  But.  ** now
21c00 20 77 65 20 61 72 65 20 28 70 65 72 68 61 70 73   we are (perhaps
21c10 29 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61 67  ) moving the pag
21c20 65 20 6f 66 66 20 6f 66 20 74 68 65 20 66 72 65  e off of the fre
21c30 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20 72  elist for.  ** r
21c40 65 75 73 65 20 61 6e 64 20 77 65 20 6e 65 65 64  euse and we need
21c50 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72 69   to know its ori
21c60 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73 6f  ginal content so
21c70 20 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20 20   that content.  
21c80 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  ** can be stored
21c90 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
21ca0 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64 6f   journal.  So do
21cb0 20 74 68 65 20 72 65 61 64 20 61 74 20 74 68 69   the read at thi
21cc0 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a  s.  ** time..  *
21cd0 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67  /.  rc = pager_g
21ce0 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b  et_content(pPg);
21cf0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
21d00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
21d10 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
21d20 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49  age as dirty.  I
21d30 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61  f the page has a
21d40 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
21d50 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
21d60 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20  journal then we 
21d70 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74  can return right
21d80 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61   away..  */.  ma
21d90 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
21da0 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  if( pPg->inJourn
21db0 61 6c 20 26 26 20 28 70 61 67 65 49 6e 53 74 61  al && (pageInSta
21dc0 74 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c 20 70  tement(pPg) || p
21dd0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
21de0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67  ==0) ){.    pPag
21df0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
21e00 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20   1;.  }else{..  
21e10 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
21e20 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
21e30 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
21e40 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
21e50 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ** written to th
21e60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
21e70 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65  urnal or the cke
21e80 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a  ckpoint journal.
21e90 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a      ** or both..
21ea0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69      **.    ** Fi
21eb0 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65  rst check to see
21ec0 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
21ed0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78  ction journal ex
21ee0 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ists and.    ** 
21ef0 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20  create it if it 
21f00 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f  does not..    */
21f10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
21f20 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
21f30 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  R_UNLOCK );.    
21f40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21f50 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a  rBegin(pPg, 0);.
21f60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21f70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
21f80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
21f90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
21fa0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
21fb0 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20  _RESERVED );.   
21fc0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
21fd0 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
21fe0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
21ff0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
22000 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
22010 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
22020 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22030 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
22040 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
22050 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22060 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d  Open || !pPager-
22070 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
22080 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
22090 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20  Cache = 1;.  .  
220a0 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
220b0 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
220c0 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
220d0 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
220e0 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
220f0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
22100 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
22110 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
22120 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
22130 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
22140 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
22150 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
22160 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
22170 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d  */.    if( !pPg-
22180 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
22190 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
221a0 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20  l || MEMDB) ){. 
221b0 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50       if( (int)pP
221c0 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
221d0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
221e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d  .        if( MEM
221f0 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  DB ){.          
22200 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
22210 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
22220 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
22230 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52           PAGERTR
22240 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE3("JOURNAL %d
22250 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
22260 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
22270 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
22280 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
22290 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20  t->pOrig==0 );. 
222a0 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e           pHist->
222b0 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 33 5f  pOrig = sqlite3_
222c0 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e  malloc( pPager->
222d0 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
222e0 20 20 20 20 20 20 69 66 28 20 21 70 48 69 73 74        if( !pHist
222f0 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
22300 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
22310 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
22320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22330 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e    memcpy(pHist->
22340 70 4f 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f  pOrig, PGHDR_TO_
22350 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
22360 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
22370 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22380 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d         u32 cksum
22390 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
223a0 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 20   *pData2;..     
223b0 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c       /* We shoul
223c0 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f  d never write to
223d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
223e0 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a  e the page that.
223f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
22400 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61  tains the databa
22410 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66  se locks.  The f
22420 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
22430 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20  verifies.       
22440 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
22450 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
22460 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
22470 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
22480 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
22490 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32 20           pData2 
224a0 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
224b0 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
224c0 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20  o, 7);.         
224d0 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63   cksum = pager_c
224e0 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
224f0 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  *)pData2);.     
22500 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
22510 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
22520 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
22530 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f  alOff, pPg->pgno
22540 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
22550 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22560 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
22570 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
22580 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
22590 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
225a0 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
225b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225c0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
225d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34 29  >journalOff + 4)
225e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  ;.            pP
225f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22600 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
22610 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20  Size+4;.        
22620 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
22630 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22640 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
22650 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
22660 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
22670 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
22680 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20   cksum);.       
22690 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
226a0 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20  rnalOff += 4;.  
226b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
226c0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f      IOTRACE(("JO
226d0 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64  UT %p %d %lld %d
226e0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
226f0 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20  ->pgno, .       
22700 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
22710 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
22720 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
22730 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41  ));.          PA
22740 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
22750 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
22760 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unt);.          
22770 50 41 47 45 52 54 52 41 43 45 35 28 22 4a 4f 55  PAGERTRACE5("JOU
22780 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
22790 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68  needSync=%d hash
227a0 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
227b0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
227c0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
227d0 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
227e0 79 6e 63 2c 20 70 61 67 65 72 5f 70 61 67 65 68  ync, pager_pageh
227f0 61 73 68 28 70 50 67 29 29 3b 0a 0a 20 20 20 20  ash(pPg));..    
22800 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f        /* An erro
22810 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 77 72  r has occured wr
22820 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
22830 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a  rnal file. The .
22840 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61            ** tra
22850 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
22860 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20   rolled back by 
22870 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e  the layer above.
22880 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
22890 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
228a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
228b0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
228c0 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rc;.          }.
228d0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
228e0 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  r->nRec++;.     
228f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
22900 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
22910 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
22920 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
22930 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
22940 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
22950 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  &7);.          p
22960 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
22970 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
22980 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
22990 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
229a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
229b0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
229c0 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
229d0 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
229e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
229f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
22a00 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d  se{.        pPg-
22a10 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
22a20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
22a30 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ted && !pPager->
22a40 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20  noSync;.        
22a50 50 41 47 45 52 54 52 41 43 45 34 28 22 41 50 50  PAGERTRACE4("APP
22a60 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e  END %d page %d n
22a70 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
22a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
22a90 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
22aa0 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
22ab0 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20  needSync);.     
22ac0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
22ad0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
22ae0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
22af0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
22b00 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69    }.      pPg->i
22b10 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
22b20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
22b30 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
22b40 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
22b50 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
22b60 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a  ot in it,.    **
22b70 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
22b80 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
22b90 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
22ba0 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
22bb0 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  t.    ** the sta
22bc0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
22bd0 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72  ormat differs fr
22be0 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
22bf0 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20  journal format. 
22c00 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74     ** in that it
22c10 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b   omits the check
22c20 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61  sums and the hea
22c30 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
22c40 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
22c50 49 6e 55 73 65 20 0a 20 20 20 20 20 26 26 20 21  InUse .     && !
22c60 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28  pageInStatement(
22c70 70 50 67 29 20 0a 20 20 20 20 20 26 26 20 28 69  pPg) .     && (i
22c80 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  nt)pPg->pgno<=pP
22c90 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a  ager->stmtSize .
22ca0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
22cb0 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
22cc0 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d  nal || (int)pPg-
22cd0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  >pgno>pPager->or
22ce0 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
22cf0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
22d00 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
22d10 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
22d20 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
22d30 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ger);.        as
22d40 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74  sert( pHist->pSt
22d50 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  mt==0 );.       
22d60 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
22d70 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
22d80 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
22d90 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
22da0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a  pHist->pStmt ){.
22db0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
22dc0 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50  (pHist->pStmt, P
22dd0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
22de0 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
22df0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ize);.        }.
22e00 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
22e10 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE3("STMT-JOURNA
22e20 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
22e30 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
22e40 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
22e50 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
22e60 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
22e70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
22e80 20 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65         i64 offse
22e90 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  t = pPager->stmt
22ea0 4e 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  NRec*(4+pPager->
22eb0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
22ec0 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 20     char *pData2 
22ed0 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
22ee0 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
22ef0 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 72  o, 7);.        r
22f00 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
22f10 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 6f 66  pPager->stfd, of
22f20 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  fset, pPg->pgno)
22f30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
22f40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22f50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
22f60 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
22f70 67 65 72 2d 3e 73 74 66 64 2c 20 70 44 61 74 61  ger->stfd, pData
22f80 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
22f90 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
22fa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22fb0 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 53    PAGERTRACE3("S
22fc0 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
22fd0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
22fe0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
22ff0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
23000 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23010 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
23020 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
23030 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
23040 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a  er->stmtNRec++;.
23050 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23060 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21  pPager->aInStmt!
23070 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  =0 );.        pP
23080 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
23090 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
230a0 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
230b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
230c0 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
230d0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
230e0 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
230f0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
23100 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
23110 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28  _SHARED );.  if(
23120 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
23130 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29  (int)pPg->pgno )
23140 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
23150 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
23160 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ;.    if( !MEMDB
23170 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
23180 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ze==PENDING_BYTE
23190 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
231a0 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
231b0 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20  r->dbSize++;.   
231c0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
231d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
231e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
231f0 65 64 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74  ed to mark a dat
23200 61 2d 70 61 67 65 20 61 73 20 77 72 69 74 61 62  a-page as writab
23210 6c 65 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20  le. It uses .** 
23220 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f  pager_write() to
23230 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20   open a journal 
23240 66 69 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e  file (if it is n
23250 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29  ot already open)
23260 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
23270 65 20 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f  e page *pData to
23280 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
23290 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
232a0 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
232b0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67  function and pag
232c0 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68  er_write() is th
232d0 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  at this.** funct
232e0 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77  ion also deals w
232f0 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20  ith the special 
23300 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20  case where 2 or 
23310 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69  more pages.** fi
23320 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69  t on a single di
23330 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68  sk sector. In th
23340 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72  is case all co-r
23350 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a  esident pages.**
23360 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
23370 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
23380 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
23390 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
233a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
233b0 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70  rWrite(DbPage *p
233c0 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  DbPage){.  int r
233d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
233e0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70    PgHdr *pPg = p
233f0 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20  DbPage;.  Pager 
23400 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
23410 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50  Pager;.  Pgno nP
23420 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28  agePerSector = (
23430 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
23440 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ze/pPager->pageS
23450 69 7a 65 29 3b 0a 0a 20 20 70 61 67 65 72 45 6e  ize);..  pagerEn
23460 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
23470 66 28 20 21 4d 45 4d 44 42 20 26 26 20 6e 50 61  f( !MEMDB && nPa
23480 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b  gePerSector>1 ){
23490 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43  .    Pgno nPageC
234a0 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f  ount;          /
234b0 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
234c0 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
234d0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
234e0 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20  Pgno pg1;       
234f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
23500 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
23510 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
23520 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ated on. */.    
23530 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
23540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
23550 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61  ber of pages sta
23560 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20  rting at pg1 to 
23570 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69  journal */.    i
23580 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e  nt ii;.    int n
23590 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20  eedSync = 0;..  
235a0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e    /* Set the doN
235b0 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31  otSync flag to 1
235c0 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
235d0 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f  e we cannot allo
235e0 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  w a journal.    
235f0 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20  ** header to be 
23600 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20  written between 
23610 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61  the pages journa
23620 6c 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  led by this func
23630 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
23640 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
23650 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b  >doNotSync==0 );
23660 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
23670 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20  otSync = 1;..   
23680 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61   /* This trick a
23690 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68  ssumes that both
236a0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
236b0 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61  nd sector-size a
236c0 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74  re.    ** an int
236d0 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e  eger power of 2.
236e0 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c   It sets variabl
236f0 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65  e pg1 to the ide
23700 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f  ntifier.    ** o
23710 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  f the first page
23720 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
23730 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
23740 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31  ..    */.    pg1
23750 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31   = ((pPg->pgno-1
23760 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65  ) & ~(nPagePerSe
23770 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20  ctor-1)) + 1;.. 
23780 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20     nPageCount = 
23790 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
237a0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
237b0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
237c0 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
237d0 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50       nPage = (pP
237e0 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31  g->pgno - pg1)+1
237f0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
23800 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63  (pg1+nPagePerSec
23810 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e  tor-1)>nPageCoun
23820 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  t ){.      nPage
23830 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d   = nPageCount+1-
23840 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pg1;.    }else{.
23850 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50        nPage = nP
23860 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20  agePerSector;.  
23870 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e    }.    assert(n
23880 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73  Page>0);.    ass
23890 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67  ert(pg1<=pPg->pg
238a0 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  no);.    assert(
238b0 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d  (pg1+nPage)>pPg-
238c0 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72  >pgno);..    for
238d0 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20  (ii=0; ii<nPage 
238e0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
238f0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50  ; ii++){.      P
23900 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b  gno pg = pg1+ii;
23910 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
23920 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21  age;.      if( !
23930 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
23940 61 6c 20 7c 7c 20 70 67 3d 3d 70 50 67 2d 3e 70  al || pg==pPg->p
23950 67 6e 6f 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  gno || .        
23960 20 20 70 67 3e 70 50 61 67 65 72 2d 3e 6f 72 69    pg>pPager->ori
23970 67 44 62 53 69 7a 65 20 7c 7c 20 21 28 70 50 61  gDbSize || !(pPa
23980 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
23990 70 67 2f 38 5d 26 28 31 3c 3c 28 70 67 26 37 29  pg/8]&(1<<(pg&7)
239a0 29 29 0a 20 20 20 20 20 20 29 20 7b 0a 20 20 20  )).      ) {.   
239b0 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47       if( pg!=PAG
239c0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
239d0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
239e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
239f0 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c  rGet(pPager, pg,
23a00 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
23a10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
23a20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23a30 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
23a40 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
23a50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
23a60 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  age->needSync ){
23a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
23a80 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
23a90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23aa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
23ab0 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
23ac0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23ad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
23ae0 73 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20  se if( (pPage = 
23af0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
23b00 67 65 72 2c 20 70 67 29 29 20 29 7b 0a 20 20 20  ger, pg)) ){.   
23b10 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
23b20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
23b30 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
23b40 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
23b50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
23b60 20 2f 2a 20 49 66 20 74 68 65 20 50 67 48 64 72   /* If the PgHdr
23b70 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
23b80 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66  s set for any of
23b90 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73   the nPage pages
23ba0 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e   .    ** startin
23bb0 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69  g at pg1, then i
23bc0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65  t needs to be se
23bd0 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  t for all of the
23be0 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a  m. Because.    *
23bf0 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79  * writing to any
23c00 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20   of these nPage 
23c10 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65  pages may damage
23c20 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65   the others, the
23c30 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
23c40 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69  file must contai
23c50 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65  n sync()ed copie
23c60 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d  s of all of them
23c70 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61  .    ** before a
23c80 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62  ny of them can b
23c90 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
23ca0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23cb0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
23cc0 66 28 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  f( needSync ){. 
23cd0 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
23ce0 69 3c 6e 50 61 67 65 20 26 26 20 6e 65 65 64 53  i<nPage && needS
23cf0 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ync; ii++){.    
23d00 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
23d10 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
23d20 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b  pPager, pg1+ii);
23d30 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
23d40 67 65 20 29 20 70 50 61 67 65 2d 3e 6e 65 65 64  ge ) pPage->need
23d50 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
23d60 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  }.      assert(p
23d70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29  Pager->needSync)
23d80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
23d90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
23da0 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20  otSync==1 );.   
23db0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
23dc0 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  nc = 0;.  }else{
23dd0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
23de0 77 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  write(pDbPage);.
23df0 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65    }.  pagerLeave
23e00 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
23e10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23e20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
23e30 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e  he page given in
23e40 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61   the argument wa
23e50 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73  s previously pas
23e60 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  sed.** to sqlite
23e70 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20  3PagerWrite().  
23e80 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
23e90 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  return TRUE if i
23ea0 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68  t is ok.** to ch
23eb0 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  ange the content
23ec0 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
23ed0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
23ee0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
23ef0 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61  Iswriteable(DbPa
23f00 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
23f10 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d  rn pPg->dirty;.}
23f20 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
23f30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43   SQLITE_OMIT_VAC
23f40 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63  UUM./*.** Replac
23f50 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
23f60 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77   a single page w
23f70 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ith the informat
23f80 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64  ion in the third
23f90 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  .** argument..*/
23fa0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
23fb0 72 4f 76 65 72 77 72 69 74 65 28 50 61 67 65 72  rOverwrite(Pager
23fc0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
23fd0 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61  gno, void *pData
23fe0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
23ff0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 70 61  .  int rc;..  pa
24000 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
24010 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
24020 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
24030 20 70 67 6e 6f 2c 20 26 70 50 67 29 3b 0a 20 20   pgno, &pPg);.  
24040 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24050 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
24060 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
24070 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
24080 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24090 20 20 20 20 20 6d 65 6d 63 70 79 28 73 71 6c 69       memcpy(sqli
240a0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
240b0 70 50 67 29 2c 20 70 44 61 74 61 2c 20 70 50 61  pPg), pData, pPa
240c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
240d0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
240e0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
240f0 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61  ;.  }.  pagerLea
24100 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
24110 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
24120 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  f../*.** A call 
24130 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
24140 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
24150 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e  that it is not n
24160 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77  ecessary to.** w
24170 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61  rite the informa
24180 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67  tion on page pPg
24190 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73   back to the dis
241a0 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a  k, even though.*
241b0 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68  * that page migh
241c0 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  t be marked as d
241d0 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  irty..**.** The 
241e0 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61  overlying softwa
241f0 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74  re layer calls t
24200 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
24210 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61   all of the data
24220 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  .** on the given
24230 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e   page is unused.
24240 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b    The pager mark
24250 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  s the page as cl
24260 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ean so.** that i
24270 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77  t does not get w
24280 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a  ritten to disk..
24290 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77  **.** Tests show
242a0 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d   that this optim
242b0 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65  ization, togethe
242c0 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71  r with the.** sq
242d0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
242e0 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20  llback() below, 
242f0 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65  more than double
24300 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66   the speed.** of
24310 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70   large INSERT op
24320 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61  erations and qua
24330 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64  druple the speed
24340 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45   of large DELETE
24350 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  s..**.** When th
24360 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
24370 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c  lled, set the al
24380 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
24390 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75  g to true..** Su
243a0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
243b0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  o sqlite3PagerDo
243c0 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  ntRollback() for
243d0 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a   the same page.*
243e0 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65  * will thereafte
243f0 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54  r be ignored.  T
24400 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
24410 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62   to avoid a prob
24420 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70  lem.** where a p
24430 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73  age with data is
24440 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
24450 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e  eelist during on
24460 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74  e part of.** a t
24470 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20  ransaction then 
24480 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
24490 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
244a0 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a   a later part.**
244b0 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61   of the same tra
244c0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75  nsaction and reu
244d0 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  sed for some oth
244e0 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65  er purpose.  Whe
244f0 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74  n it.** is first
24500 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
24510 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75  eelist, this rou
24520 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
24530 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a   When reused,.**
24540 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
24550 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
24560 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
24570 64 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20  d.  But because 
24580 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74  the.** page cont
24590 61 69 6e 73 20 63 72 69 74 69 63 61 6c 20 64 61  ains critical da
245a0 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  ta, we still nee
245b0 64 20 74 6f 20 62 65 20 73 75 72 65 20 69 74 20  d to be sure it 
245c0 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  gets.** rolled b
245d0 61 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66 20  ack in spite of 
245e0 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
245f0 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63  DontRollback() c
24600 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  all..*/.void sql
24610 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
24620 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61  te(DbPage *pDbPa
24630 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ge){.  PgHdr *pP
24640 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50  g = pDbPage;.  P
24650 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
24660 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69  Pg->pPager;..  i
24670 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72  f( MEMDB ) retur
24680 6e 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  n;.  pagerEnter(
24690 70 50 61 67 65 72 29 3b 0a 20 20 70 50 67 2d 3e  pPager);.  pPg->
246a0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
246b0 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64   1;.  if( pPg->d
246c0 69 72 74 79 20 26 26 20 21 70 50 61 67 65 72 2d  irty && !pPager-
246d0 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
246e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
246f0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
24700 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28  HARED );.    if(
24710 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
24720 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  =(int)pPg->pgno 
24730 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  && pPager->origD
24740 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
24750 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
24760 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69   If this pages i
24770 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
24780 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  in the file and 
24790 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f  the file has gro
247a0 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69  wn.      ** duri
247b0 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ng the current t
247c0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
247d0 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65   do NOT mark the
247e0 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a   page as clean..
247f0 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68        ** When th
24800 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24810 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d  grows, we must m
24820 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
24830 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20  e last page.    
24840 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65    ** gets writte
24850 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20  n at least once 
24860 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b  so that the disk
24870 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68   file will be th
24880 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20  e correct.      
24890 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20  ** size. If you 
248a0 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69  do not write thi
248b0 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73  s page and the s
248c0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a  ize of the file.
248d0 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
248e0 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69  disk ends up bei
248f0 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68  ng too small, th
24900 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  at can lead to d
24910 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
24920 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69   corruption duri
24930 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e  ng the next tran
24940 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
24950 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
24960 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
24970 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20  DONT_WRITE page 
24980 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
24990 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
249a0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
249b0 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20  IOTRACE(("CLEAN 
249c0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
249d0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20  , pPg->pgno)).  
249e0 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
249f0 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  g);.#ifdef SQLIT
24a00 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
24a10 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
24a20 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
24a30 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
24a40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65      }.  }.  page
24a50 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
24a60 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  }../*.** A call 
24a70 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
24a80 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
24a90 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61  that if a rollba
24aa0 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74  ck occurs,.** it
24ab0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
24ac0 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
24ad0 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76   data on the giv
24ae0 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a  en page.  This.*
24af0 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  * means that the
24b00 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20   pager does not 
24b10 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74  have to record t
24b20 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e  he given page in
24b30 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b   the.** rollback
24b40 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
24b50 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79  If we have not y
24b60 65 74 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  et actually read
24b70 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
24b80 74 68 69 73 20 70 61 67 65 20 28 69 66 0a 2a 2a  this page (if.**
24b90 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52   the PgHdr.needR
24ba0 65 61 64 20 66 6c 61 67 20 69 73 20 73 65 74 29  ead flag is set)
24bb0 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
24bc0 6e 65 20 61 63 74 73 20 61 73 20 61 20 70 72 6f  ne acts as a pro
24bd0 6d 69 73 65 0a 2a 2a 20 74 68 61 74 20 77 65 20  mise.** that we 
24be0 77 69 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64 20  will never need 
24bf0 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65  to read the page
24c00 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20   content in the 
24c10 66 75 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68  future..** so th
24c20 65 20 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20  e needRead flag 
24c30 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 61  can be cleared a
24c40 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f  t this point..*/
24c50 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
24c60 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44  erDontRollback(D
24c70 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50  bPage *pPg){.  P
24c80 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
24c90 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 70  Pg->pPager;..  p
24ca0 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
24cb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
24cc0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
24cd0 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
24ce0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
24cf0 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74  nalOpen==0 ) ret
24d00 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  urn;.  if( pPg->
24d10 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c  alwaysRollback |
24d20 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73  | pPager->always
24d30 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44  Rollback || MEMD
24d40 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  B ) return;.  if
24d50 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
24d60 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  l && (int)pPg->p
24d70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
24d80 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
24d90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24da0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >aInJournal!=0 )
24db0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
24dc0 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67  nJournal[pPg->pg
24dd0 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
24de0 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70  ->pgno&7);.    p
24df0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
24e00 31 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  1;.    pPg->need
24e10 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 69 66  Read = 0;.    if
24e20 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
24e30 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Use ){.      pPa
24e40 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
24e50 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
24e60 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
24e70 20 20 20 7d 0a 20 20 20 20 50 41 47 45 52 54 52     }.    PAGERTR
24e80 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42  ACE3("DONT_ROLLB
24e90 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25  ACK page %d of %
24ea0 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
24eb0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
24ec0 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  );.    IOTRACE((
24ed0 22 47 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e  "GARBAGE %p %d\n
24ee0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
24ef0 70 67 6e 6f 29 29 0a 20 20 7d 0a 20 20 69 66 28  pgno)).  }.  if(
24f00 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
24f10 73 65 20 0a 20 20 20 26 26 20 21 70 61 67 65 49  se .   && !pageI
24f20 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20  nStatement(pPg) 
24f30 0a 20 20 20 26 26 20 28 69 6e 74 29 70 50 67 2d  .   && (int)pPg-
24f40 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  >pgno<=pPager->s
24f50 74 6d 74 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20  tmtSize .  ){.  
24f60 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
24f70 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
24f80 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65  )pPg->pgno>pPage
24f90 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
24fa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
24fb0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20  ger->aInStmt!=0 
24fc0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
24fd0 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
24fe0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
24ff0 70 67 6e 6f 26 37 29 3b 0a 20 20 7d 0a 20 20 70  pgno&7);.  }.  p
25000 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
25010 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  );.}.../*.** Thi
25020 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
25030 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
25040 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25050 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
25060 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20  r,.** stored at 
25070 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70  byte 24 of the p
25080 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  ager file..*/.st
25090 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
250a0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
250b0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
250c0 20 69 6e 74 20 69 73 44 69 72 65 63 74 29 7b 0a   int isDirect){.
250d0 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
250e0 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f  .  u32 change_co
250f0 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  unter;.  int rc 
25100 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
25110 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61  if( !pPager->cha
25120 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a  ngeCountDone ){.
25130 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
25140 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66   1 of the file f
25150 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20  or writing. */. 
25160 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
25170 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
25180 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20  1, &pPgHdr);.   
25190 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
251a0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
251b0 0a 20 20 20 20 69 66 28 20 21 69 73 44 69 72 65  .    if( !isDire
251c0 63 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ct ){.      rc =
251d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
251e0 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  te(pPgHdr);.    
251f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25200 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
25210 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
25220 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20  (pPgHdr);.      
25230 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
25240 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
25250 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
25260 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64   value just read
25270 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61   and write it ba
25280 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a  ck to byte 24. *
25290 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75  /.    change_cou
252a0 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65  nter = sqlite3Ge
252b0 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 61 67  t4byte((u8*)pPag
252c0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b  er->dbFileVers);
252d0 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  .    change_coun
252e0 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32  ter++;.    put32
252f0 62 69 74 73 28 28 28 63 68 61 72 2a 29 50 47 48  bits(((char*)PGH
25300 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64  DR_TO_DATA(pPgHd
25310 72 29 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63  r))+24, change_c
25320 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 69 66  ounter);..    if
25330 28 20 69 73 44 69 72 65 63 74 20 26 26 20 70 50  ( isDirect && pP
25340 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
25350 64 73 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ds ){.      cons
25360 74 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20 50  t void *zBuf = P
25370 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
25380 48 64 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Hdr);.      rc =
25390 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
253a0 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66  pPager->fd, zBuf
253b0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
253c0 7a 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  ze, 0);.    }.. 
253d0 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
253e0 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  e page reference
253f0 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
25400 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
25410 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
25420 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
25430 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
25440 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
25450 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
25460 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61   file for the pa
25470 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73  ger pPager. zMas
25480 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ter points to th
25490 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d  e name.** of a m
254a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
254b0 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
254c0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
254d0 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a  he individual.**
254e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a   journal file. z
254f0 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55  Master may be NU
25500 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74  LL, which is int
25510 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d  erpreted as no m
25520 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
25530 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62   (a single datab
25540 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
25550 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
25560 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61  tine ensures tha
25570 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
25580 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72   synced, all dir
25590 74 79 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  ty pages written
255a0 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
255b0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
255c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
255d0 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20  ynced. The only 
255e0 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65  thing that.** re
255f0 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20  mains to commit 
25600 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
25610 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
25620 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
25630 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  r.** master jour
25640 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63  nal file if spec
25650 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  ified)..**.** No
25660 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74  te that if zMast
25670 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64  er==NULL, this d
25680 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74  oes not overwrit
25690 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c  e a previous val
256a0 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  ue.** passed to 
256b0 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  an sqlite3PagerC
256c0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
256d0 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  call..**.** If p
256e0 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20  arameter nTrunc 
256f0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
25700 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
25710 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f   is truncated to
25720 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73  .** nTrunc pages
25730 20 28 74 68 69 73 20 69 73 20 75 73 65 64 20 62   (this is used b
25740 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
25750 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74  tabases)..*/.int
25760 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
25770 6d 69 74 50 68 61 73 65 4f 6e 65 28 50 61 67 65  mitPhaseOne(Page
25780 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
25790 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
257a0 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a 20 20  Pgno nTrunc){.  
257b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
257c0 4f 4b 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43  OK;..  PAGERTRAC
257d0 45 34 28 22 44 41 54 41 42 41 53 45 20 53 59 4e  E4("DATABASE SYN
257e0 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74  C: File=%s zMast
257f0 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c  er=%s nTrunc=%d\
25800 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  n", .      pPage
25810 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d  r->zFilename, zM
25820 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  aster, nTrunc);.
25830 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
25840 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ger);..  /* If t
25850 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
25860 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61  ory db, or no pa
25870 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
25880 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69  itten to, or thi
25890 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
258a0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
258b0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
258c0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
258d0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
258e0 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26  !=PAGER_SYNCED &
258f0 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  & !MEMDB && pPag
25900 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29  er->dirtyCache )
25910 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
25920 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
25930 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
25940 52 49 54 45 0a 20 20 20 20 2f 2a 20 54 68 65 20  RITE.    /* The 
25950 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
25960 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
25970 20 75 73 65 64 20 69 66 20 61 6c 6c 20 6f 66 20   used if all of 
25980 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  the.    ** follo
25990 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
259a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
259b0 2b 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65  + The file-syste
259c0 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61  m supports the a
259d0 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70  tomic-write prop
259e0 65 72 74 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20  erty for.    ** 
259f0 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73       blocks of s
25a00 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61  ize page-size, a
25a10 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  nd.    **    + T
25a20 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f  his commit is no
25a30 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  t part of a mult
25a40 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69  i-file transacti
25a50 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20  on, and.    **  
25a60 20 20 2b 20 45 78 61 63 74 6c 79 20 6f 6e 65 20    + Exactly one 
25a70 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  page has been mo
25a80 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65  dified and store
25a90 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
25aa0 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
25ab0 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d   ** If the optim
25ac0 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
25ad0 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  sed, then the jo
25ae0 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
25af0 6e 65 76 65 72 0a 20 20 20 20 2a 2a 20 62 65 20  never.    ** be 
25b00 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69 73  created for this
25b10 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
25b20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 65    */.    int use
25b30 41 74 6f 6d 69 63 57 72 69 74 65 20 3d 20 28 0a  AtomicWrite = (.
25b40 20 20 20 20 20 20 20 20 21 7a 4d 61 73 74 65 72          !zMaster
25b50 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61   && .        pPa
25b60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
25b70 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28  =jrnlBufferSize(
25b80 70 50 61 67 65 72 29 20 26 26 20 0a 20 20 20 20  pPager) && .    
25b90 20 20 20 20 6e 54 72 75 6e 63 3d 3d 30 20 26 26      nTrunc==0 &&
25ba0 20 0a 20 20 20 20 20 20 20 20 28 30 3d 3d 70 50   .        (0==pP
25bb0 61 67 65 72 2d 3e 70 44 69 72 74 79 20 7c 7c 20  ager->pDirty || 
25bc0 30 3d 3d 70 50 61 67 65 72 2d 3e 70 44 69 72 74  0==pPager->pDirt
25bd0 79 2d 3e 70 44 69 72 74 79 29 0a 20 20 20 20 29  y->pDirty).    )
25be0 3b 0a 20 20 20 20 69 66 28 20 75 73 65 41 74 6f  ;.    if( useAto
25bf0 6d 69 63 57 72 69 74 65 20 29 7b 0a 20 20 20 20  micWrite ){.    
25c00 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
25c10 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68  nRec field in th
25c20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
25c30 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 66 66  */.      int off
25c40 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  set = pPager->jo
25c50 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
25c60 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
25c70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
25c80 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b  Pager->nRec==1);
25c90 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
25ca0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
25cb0 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 61  jfd, offset, pPa
25cc0 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20  ger->nRec);..   
25cd0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
25ce0 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20   db file change 
25cf0 63 6f 75 6e 74 65 72 2e 20 54 68 65 20 66 6f 6c  counter. The fol
25d00 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c  lowing call will
25d10 20 6d 6f 64 69 66 79 0a 20 20 20 20 20 20 2a 2a   modify.      **
25d20 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
25d30 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
25d40 20 70 61 67 65 20 31 20 74 6f 20 69 6e 63 6c 75   page 1 to inclu
25d50 64 65 20 74 68 65 20 75 70 64 61 74 65 64 0a 20  de the updated. 
25d60 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 20 63       ** change c
25d70 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20  ounter and then 
25d80 77 72 69 74 65 20 70 61 67 65 20 31 20 64 69 72  write page 1 dir
25d90 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74  ectly to the dat
25da0 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  abase.      ** f
25db0 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20  ile. Because of 
25dc0 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
25dd0 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
25de0 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65   host file-syste
25df0 6d 2c 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  m, .      ** thi
25e00 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20  s is safe..     
25e10 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63   */.      if( rc
25e20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25e30 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
25e40 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
25e50 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b  nter(pPager, 1);
25e60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
25e70 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
25e80 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65  qlite3JournalCre
25e90 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ate(pPager->jfd)
25ea0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
25eb0 20 21 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65   !useAtomicWrite
25ec0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
25ed0 4b 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  K ).#endif..    
25ee0 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  /* If a master j
25ef0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
25f00 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
25f10 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
25f20 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
25f30 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79  file, then no sy
25f40 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  nc is required. 
25f50 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
25f60 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77  n it is.    ** w
25f70 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65  ritten, then the
25f80 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74   process fails t
25f90 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61  o upgrade from a
25fa0 20 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a   RESERVED to an.
25fb0 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
25fc0 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20   lock. The next 
25fd0 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73  time the process
25fe0 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74   tries to commit
25ff0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
26000 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20  saction the m-j 
26010 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61  name will have a
26020 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
26030 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
26040 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  if( !pPager->set
26050 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Master ){.      
26060 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
26070 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
26080 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
26090 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
260a0 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  er(pPager, 0);. 
260b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
260c0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
260d0 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66  nc_exit;.#ifndef
260e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
260f0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
26100 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ( nTrunc!=0 ){. 
26110 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
26120 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  s transaction ha
26130 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62  s made the datab
26140 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65  ase smaller, the
26150 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20  n all pages.    
26160 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73      ** being dis
26170 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72  carded by the tr
26180 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  uncation must be
26190 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
261a0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
261b0 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  ** file..       
261c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
261d0 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   i;.        int 
261e0 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a  iSkip = PAGER_MJ
261f0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20  _PGNO(pPager);. 
26200 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e 54         for( i=nT
26210 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65  runc+1; i<=pPage
26220 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20 69  r->origDbSize; i
26230 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ++ ){.          
26240 69 66 28 20 21 28 70 50 61 67 65 72 2d 3e 61 49  if( !(pPager->aI
26250 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20  nJournal[i/8] & 
26260 28 31 3c 3c 28 69 26 37 29 29 29 20 26 26 20 69  (1<<(i&7))) && i
26270 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  !=iSkip ){.     
26280 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
26290 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
262a0 65 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20 20  er, i, &pPg);.  
262b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
262c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
262d0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
262e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
262f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
26300 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  (pPg);.         
26310 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
26320 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
26330 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
26340 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
26350 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
26360 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
26370 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66   .      }.#endif
26380 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
26390 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  eMasterJournal(p
263a0 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
263b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
263c0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
263d0 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
263e0 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
263f0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  l(pPager);.    }
26400 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
26410 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
26420 6e 63 5f 65 78 69 74 3b 0a 0a 23 69 66 6e 64 65  nc_exit;..#ifnde
26430 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
26440 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
26450 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
26460 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26470 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 50  PagerTruncate(pP
26480 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20  ager, nTrunc);. 
26490 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
264a0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
264b0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23  nc_exit;.    }.#
264c0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72  endif..    /* Wr
264d0 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ite all dirty pa
264e0 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
264f0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
26500 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f  pPg = pager_get_
26510 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
26520 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20  pPager);.    rc 
26530 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
26540 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  gelist(pPg);.   
26550 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26560 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c  OK ){.      whil
26570 65 28 20 70 50 67 20 26 26 20 21 70 50 67 2d 3e  e( pPg && !pPg->
26580 64 69 72 74 79 20 29 7b 20 70 50 67 20 3d 20 70  dirty ){ pPg = p
26590 50 67 2d 3e 70 44 69 72 74 79 3b 20 7d 0a 20 20  Pg->pDirty; }.  
265a0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
265b0 74 79 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20  ty = pPg;.      
265c0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
265d0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
265e0 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 0a 20  ->pDirty = 0;.. 
265f0 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64     /* Sync the d
26600 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
26610 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
26620 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
26630 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
26640 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
26650 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
26660 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ags);.    }.    
26670 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43  IOTRACE(("DBSYNC
26680 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
26690 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
266a0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43  ate = PAGER_SYNC
266b0 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
266c0 4d 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21  MEMDB && nTrunc!
266d0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
266e0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
266f0 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75  ate(pPager, nTru
26700 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65  nc);.  }..sync_e
26710 78 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  xit:.  if( rc==S
26720 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
26730 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61  KED ){.    /* pa
26740 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
26750 6f 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74  ounter() may att
26760 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61  empt to obtain a
26770 6e 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20  n exclusive.    
26780 20 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c   * lock to spill
26790 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72   the cache and r
267a0 65 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43  eturn IOERR_BLOC
267b0 4b 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a  KED. But since .
267c0 20 20 20 20 20 2a 20 74 68 65 72 65 20 69 73 20       * there is 
267d0 6e 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63 61  no chance the ca
267e0 63 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74  che is inconsist
267f0 65 6e 74 2c 20 69 74 27 73 0a 20 20 20 20 20 2a  ent, it's.     *
26800 20 62 65 74 74 65 72 20 74 6f 20 72 65 74 75 72   better to retur
26810 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20  n SQLITE_BUSY.. 
26820 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
26830 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
26840 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
26850 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
26860 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc;.}.../*.** Co
26870 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73  mmit all changes
26880 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
26890 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
268a0 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a   write lock..**.
268b0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  ** If the commit
268c0 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
268d0 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63  eason, a rollbac
268e0 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  k attempt is mad
268f0 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  e.** and an erro
26900 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
26910 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  ed.  If the comm
26920 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54  it worked, SQLIT
26930 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
26940 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
26950 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
26960 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50  aseTwo(Pager *pP
26970 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
26980 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
26990 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
269a0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74  rCode ){.    ret
269b0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
269c0 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
269d0 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
269e0 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
269f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26a00 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 61  _ERROR;.  }.  pa
26a10 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
26a20 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
26a30 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  "COMMIT %d\n", P
26a40 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
26a50 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
26a60 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
26a70 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
26a80 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
26a90 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20   while( pPg ){. 
26aa0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
26ab0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
26ac0 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
26ad0 72 29 3b 0a 20 20 20 20 20 20 63 6c 65 61 72 48  r);.      clearH
26ae0 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20  istory(pHist);. 
26af0 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
26b00 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
26b10 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
26b20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74       pHist->inSt
26b30 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
26b40 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
26b50 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50  .      pHist->pP
26b60 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d  revStmt = pHist-
26b70 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
26b80 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d        pPg = pPg-
26b90 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  >pDirty;.    }. 
26ba0 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
26bb0 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e  y = 0;.#ifndef N
26bc0 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50  DEBUG.    for(pP
26bd0 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
26be0 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
26bf0 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50  extAll){.      P
26c00 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
26c10 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
26c20 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
26c30 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67      assert( !pPg
26c40 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
26c50 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
26c60 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  ( !pHist->pOrig 
26c70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26c80 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29   !pHist->pStmt )
26c90 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
26ca0 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
26cb0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
26cc0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
26cd0 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75  SHARED;.    retu
26ce0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
26cf0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
26d00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
26d10 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74  || !pPager->dirt
26d20 79 43 61 63 68 65 20 29 3b 0a 20 20 61 73 73 65  yCache );.  asse
26d30 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
26d40 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e==PAGER_SYNCED 
26d50 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74  || !pPager->dirt
26d60 79 43 61 63 68 65 20 29 3b 0a 20 20 72 63 20 3d  yCache );.  rc =
26d70 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
26d80 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
26d90 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
26da0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
26db0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
26dc0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
26dd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
26de0 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
26df0 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  .  The database 
26e00 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41  falls back to PA
26e10 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e  GER_SHARED mode.
26e20 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  .** All in-memor
26e30 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65  y cache pages re
26e40 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72  vert to their or
26e50 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74  iginal data cont
26e60 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75  ents..** The jou
26e70 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e  rnal is deleted.
26e80 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
26e90 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ine cannot fail 
26ea0 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65  unless some othe
26eb0 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74  r process is not
26ec0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68   following.** th
26ed0 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e  e correct lockin
26ee0 67 20 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e  g protocol or un
26ef0 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a  less some other.
26f00 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72  ** process is wr
26f10 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f  iting trash into
26f20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
26f30 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e (SQLITE_CORRUP
26f40 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20  T) or.** unless 
26f50 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29  a prior malloc()
26f60 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f   failed (SQLITE_
26f70 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72  NOMEM).  Appropr
26f80 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  iate error.** co
26f90 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  des are returned
26fa0 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f   for all these o
26fb0 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72  ccasions.  Other
26fc0 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  wise,.** SQLITE_
26fd0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
26fe0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
26ff0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  gerRollback(Page
27000 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
27010 74 20 72 63 3b 0a 20 20 50 41 47 45 52 54 52 41  t rc;.  PAGERTRA
27020 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64  CE2("ROLLBACK %d
27030 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
27040 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ger));.  if( MEM
27050 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  DB ){.    PgHdr 
27060 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50  *p;.    for(p=pP
27070 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70  ager->pAll; p; p
27080 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  =p->pNextAll){. 
27090 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
270a0 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73  pHist;.      ass
270b0 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52  ert( !p->alwaysR
270c0 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  ollback );.     
270d0 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29   if( !p->dirty )
270e0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
270f0 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a  ( !((PgHistory *
27100 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  )PGHDR_TO_HIST(p
27110 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69  , pPager))->pOri
27120 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  g );.        ass
27130 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72  ert( !((PgHistor
27140 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53  y *)PGHDR_TO_HIS
27150 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70  T(p, pPager))->p
27160 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Stmt );.        
27170 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
27180 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d  }..      pHist =
27190 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
271a0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
271b0 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69   if( pHist->pOri
271c0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  g ){.        mem
271d0 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
271e0 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72  A(p), pHist->pOr
271f0 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ig, pPager->page
27200 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 50  Size);.        P
27210 41 47 45 52 54 52 41 43 45 33 28 22 52 4f 4c 4c  AGERTRACE3("ROLL
27220 42 41 43 4b 2d 50 41 47 45 20 25 64 20 6f 66 20  BACK-PAGE %d of 
27230 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20  %d\n", p->pgno, 
27240 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
27250 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
27260 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
27270 45 33 28 22 50 41 47 45 20 25 64 20 69 73 20 63  E3("PAGE %d is c
27280 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70  lean on %d\n", p
27290 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
272a0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
272b0 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73  }.      clearHis
272c0 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20  tory(pHist);.   
272d0 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b     p->dirty = 0;
272e0 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72  .      p->inJour
272f0 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
27300 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30  Hist->inStmt = 0
27310 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70  ;.      pHist->p
27320 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74  PrevStmt = pHist
27330 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
27340 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
27350 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a  r->xReiniter ){.
27360 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
27370 78 52 65 69 6e 69 74 65 72 28 70 2c 20 70 50 61  xReiniter(p, pPa
27380 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
27390 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
273a0 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
273b0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
273c0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
273d0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
273e0 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
273f0 53 69 7a 65 3b 0a 20 20 20 20 70 61 67 65 72 5f  Size;.    pager_
27400 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70  truncate_cache(p
27410 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
27420 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
27430 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
27440 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
27450 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
27460 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
27470 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
27480 67 65 72 29 3b 0a 20 20 69 66 28 20 21 70 50 61  ger);.  if( !pPa
27490 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
274a0 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || !pPager->jour
274b0 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  nalOpen ){.    r
274c0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
274d0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
274e0 29 3b 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76  );.    pagerLeav
274f0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
27500 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
27510 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
27520 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
27530 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
27540 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  FULL ){.    if( 
27550 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
27560 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
27570 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c  {.      pager_pl
27580 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
27590 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  );.    }.    pag
275a0 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
275b0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
275c0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
275d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
275e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
275f0 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20  RVED ){.    int 
27600 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rc2;.    rc = pa
27610 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
27620 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 72 63 32  ger, 0);.    rc2
27630 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
27640 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
27650 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
27660 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27670 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
27680 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
27690 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
276a0 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
276b0 7d 0a 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 73  }.  /* pager_res
276c0 65 74 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20  et(pPager); */. 
276d0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
276e0 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  = -1;..  /* If a
276f0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
27700 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  uring a ROLLBACK
27710 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  , we can no long
27720 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67  er trust the pag
27730 65 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53  er.  ** cache. S
27740 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72  o call pager_err
27750 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20  or() on the way 
27760 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20  out to make any 
27770 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73  error .  ** pers
27780 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72  istent..  */.  r
27790 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
277a0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 70  pPager, rc);.  p
277b0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
277c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
277d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
277e0 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61  TRUE if the data
277f0 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65  base file is ope
27800 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20  ned read-only.  
27810 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
27820 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
27830 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77  is (in theory) w
27840 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  ritable..*/.int 
27850 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
27860 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50  adonly(Pager *pP
27870 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
27880 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
27890 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
278a0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
278b0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
278c0 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20  e pager..*/.int 
278d0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
278e0 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
278f0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
27900 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23  ager->nRef;.}..#
27910 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
27920 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  T./*.** This rou
27930 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
27940 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
27950 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69  lysis only..*/.i
27960 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  nt *sqlite3Pager
27970 53 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61  Stats(Pager *pPa
27980 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69  ger){.  static i
27990 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d  nt a[11];.  a[0]
279a0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b   = pPager->nRef;
279b0 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72  .  a[1] = pPager
279c0 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20  ->nPage;.  a[2] 
279d0 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  = pPager->mxPage
279e0 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65  ;.  a[3] = pPage
279f0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34  r->dbSize;.  a[4
27a00 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ] = pPager->stat
27a10 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67  e;.  a[5] = pPag
27a20 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61  er->errCode;.  a
27a30 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48  [6] = pPager->nH
27a40 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61  it;.  a[7] = pPa
27a50 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b  ger->nMiss;.  a[
27a60 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64  8] = 0;  /* Used
27a70 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e   to be pPager->n
27a80 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d  Ovfl */.  a[9] =
27a90 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a   pPager->nRead;.
27aa0 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72    a[10] = pPager
27ab0 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75  ->nWrite;.  retu
27ac0 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn a;.}.#endif..
27ad0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74  /*.** Set the st
27ae0 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b  atement rollback
27af0 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   point..**.** Th
27b00 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
27b10 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  d be called with
27b20 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
27b30 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79   journal already
27b40 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77  .** open.  A new
27b50 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
27b60 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68  al is created th
27b70 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
27b80 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68  o rollback.** ch
27b90 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  anges of a singl
27ba0 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69  e SQL command wi
27bb0 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72  thin a larger tr
27bc0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
27bd0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74  atic int pagerSt
27be0 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  mtBegin(Pager *p
27bf0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
27c00 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ;.  assert( !pPa
27c10 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
27c20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
27c30 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
27c40 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73  _SHARED );.  ass
27c50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
27c60 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45  ize>=0 );.  PAGE
27c70 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45  RTRACE2("STMT-BE
27c80 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  GIN %d\n", PAGER
27c90 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  ID(pPager));.  i
27ca0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
27cb0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
27cc0 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
27cd0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50  r->stmtSize = pP
27ce0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
27cf0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27d00 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  OK;.  }.  if( !p
27d10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
27d20 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  en ){.    pPager
27d30 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
27d40 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
27d50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
27d60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27d70 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
27d80 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
27d90 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  er);.  assert( p
27da0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d  Pager->aInStmt==
27db0 30 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  0 );.  pPager->a
27dc0 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33  InStmt = sqlite3
27dd0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 50 61 67  MallocZero( pPag
27de0 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31  er->dbSize/8 + 1
27df0 20 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72   );.  pagerEnter
27e00 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
27e10 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d  pPager->aInStmt=
27e20 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c  =0 ){.    /* sql
27e30 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
27e40 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
27e50 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75  CK); */.    retu
27e60 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
27e70 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  }.#ifndef NDE
27e80 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  BUG.  rc = sqlit
27e90 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
27ea0 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
27eb0 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20  r->stmtJSize);. 
27ec0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
27ed0 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
27ee0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
27ef0 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d  er->stmtJSize ==
27f00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
27f10 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Off );.#endif.  
27f20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
27f30 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  e = pPager->jour
27f40 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72  nalOff;.  pPager
27f50 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61  ->stmtSize = pPa
27f60 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70  ger->dbSize;.  p
27f70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
27f80 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
27f90 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61  >stmtCksum = pPa
27fa0 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a  ger->cksumInit;.
27fb0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73    if( !pPager->s
27fc0 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  tmtOpen ){.    r
27fd0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
27fe0 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2d  Opentemp(pPager-
27ff0 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 73  >pVfs, pPager->s
28000 74 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 53 74  tfd, pPager->zSt
28010 6d 74 4a 72 6e 6c 2c 0a 20 20 20 20 20 20 20 20  mtJrnl,.        
28020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28030 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
28040 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20  N_SUBJOURNAL);. 
28050 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
28060 20 20 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67     goto stmt_beg
28070 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  in_failed;.    }
28080 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
28090 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70  tOpen = 1;.    p
280a0 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
280b0 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
280c0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31  r->stmtInUse = 1
280d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
280e0 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67  E_OK;. .stmt_beg
280f0 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  in_failed:.  if(
28100 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
28110 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
28120 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e  free(pPager->aIn
28130 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65  Stmt);.    pPage
28140 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a  r->aInStmt = 0;.
28150 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
28160 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  .}.int sqlite3Pa
28170 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67  gerStmtBegin(Pag
28180 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
28190 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e  nt rc;.  pagerEn
281a0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ter(pPager);.  r
281b0 63 20 3d 20 70 61 67 65 72 53 74 6d 74 42 65 67  c = pagerStmtBeg
281c0 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61  in(pPager);.  pa
281d0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
281e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
281f0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
28200 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69   statement..*/.i
28210 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
28220 74 6d 74 43 6f 6d 6d 69 74 28 50 61 67 65 72 20  tmtCommit(Pager 
28230 2a 70 50 61 67 65 72 29 7b 0a 20 20 70 61 67 65  *pPager){.  page
28240 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
28250 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
28260 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50  mtInUse ){.    P
28270 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
28280 74 3b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  t;.    PAGERTRAC
28290 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20  E2("STMT-COMMIT 
282a0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
282b0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28  Pager));.    if(
282c0 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
282d0 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75   /* sqlite3OsTru
282e0 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 74  ncate(pPager->st
282f0 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20  fd, 0); */.     
28300 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 20 70   sqlite3_free( p
28310 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29  Pager->aInStmt )
28320 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
28330 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  aInStmt = 0;.   
28340 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
28350 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53  r(pPg=pPager->pS
28360 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  tmt; pPg; pPg=pN
28370 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ext){.        Pg
28380 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
28390 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
283a0 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
283b0 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 48 69       pNext = pHi
283c0 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  st->pNextStmt;. 
283d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
283e0 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a  Hist->inStmt );.
283f0 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69          pHist->i
28400 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
28410 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53     pHist->pPrevS
28420 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65  tmt = pHist->pNe
28430 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
28440 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28450 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
28460 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
28470 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
28480 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  }.    }.    pPag
28490 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
284a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
284b0 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
284c0 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
284d0 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
284e0 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
284f0 20 30 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65   0;.  pagerLeave
28500 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
28510 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
28520 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
28530 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
28540 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
28550 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67  StmtRollback(Pag
28560 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
28570 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e  nt rc;.  pagerEn
28580 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
28590 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
285a0 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 41 47 45  nUse ){.    PAGE
285b0 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f  RTRACE2("STMT-RO
285c0 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
285d0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
285e0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
285f0 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
28600 67 3b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  g;.      PgHisto
28610 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20  ry *pHist;.     
28620 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
28630 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67  >pStmt; pPg; pPg
28640 3d 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d  =pHist->pNextStm
28650 74 29 7b 0a 20 20 20 20 20 20 20 20 70 48 69 73  t){.        pHis
28660 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
28670 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
28680 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
28690 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
286a0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
286b0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
286c0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70   pHist->pStmt, p
286d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
286e0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
286f0 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e  te3_free(pHist->
28700 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
28710 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
28720 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
28730 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
28740 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
28750 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20  ger->stmtSize;. 
28760 20 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63       pager_trunc
28770 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72  ate_cache(pPager
28780 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
28790 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
287a0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
287b0 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
287c0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
287d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
287e0 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61  erStmtCommit(pPa
287f0 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
28800 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
28810 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  K;.  }.  pPager-
28820 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
28830 30 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  0;.  pagerLeave(
28840 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
28850 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
28860 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
28870 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
28880 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
28890 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
288a0 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
288b0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
288c0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
288d0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  r->zFilename;.}.
288e0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
288f0 65 20 56 46 53 20 73 74 72 75 63 74 75 72 65 20  e VFS structure 
28900 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  for the pager..*
28910 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  /.const sqlite3_
28920 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67 65  vfs *sqlite3Page
28930 72 56 66 73 28 50 61 67 65 72 20 2a 70 50 61 67  rVfs(Pager *pPag
28940 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
28950 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f  ager->pVfs;.}../
28960 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
28970 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20  file handle for 
28980 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28990 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
289a0 77 69 74 68 20 74 68 65 20 70 61 67 65 72 2e 20  with the pager. 
289b0 20 54 68 69 73 20 6d 69 67 68 74 20 72 65 74 75   This might retu
289c0 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66  rn NULL if the f
289d0 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79  ile has.** not y
289e0 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a  et been opened..
289f0 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  */.sqlite3_file 
28a00 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c  *sqlite3PagerFil
28a10 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
28a20 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
28a30 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r->fd;.}../*.** 
28a40 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65 63  Return the direc
28a50 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74 61  tory of the data
28a60 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
28a70 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
28a80 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50 61  3PagerDirname(Pa
28a90 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
28aa0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
28ab0 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a  Directory;.}../*
28ac0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
28ad0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
28ae0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28af0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
28b00 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75  *sqlite3PagerJou
28b10 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a  rnalname(Pager *
28b20 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
28b30 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  n pPager->zJourn
28b40 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  al;.}../*.** Ret
28b50 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e  urn true if fsyn
28b60 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69  c() calls are di
28b70 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20  sabled for this 
28b80 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46  pager.  Return F
28b90 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63  ALSE.** if fsync
28ba0 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64  ()s are executed
28bb0 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e   normally..*/.in
28bc0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f  t sqlite3PagerNo
28bd0 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  sync(Pager *pPag
28be0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
28bf0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a  ager->noSync;.}.
28c00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
28c10 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53  AS_CODEC./*.** S
28c20 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72  et the codec for
28c30 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76   this pager.*/.v
28c40 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
28c50 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65  SetCodec(.  Page
28c60 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69  r *pPager,.  voi
28c70 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
28c80 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
28c90 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64  t),.  void *pCod
28ca0 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65  ecArg.){.  pPage
28cb0 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64  r->xCodec = xCod
28cc0 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43  ec;.  pPager->pC
28cd0 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63  odecArg = pCodec
28ce0 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  Arg;.}.#endif..#
28cf0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28d00 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
28d10 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67  .** Move the pag
28d20 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f  e pPg to locatio
28d30 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69  n pgno in the fi
28d40 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  le. .**.** There
28d50 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65   must be no refe
28d60 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
28d70 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f  ge previously lo
28d80 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f  cated at.** pgno
28d90 20 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20   (which we call 
28da0 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74  pPgOld) though t
28db0 68 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f  hat page is allo
28dc0 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20  wed to be.** in 
28dd0 63 61 63 68 65 2e 20 20 49 66 20 74 68 65 20 70  cache.  If the p
28de0 61 67 65 20 70 72 65 76 69 6f 75 73 20 6c 6f 63  age previous loc
28df0 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20  ated at pgno is 
28e00 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
28e10 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
28e20 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f  ournal, it is no
28e30 74 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62  t put there by b
28e40 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  y this routine..
28e50 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73  **.** References
28e60 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67   to the page pPg
28e70 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55   remain valid. U
28e80 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d  pdating any.** m
28e90 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61  eta-data associa
28ea0 74 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e  ted with pPg (i.
28eb0 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  e. data stored i
28ec0 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74  n the nExtra byt
28ed0 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  es.** allocated 
28ee0 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70  along with the p
28ef0 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70  age) is the resp
28f00 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
28f10 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
28f20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  A transaction mu
28f30 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65  st be active whe
28f40 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
28f50 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65  s called. It use
28f60 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69  d to be.** requi
28f70 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65  red that a state
28f80 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
28f90 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c   was not active,
28fa0 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69   but this restri
28fb0 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
28fc0 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54  n removed (CREAT
28fd0 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f  E INDEX needs to
28fe0 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65   move a page whe
28ff0 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  n a statement.**
29000 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
29010 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20  active)..*/.int 
29020 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
29030 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  page(Pager *pPag
29040 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c  er, DbPage *pPg,
29050 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
29060 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20 2f  gHdr *pPgOld;  /
29070 2a 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67  * The page being
29080 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f   overwritten. */
29090 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f  .  int h;.  Pgno
290a0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
290b0 30 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72  0;..  pagerEnter
290c0 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
290d0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
290e0 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  );..  PAGERTRACE
290f0 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20  5("MOVE %d page 
29100 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29  %d (needSync=%d)
29110 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c   moves to %d\n",
29120 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28   .      PAGERID(
29130 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
29140 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
29150 63 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54 52  c, pgno);.  IOTR
29160 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64  ACE(("MOVE %p %d
29170 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
29180 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29  pPg->pgno, pgno)
29190 29 0a 0a 20 20 70 61 67 65 72 5f 67 65 74 5f 63  )..  pager_get_c
291a0 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69  ontent(pPg);.  i
291b0 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
291c0 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63   ){.    needSync
291d0 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Pgno = pPg->pgno
291e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
291f0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  g->inJournal || 
29200 28 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65 72  (int)pgno>pPager
29210 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
29220 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
29230 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73  >dirty );.    as
29240 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
29250 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20  edSync );.  }.. 
29260 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66   /* Unlink pPg f
29270 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68  rom it's hash-ch
29280 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48  ain */.  unlinkH
29290 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
292a0 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20   pPg);..  /* If 
292b0 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
292c0 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70  ns a page with p
292d0 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c  age-number pgno,
292e0 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20   remove it.  ** 
292f0 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63  from it's hash c
29300 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74  hain. Also, if t
29310 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
29320 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20  c was set for . 
29330 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65   ** page pgno be
29340 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20  fore the 'move' 
29350 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65  operation, it ne
29360 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e  eds to be retain
29370 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ed .  ** for the
29380 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72   page moved ther
29390 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e  e..  */.  pPg->n
293a0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
293b0 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f  PgOld = pager_lo
293c0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
293d0 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64  o);.  if( pPgOld
293e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
293f0 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20  pPgOld->nRef==0 
29400 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73  );.    unlinkHas
29410 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
29420 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65  PgOld);.    make
29430 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20  Clean(pPgOld);. 
29440 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
29450 20 3d 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53   = pPgOld->needS
29460 79 6e 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ync;.  }else{.  
29470 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
29480 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
29490 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
294a0 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  l && (int)pgno<=
294b0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
294c0 7a 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 69  ze ){.    pPg->i
294d0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 20 28 70 50 61  nJournal =  (pPa
294e0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
294f0 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
29500 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 7d  gno&7)))!=0;.  }
29510 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 2d 3e 69  else{.    pPg->i
29520 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
29530 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
29540 65 65 64 53 79 6e 63 3d 3d 30 20 7c 7c 20 28 69  eedSync==0 || (i
29550 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  nt)pgno>pPager->
29560 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
29570 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74  }..  /* Change t
29580 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
29590 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65 72  or pPg and inser
295a0 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e 65  t it into the ne
295b0 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f  w hash-chain. */
295c0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
295d0 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67 6e  =0 );.  pPg->pgn
295e0 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20  o = pgno;.  h = 
295f0 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
29600 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69 66 28 20  nHash-1);.  if( 
29610 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
29620 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
29630 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
29640 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
29650 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
29660 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
29670 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70  h = pPg;.  }.  p
29680 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
29690 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
296a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73  ;.  pPager->aHas
296b0 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50  h[h] = pPg;.  pP
296c0 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
296d0 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70  ;..  makeDirty(p
296e0 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  Pg);.  pPager->d
296f0 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a  irtyCache = 1;..
29700 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67    if( needSyncPg
29710 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  no ){.    /* If 
29720 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20  needSyncPgno is 
29730 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
29740 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
29750 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20  needs to be .   
29760 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66   ** sync()ed bef
29770 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
29780 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62  written to datab
29790 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65  ase file page ne
297a0 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20  edSyncPgno..    
297b0 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f  ** Currently, no
297c0 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74   such page exist
297d0 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  s in the page-ca
297e0 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20  che and the .   
297f0 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75   ** Pager.aInJou
29800 72 6e 61 6c 20 62 69 74 20 68 61 73 20 62 65 65  rnal bit has bee
29810 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64  n set. This need
29820 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64  s to be remedied
29830 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20   by loading.    
29840 2a 2a 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ** the page into
29850 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
29860 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65   and setting the
29870 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
29880 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  flag..    **.   
29890 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50   ** The sqlite3P
298a0 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d  agerGet() call m
298b0 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75  ay cause the jou
298c0 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f  rnal to sync. So
298d0 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
298e0 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  e the Pager.need
298f0 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
29900 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   too..    */.   
29910 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 50 67 48   int rc;.    PgH
29920 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20  dr *pPgHdr;.    
29930 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
29940 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20  needSync );.    
29950 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
29960 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65  rGet(pPager, nee
29970 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48  dSyncPgno, &pPgH
29980 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
29990 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
299a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67  urn rc;.    pPag
299b0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
299c0 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 6e 65  ;.    pPgHdr->ne
299d0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
299e0 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61  pPgHdr->inJourna
299f0 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44  l = 1;.    makeD
29a00 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20  irty(pPgHdr);.  
29a10 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
29a20 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
29a30 0a 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ..  pagerLeave(p
29a40 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
29a50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
29a60 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
29a70 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
29a80 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65  the data for the
29a90 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
29aa0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
29ab0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44 62  3PagerGetData(Db
29ac0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
29ad0 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41  turn PGHDR_TO_DA
29ae0 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  TA(pPg);.}../*.*
29af0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
29b00 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e  er to the Pager.
29b10 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
29b20 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a  "extra" space .*
29b30 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
29b40 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  g with the speci
29b50 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
29b60 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
29b70 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65 20  GetExtra(DbPage 
29b80 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
29b90 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
29ba0 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28  ager;.  return (
29bb0 70 50 61 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f  pPager?PGHDR_TO_
29bc0 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
29bd0 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r):0);.}../*.** 
29be0 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b  Get/set the lock
29bf0 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69  ing-mode for thi
29c00 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74  s pager. Paramet
29c10 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65  er eMode must be
29c20 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52   one.** of PAGER
29c30 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
29c40 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  RY, PAGER_LOCKIN
29c50 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20  GMODE_NORMAL or 
29c60 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
29c70 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e  GMODE_EXCLUSIVE.
29c80 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
29c90 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c  r is not _QUERY,
29ca0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63   then.** the loc
29cb0 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74  king-mode is set
29cc0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70   to the value sp
29cd0 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ecified..**.** T
29ce0 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
29cf0 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45  e is either PAGE
29d00 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
29d10 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52  RMAL or.** PAGER
29d20 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
29d30 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69  LUSIVE, indicati
29d40 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28  ng the current (
29d50 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64  possibly updated
29d60 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64  ).** locking-mod
29d70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
29d80 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
29d90 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
29da0 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61   int eMode){.  a
29db0 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41  ssert( eMode==PA
29dc0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
29dd0 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20  QUERY.          
29de0 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
29df0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
29e00 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20  RMAL.           
29e10 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
29e20 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
29e30 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
29e40 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
29e50 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b  GMODE_QUERY<0 );
29e60 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
29e70 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
29e80 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f  MAL>=0 && PAGER_
29e90 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
29ea0 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66  USIVE>=0 );.  if
29eb0 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70  ( eMode>=0 && !p
29ec0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
29ed0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
29ee0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 65  xclusiveMode = e
29ef0 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Mode;.  }.  retu
29f00 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e  rn (int)pPager->
29f10 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d  exclusiveMode;.}
29f20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
29f30 54 45 53 54 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  TEST./*.** Print
29f40 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c   a listing of al
29f50 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  l referenced pag
29f60 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65 66  es and their ref
29f70 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20   count..*/.void 
29f80 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 64  sqlite3PagerRefd
29f90 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  ump(Pager *pPage
29fa0 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
29fb0 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
29fc0 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
29fd0 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
29fe0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
29ff0 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e  nRef<=0 ) contin
2a000 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ue;.    sqlite3D
2a010 65 62 75 67 50 72 69 6e 74 66 28 22 50 41 47 45  ebugPrintf("PAGE
2a020 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52 65   %3d addr=%p nRe
2a030 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  f=%d\n", .      
2a040 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44   pPg->pgno, PGHD
2a050 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
2a060 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a  pPg->nRef);.  }.
2a070 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66  }.#endif..#endif
2a080 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2a090 44 49 53 4b 49 4f 20 2a 2f 0a                    DISKIO */.