/ Hex Artifact Content
Login

Artifact b1eaca429cf9a4e35bed12f6f326d39a82ee8a33:


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: 35 20 32 30 30 37 2f 31 31 2f 32 37 20 31 36 3a  5 2007/11/27 16:
0360: 35 35 3a 30 38 20 64 72 68 20 45 78 70 20 24 0a  55:08 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  t.h".#include <a
03b0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03c0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03d0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03e0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03f0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0400: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0410: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62  efine sqlite3Deb
0420: 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a  ugPrintf printf.
0430: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0440: 43 45 31 28 58 29 20 20 20 20 20 20 20 73 71 6c  CE1(X)       sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
0460: 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  X).#define PAGER
0470: 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20  TRACE2(X,Y)     
0480: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0490: 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  tf(X,Y).#define 
04a0: 50 41 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c  PAGERTRACE3(X,Y,
04b0: 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  Z)   sqlite3Debu
04c0: 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23  gPrintf(X,Y,Z).#
04d0: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
04e0: 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69  E4(X,Y,Z,W) sqli
04f0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0500: 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20  ,Y,Z,W).#define 
0510: 50 41 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c  PAGERTRACE5(X,Y,
0520: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0530: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0540: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0550: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0560: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0570: 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69  RACE2(X,Y).#defi
0580: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
0590: 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Y,Z).#define PA
05a0: 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c  GERTRACE4(X,Y,Z,
05b0: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
05c0: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
05d0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
05e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
05f0: 6f 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65  o macros are use
0600: 64 20 77 69 74 68 69 6e 20 74 68 65 20 50 41 47  d within the PAG
0610: 45 52 54 52 41 43 45 58 28 29 20 6d 61 63 72 6f  ERTRACEX() macro
0620: 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 70 72  s above.** to pr
0630: 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64 65 73  int out file-des
0640: 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a  criptors. .**.**
0650: 20 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73   PAGERID() takes
0660: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
0670: 50 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20  Pager struct as 
0680: 69 74 27 73 20 61 72 67 75 6d 65 6e 74 2e 20 54  it's argument. T
0690: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
06a0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
06b0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49   is returned. FI
06c0: 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b  LEHANDLEID() tak
06d0: 65 73 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69  es an sqlite3_fi
06e0: 6c 65 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20  le.** struct as 
06f0: 69 74 27 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  it's argument..*
0700: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 49  /.#define PAGERI
0710: 44 28 70 29 20 28 28 69 6e 74 29 28 70 2d 3e 66  D(p) ((int)(p->f
0720: 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45  d)).#define FILE
0730: 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69  HANDLEID(fd) ((i
0740: 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  nt)fd)../*.** Th
0750: 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73 20  e page cache as 
0760: 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79  a whole is alway
0770: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
0780: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
0790: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  tes:.**.**   PAG
07a0: 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20  ER_UNLOCK       
07b0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
07c0: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
07d0: 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20   reading or .** 
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74 68        writing th
0800: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0810: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a    There is no.**
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c 64         data held
0840: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
0850: 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
0860: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0870: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 2e            state.
0880: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53  .**.**   PAGER_S
0890: 48 41 52 45 44 20 20 20 20 20 20 20 20 54 68 65  HARED        The
08a0: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 72   page cache is r
08b0: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
08c0: 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ase..**         
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72                Wr
08e0: 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72  iting is not per
08f0: 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20 63  mitted.  There c
0900: 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  an be.**        
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
0920: 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
0930: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
0940: 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  me database.**  
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68 65       file at the
0970: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   same time..**.*
0980: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
0990: 45 44 20 20 20 20 20 20 54 68 69 73 20 70 72 6f  ED      This pro
09a0: 63 65 73 73 20 68 61 73 20 72 65 73 65 72 76 65  cess has reserve
09b0: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
09c0: 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20  or writing.**   
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20      but has not 
09f0: 79 65 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61  yet made any cha
0a00: 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20  nges.  Only one 
0a10: 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20  process.**      
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a30: 20 61 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72   at a time can r
0a40: 65 73 65 72 76 65 20 74 68 65 20 64 61 74 61 62  eserve the datab
0a50: 61 73 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e  ase.  The origin
0a60: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0a80: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f  base file has no
0a90: 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  t been modified 
0aa0: 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20  so other.**     
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 20 20 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20    processes may 
0ad0: 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
0ae0: 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20   the on-disk.** 
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
0b10: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ile..**.**   PAG
0b20: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20  ER_EXCLUSIVE    
0b30: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0b40: 69 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  is writing the d
0b50: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20  atabase..**     
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 20 20 41 63 63 65 73 73 20 69 73 20 65 78 63 6c    Access is excl
0b80: 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72  usive.  No other
0b90: 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a   processes or.**
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20 63         threads c
0bc0: 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72  an be reading or
0bd0: 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f   writing while o
0be0: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ne.**           
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63              proc
0c00: 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a  ess is writing..
0c10: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59  **.**   PAGER_SY
0c20: 4e 43 45 44 20 20 20 20 20 20 20 20 54 68 65 20  NCED        The 
0c30: 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74  pager moves to t
0c40: 68 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50  his state from P
0c50: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a  AGER_EXCLUSIVE.*
0c60: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0c70: 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61 6c          after al
0c80: 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68 61  l dirty pages ha
0c90: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
0ca0: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
0cd0: 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 62  d the file has b
0ce0: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a  een synced to.**
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c         disk. All
0d10: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f   that remains to
0d20: 20 64 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65   do is to remove
0d30: 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   or.**          
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 75               tru
0d50: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
0d60: 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 74  l file and the t
0d70: 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20  ransaction .**  
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d       will be com
0da0: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
0db0: 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d  e page cache com
0dc0: 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55  es up in PAGER_U
0dd0: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0de0: 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69  t time a.** sqli
0df0: 74 65 33 50 61 67 65 72 47 65 74 28 29 20 6f 63  te3PagerGet() oc
0e00: 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65 20  curs, the state 
0e10: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50  transitions to P
0e20: 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20  AGER_SHARED..** 
0e30: 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20  After all pages 
0e40: 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73  have been releas
0e50: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f  ed using sqlite_
0e60: 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a  page_unref(),.**
0e70: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0e80: 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50  itions back to P
0e90: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0ea0: 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20  e first time.** 
0eb0: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
0ec0: 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
0ed0: 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  ed, the state tr
0ee0: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20  ansitions to.** 
0ef0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20  PAGER_RESERVED. 
0f00: 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69   (Note that sqli
0f10: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
0f20: 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63  can only be.** c
0f30: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73  alled on an outs
0f40: 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69  tanding page whi
0f50: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ch means that th
0f60: 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20  e pager must.** 
0f70: 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52  be in PAGER_SHAR
0f80: 45 44 20 62 65 66 6f 72 65 20 69 74 20 74 72 61  ED before it tra
0f90: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45  nsitions to PAGE
0fa0: 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20  R_RESERVED.).** 
0fb0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 6d  PAGER_RESERVED m
0fc0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20  eans that there 
0fd0: 69 73 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62  is an open rollb
0fe0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  ack journal..** 
0ff0: 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74  The transition t
1000: 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  o PAGER_EXCLUSIV
1010: 45 20 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20  E occurs before 
1020: 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61  any changes.** a
1030: 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
1040: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
1050: 6f 75 67 68 20 77 72 69 74 65 73 20 74 6f 20 74  ough writes to t
1060: 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a  he rollback.** j
1070: 6f 75 72 6e 61 6c 20 6f 63 63 75 72 73 20 77 69  ournal occurs wi
1080: 74 68 20 6a 75 73 74 20 50 41 47 45 52 5f 52 45  th just PAGER_RE
1090: 53 45 52 56 45 44 2e 20 20 41 66 74 65 72 20 61  SERVED.  After a
10a0: 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  n sqlite3PagerRo
10b0: 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73  llback().** or s
10c0: 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
10d0: 74 50 68 61 73 65 54 77 6f 28 29 2c 20 74 68 65  tPhaseTwo(), the
10e0: 20 73 74 61 74 65 20 63 61 6e 20 67 6f 20 62 61   state can go ba
10f0: 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
1100: 45 44 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e  ED,.** or it can
1110: 20 73 74 61 79 20 61 74 20 50 41 47 45 52 5f 45   stay at PAGER_E
1120: 58 43 4c 55 53 49 56 45 20 69 66 20 77 65 20 61  XCLUSIVE if we a
1130: 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  re in exclusive 
1140: 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a  access mode..*/.
1150: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e  #define PAGER_UN
1160: 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66  LOCK      0.#def
1170: 69 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45 44  ine PAGER_SHARED
1180: 20 20 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d        1   /* sam
1190: 65 20 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b  e as SHARED_LOCK
11a0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
11b0: 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 32 20  R_RESERVED    2 
11c0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53    /* same as RES
11d0: 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64  ERVED_LOCK */.#d
11e0: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c  efine PAGER_EXCL
11f0: 55 53 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73  USIVE   4   /* s
1200: 61 6d 65 20 61 73 20 45 58 43 4c 55 53 49 56 45  ame as EXCLUSIVE
1210: 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65  _LOCK */.#define
1220: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
1230: 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74     5../*.** If t
1240: 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  he SQLITE_BUSY_R
1250: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63  ESERVED_LOCK mac
1260: 72 6f 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ro is set to tru
1270: 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  e at compile-tim
1280: 65 2c 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65  e,.** then faile
1290: 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65  d attempts to ge
12a0: 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  t a reserved loc
12b0: 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68  k will invoke th
12c0: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e  e busy callback.
12d0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20  .** This is off 
12e0: 62 79 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20  by default.  To 
12f0: 73 65 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65  see why, conside
1300: 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
1310: 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a  scenario:.** .**
1320: 20 53 75 70 70 6f 73 65 20 74 68 72 65 61 64 20   Suppose thread 
1330: 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
1340: 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20  shared lock and 
1350: 77 61 6e 74 73 20 61 20 72 65 73 65 72 76 65 64  wants a reserved
1360: 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64   lock..** Thread
1370: 20 42 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   B already has a
1380: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61   reserved lock a
1390: 6e 64 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c  nd wants an excl
13a0: 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a  usive lock.  If.
13b0: 2a 2a 20 62 6f 74 68 20 74 68 72 65 61 64 73 20  ** both threads 
13c0: 61 72 65 20 75 73 69 6e 67 20 74 68 65 69 72 20  are using their 
13d0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20  busy callbacks, 
13e0: 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f  it might be a lo
13f0: 6e 67 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f  ng time.** be fo
1400: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72  r one of the thr
1410: 65 61 64 73 20 67 69 76 65 20 75 70 20 61 6e 64  eads give up and
1420: 20 61 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65   allows the othe
1430: 72 20 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a  r to proceed..**
1440: 20 42 75 74 20 69 66 20 74 68 65 20 74 68 72 65   But if the thre
1450: 61 64 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74  ad trying to get
1460: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f   the reserved lo
1470: 63 6b 20 67 69 76 65 73 20 75 70 20 71 75 69 63  ck gives up quic
1480: 6b 6c 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65  kly.** (if it ne
1490: 76 65 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20  ver invokes its 
14a0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74  busy callback) t
14b0: 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69  hen the contenti
14c0: 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65  on will be.** re
14d0: 73 6f 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a  solved quickly..
14e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
14f0: 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
1500: 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51  LOCK.# define SQ
1510: 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56  LITE_BUSY_RESERV
1520: 45 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66  ED_LOCK 0.#endif
1530: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63  ../*.** This mac
1540: 72 6f 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73  ro rounds values
1550: 20 75 70 20 73 6f 20 74 68 61 74 20 69 66 20 74   up so that if t
1560: 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61  he value is an a
1570: 64 64 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20  ddress it.** is 
1580: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1590: 20 61 6e 20 61 64 64 72 65 73 73 20 74 68 61 74   an address that
15a0: 20 69 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61   is aligned to a
15b0: 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72  n 8-byte boundar
15c0: 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f  y..*/.#define FO
15d0: 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29  RCE_ALIGNMENT(X)
15e0: 20 20 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a     (((X)+7)&~7).
15f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1600: 50 67 48 64 72 20 50 67 48 64 72 3b 0a 0a 2f 2a  PgHdr PgHdr;../*
1610: 0a 2a 2a 20 45 61 63 68 20 70 61 67 65 72 20 73  .** Each pager s
1620: 74 6f 72 65 73 20 61 6c 6c 20 63 75 72 72 65 6e  tores all curren
1630: 74 6c 79 20 75 6e 72 65 66 65 72 65 6e 63 65 64  tly unreferenced
1640: 20 70 61 67 65 73 20 69 6e 20 61 20 6c 69 73 74   pages in a list
1650: 20 73 6f 72 74 65 64 0a 2a 2a 20 69 6e 20 6c 65   sorted.** in le
1660: 61 73 74 2d 72 65 63 65 6e 74 6c 79 2d 75 73 65  ast-recently-use
1670: 64 20 28 4c 52 55 29 20 6f 72 64 65 72 20 28 69  d (LRU) order (i
1680: 2e 65 2e 20 74 68 65 20 66 69 72 73 74 20 69 74  .e. the first it
1690: 65 6d 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 68  em on the list h
16a0: 61 73 20 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20  as .** not been 
16b0: 72 65 66 65 72 65 6e 63 65 64 20 69 6e 20 61 20  referenced in a 
16c0: 6c 6f 6e 67 20 74 69 6d 65 2c 20 74 68 65 20 6c  long time, the l
16d0: 61 73 74 20 69 74 65 6d 20 68 61 73 20 62 65 65  ast item has bee
16e0: 6e 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 75 73  n recently.** us
16f0: 65 64 29 2e 20 41 6e 20 69 6e 73 74 61 6e 63 65  ed). An instance
1700: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
1710: 72 65 20 69 73 20 69 6e 63 6c 75 64 65 64 20 61  re is included a
1720: 73 20 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a  s part of each.*
1730: 2a 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  * pager structur
1740: 65 20 66 6f 72 20 74 68 69 73 20 70 75 72 70 6f  e for this purpo
1750: 73 65 20 28 76 61 72 69 61 62 6c 65 20 50 61 67  se (variable Pag
1760: 65 72 2e 6c 72 75 29 2e 0a 2a 2a 0a 2a 2a 20 41  er.lru)..**.** A
1770: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20  dditionally, if 
1780: 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e  memory-managemen
1790: 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c  t is enabled, al
17a0: 6c 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70  l unreferenced p
17b0: 61 67 65 73 20 0a 2a 2a 20 61 72 65 20 73 74 6f  ages .** are sto
17c0: 72 65 64 20 69 6e 20 61 20 67 6c 6f 62 61 6c 20  red in a global 
17d0: 4c 52 55 20 6c 69 73 74 20 28 67 6c 6f 62 61 6c  LRU list (global
17e0: 20 76 61 72 69 61 62 6c 65 20 73 71 6c 69 74 65   variable sqlite
17f0: 33 4c 72 75 50 61 67 65 4c 69 73 74 29 2e 0a 2a  3LruPageList)..*
1800: 2a 0a 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73  *.** In both cas
1810: 65 73 2c 20 74 68 65 20 50 61 67 65 72 4c 72 75  es, the PagerLru
1820: 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65  List.pFirstSynce
1830: 64 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74  d variable point
1840: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 66 69 72 73  s to.** the firs
1850: 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 6f  t page in the co
1860: 72 72 65 73 70 6f 6e 64 69 6e 67 20 6c 69 73 74  rresponding list
1870: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
1880: 65 71 75 69 72 65 20 61 6e 0a 2a 2a 20 66 73 79  equire an.** fsy
1890: 6e 63 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 62  nc() operation b
18a0: 65 66 6f 72 65 20 69 74 27 73 20 6d 65 6d 6f 72  efore it's memor
18b0: 79 20 63 61 6e 20 62 65 20 72 65 63 6c 61 69 6d  y can be reclaim
18c0: 65 64 2e 20 49 66 20 6e 6f 20 73 75 63 68 0a 2a  ed. If no such.*
18d0: 2a 20 70 61 67 65 20 65 78 69 73 74 73 2c 20 50  * page exists, P
18e0: 61 67 65 72 4c 72 75 4c 69 73 74 2e 70 46 69 72  agerLruList.pFir
18f0: 73 74 53 79 6e 63 65 64 20 69 73 20 73 65 74 20  stSynced is set 
1900: 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 74 79 70 65  to NULL..*/.type
1910: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
1920: 4c 72 75 4c 69 73 74 20 50 61 67 65 72 4c 72 75  LruList PagerLru
1930: 4c 69 73 74 3b 0a 73 74 72 75 63 74 20 50 61 67  List;.struct Pag
1940: 65 72 4c 72 75 4c 69 73 74 20 7b 0a 20 20 50 67  erLruList {.  Pg
1950: 48 64 72 20 2a 70 46 69 72 73 74 3b 20 20 20 20  Hdr *pFirst;    
1960: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
1970: 67 65 20 69 6e 20 4c 52 55 20 6c 69 73 74 20 2a  ge in LRU list *
1980: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 61 73 74  /.  PgHdr *pLast
1990: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  ;          /* La
19a0: 73 74 20 70 61 67 65 20 69 6e 20 4c 52 55 20 6c  st page in LRU l
19b0: 69 73 74 20 28 74 68 65 20 6d 6f 73 74 20 72 65  ist (the most re
19c0: 63 65 6e 74 6c 79 20 75 73 65 64 29 20 2a 2f 0a  cently used) */.
19d0: 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 53    PgHdr *pFirstS
19e0: 79 6e 63 65 64 3b 20 20 20 2f 2a 20 46 69 72 73  ynced;   /* Firs
19f0: 74 20 70 61 67 65 20 69 6e 20 6c 69 73 74 20 77  t page in list w
1a00: 69 74 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79  ith PgHdr.needSy
1a10: 6e 63 3d 3d 30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  nc==0 */.};../*.
1a20: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1a30: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
1a40: 69 6e 73 20 74 68 65 20 6e 65 78 74 20 61 6e 64  ins the next and
1a50: 20 70 72 65 76 69 6f 75 73 20 70 6f 69 6e 74 65   previous pointe
1a60: 72 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 69  rs used.** to li
1a70: 6e 6b 20 61 20 50 67 48 64 72 20 73 74 72 75 63  nk a PgHdr struc
1a80: 74 75 72 65 20 69 6e 74 6f 20 61 20 50 61 67 65  ture into a Page
1a90: 72 4c 72 75 4c 69 73 74 20 6c 69 6e 6b 65 64 20  rLruList linked 
1aa0: 6c 69 73 74 2e 20 0a 2a 2f 0a 74 79 70 65 64 65  list. .*/.typede
1ab0: 66 20 73 74 72 75 63 74 20 50 61 67 65 72 4c 72  f struct PagerLr
1ac0: 75 4c 69 6e 6b 20 50 61 67 65 72 4c 72 75 4c 69  uLink PagerLruLi
1ad0: 6e 6b 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72  nk;.struct Pager
1ae0: 4c 72 75 4c 69 6e 6b 20 7b 0a 20 20 50 67 48 64  LruLink {.  PgHd
1af0: 72 20 2a 70 4e 65 78 74 3b 0a 20 20 50 67 48 64  r *pNext;.  PgHd
1b00: 72 20 2a 70 50 72 65 76 3b 0a 7d 3b 0a 0a 2f 2a  r *pPrev;.};../*
1b10: 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f  .** Each in-memo
1b20: 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61  ry image of a pa
1b30: 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  ge begins with t
1b40: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61  he following hea
1b50: 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61  der..** This hea
1b60: 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69  der is only visi
1b70: 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  ble to this page
1b80: 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63  r module.  The c
1b90: 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68  lient.** code th
1ba0: 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73  at calls pager s
1bb0: 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74  ees only the dat
1bc0: 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74  a that follows t
1bd0: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
1be0: 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f   Client code sho
1bf0: 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  uld call sqlite3
1c00: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
1c10: 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  a page prior to 
1c20: 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f  making.** any mo
1c30: 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74  difications to t
1c40: 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66  hat page.  The f
1c50: 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65  irst time sqlite
1c60: 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
1c70: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1c80: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
1c90: 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69 74 74  ntents are writt
1ca0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c  en into the roll
1cb0: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
1cc0: 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72  and PgHdr.inJour
1cd0: 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65  nal and PgHdr.ne
1ce0: 65 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20  edSync are set. 
1cf0: 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20   Later, once.** 
1d00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  the journal page
1d10: 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74   has made it ont
1d20: 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
1d30: 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79  ce, PgHdr.needSy
1d40: 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64  nc.** is cleared
1d50: 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20  .  The modified 
1d60: 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77  page cannot be w
1d70: 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
1d80: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1d90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
1da0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
1db0: 20 70 61 67 65 73 20 68 61 73 20 62 65 65 6e 20   pages has been 
1dc0: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61  synced to disk a
1dd0: 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e  nd the.** PgHdr.
1de0: 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62 65 65  needSync has bee
1df0: 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  n cleared..**.**
1e00: 20 54 68 65 20 50 67 48 64 72 2e 64 69 72 74 79   The PgHdr.dirty
1e10: 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65   flag is set whe
1e20: 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
1e30: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1e40: 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  and.** is cleare
1e50: 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65  d again when the
1e60: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
1e70: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
1e80: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1ea0: 2a 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66  **.** Details of
1eb0: 20 69 6d 70 6f 72 74 61 6e 74 20 73 74 72 75 63   important struc
1ec0: 74 75 72 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a  ture elements:.*
1ed0: 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a  *.** needSync.**
1ee0: 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 69 73 20  .**     If this 
1ef0: 69 73 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65  is true, this me
1f00: 61 6e 73 20 74 68 61 74 20 69 74 20 69 73 20 6e  ans that it is n
1f10: 6f 74 20 73 61 66 65 20 74 6f 20 77 72 69 74 65  ot safe to write
1f20: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20   the page.**    
1f30: 20 63 6f 6e 74 65 6e 74 20 74 6f 20 74 68 65 20   content to the 
1f40: 64 61 74 61 62 61 73 65 20 62 65 63 61 75 73 65  database because
1f50: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f   the original co
1f60: 6e 74 65 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20  ntent needed.** 
1f70: 20 20 20 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b      for rollback
1f80: 20 68 61 73 20 6e 6f 74 20 62 79 20 73 79 6e 63   has not by sync
1f90: 65 64 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 72  ed to the main r
1fa0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
1fb0: 0a 2a 2a 20 20 20 20 20 54 68 65 20 6f 72 69 67  .**     The orig
1fc0: 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79  inal content may
1fd0: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
1fe0: 65 6e 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61  en to the rollba
1ff0: 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  ck journal.**   
2000: 20 20 62 75 74 20 69 74 20 68 61 73 20 6e 6f 74    but it has not
2010: 20 79 65 74 20 62 65 65 6e 20 73 79 6e 63 65 64   yet been synced
2020: 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20  .  So we cannot 
2030: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74  write to the dat
2040: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c  abase.**     fil
2050: 65 20 62 65 63 61 75 73 65 20 70 6f 77 65 72 20  e because power 
2060: 66 61 69 6c 75 72 65 20 6d 69 67 68 74 20 63 61  failure might ca
2070: 75 73 65 20 74 68 65 20 70 61 67 65 20 69 6e 20  use the page in 
2080: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2090: 0a 2a 2a 20 20 20 20 20 74 6f 20 6e 65 76 65 72  .**     to never
20a0: 20 72 65 61 63 68 20 74 68 65 20 64 69 73 6b 2e   reach the disk.
20b0: 20 20 49 74 20 69 73 20 61 73 20 69 66 20 74 68    It is as if th
20c0: 65 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  e write to the j
20d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
20e0: 20 20 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75     does not occu
20f0: 72 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72  r until the jour
2100: 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
2110: 65 64 2e 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20  ed..**     .**  
2120: 20 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20     This flag is 
2130: 66 61 6c 73 65 20 69 66 20 74 68 65 20 70 61 67  false if the pag
2140: 65 20 63 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c  e content exactl
2150: 79 20 6d 61 74 63 68 65 73 20 77 68 61 74 0a 2a  y matches what.*
2160: 2a 20 20 20 20 20 63 75 72 72 65 6e 74 6c 79 20  *     currently 
2170: 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 64 61  exists in the da
2180: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
2190: 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
21a0: 69 73 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66  is also.**     f
21b0: 61 6c 73 65 20 69 66 20 74 68 65 20 6f 72 69 67  alse if the orig
21c0: 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  inal content has
21d0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
21e0: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
21f0: 63 6b 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  ck.**     journa
2200: 6c 20 61 6e 64 20 73 79 6e 63 65 64 2e 20 20 49  l and synced.  I
2210: 66 20 74 68 65 20 70 61 67 65 20 72 65 70 72 65  f the page repre
2220: 73 65 6e 74 73 20 61 20 6e 65 77 20 70 61 67 65  sents a new page
2230: 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 20 20 20   that has.**    
2240: 20 62 65 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f   been added onto
2250: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2260: 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
2270: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20  the current.**  
2280: 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20     transaction, 
2290: 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61  the needSync fla
22a0: 67 20 69 73 20 74 72 75 65 20 75 6e 74 69 6c 20  g is true until 
22b0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
22c0: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a  abase.**     siz
22d0: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
22e0: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
22f0: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
2300: 0a 2a 2a 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c  .**.** inJournal
2310: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20  .**.**     This 
2320: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
2330: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 68 61 73  riginal page has
2340: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e   been written in
2350: 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20  to the main.**  
2360: 20 20 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72     rollback jour
2370: 6e 61 6c 2e 20 20 54 68 69 73 20 69 73 20 61 6c  nal.  This is al
2380: 77 61 79 73 20 66 61 6c 73 65 20 66 6f 72 20 6e  ways false for n
2390: 65 77 20 70 61 67 65 73 20 61 64 64 65 64 20 74  ew pages added t
23a0: 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 65 6e 64  o.**     the end
23b0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
23c0: 20 66 69 6c 65 20 64 75 72 69 6e 67 20 74 68 65   file during the
23d0: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
23e0: 74 69 6f 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64  tion..**     And
23f0: 20 74 68 69 73 20 66 6c 61 67 20 73 61 79 73 20   this flag says 
2400: 6e 6f 74 68 69 6e 67 20 61 62 6f 75 74 20 77 68  nothing about wh
2410: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
2420: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
2430: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
2440: 74 6f 20 64 69 73 6b 2e 20 20 46 6f 72 20 70 61  to disk.  For pa
2450: 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20  ges that are in 
2460: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
2470: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
2480: 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
2490: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 68 6f 75   expression shou
24a0: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 72 75  ld always be tru
24b0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69  e:.**.**       i
24c0: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67  nJournal = (pPag
24d0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 28  er->aInJournal[(
24e0: 70 67 6e 6f 2d 31 29 2f 38 5d 20 26 20 28 31 3c  pgno-1)/8] & (1<
24f0: 3c 28 28 70 67 6e 6f 2d 31 29 25 38 29 29 21 3d  <((pgno-1)%8))!=
2500: 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65 20  0.**.**     The 
2510: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
2520: 61 6c 5b 5d 20 61 72 72 61 79 20 69 73 20 6f 6e  al[] array is on
2530: 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65  ly valid for the
2540: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   original.**    
2550: 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 64 61   pages of the da
2560: 74 61 62 61 73 65 2c 20 6e 6f 74 20 6e 65 77 20  tabase, not new 
2570: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
2580: 64 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64 0a  dded to the end.
2590: 2a 2a 20 20 20 20 20 6f 66 20 74 68 65 20 64 61  **     of the da
25a0: 74 61 62 61 73 65 2c 20 73 6f 20 6f 62 76 69 6f  tabase, so obvio
25b0: 75 73 6c 79 20 74 68 65 20 61 62 6f 76 65 20 65  usly the above e
25c0: 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 6e 6f 74  xpression cannot
25d0: 20 62 65 0a 2a 2a 20 20 20 20 20 76 61 6c 69 64   be.**     valid
25e0: 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73 2e 20   for new pages. 
25f0: 20 46 6f 72 20 6e 65 77 20 70 61 67 65 73 20 69   For new pages i
2600: 6e 4a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77 61  nJournal is alwa
2610: 79 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72 74  ys 0..**.** dirt
2620: 79 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 6e  y.**.**     When
2630: 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e   true, this mean
2640: 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  s that the conte
2650: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  nt of the page h
2660: 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20 6d  as been.**     m
2670: 6f 64 69 66 69 65 64 20 61 6e 64 20 6e 65 65 64  odified and need
2680: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
2690: 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61  back to the data
26a0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
26b0: 20 20 49 66 20 66 61 6c 73 65 2c 20 69 74 20 6d    If false, it m
26c0: 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72  eans that either
26d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
26e0: 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20 20  the page is.**  
26f0: 20 20 20 75 6e 63 68 61 6e 67 65 64 20 6f 72 20     unchanged or 
2700: 65 6c 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  else the content
2710: 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74 20   is unimportant 
2720: 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a  and we do not.**
2730: 20 20 20 20 20 63 61 72 65 20 77 68 65 74 68 65       care whethe
2740: 72 20 6f 72 20 6e 6f 74 20 69 74 20 69 73 20 70  r or not it is p
2750: 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  reserved..**.** 
2760: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 2a  alwaysRollback.*
2770: 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 6d 65  *.**     This me
2780: 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  ans that the sql
2790: 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
27a0: 6c 62 61 63 6b 28 29 20 41 50 49 20 73 68 6f 75  lback() API shou
27b0: 6c 64 20 62 65 0a 2a 2a 20 20 20 20 20 69 67 6e  ld be.**     ign
27c0: 6f 72 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  ored for this pa
27d0: 67 65 2e 20 20 54 68 65 20 44 6f 6e 74 52 6f 6c  ge.  The DontRol
27e0: 6c 62 61 63 6b 28 29 20 41 50 49 20 61 74 74 65  lback() API atte
27f0: 6d 70 74 73 20 74 6f 20 73 61 79 0a 2a 2a 20 20  mpts to say.**  
2800: 20 20 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74     that the cont
2810: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
2820: 6f 6e 20 64 69 73 6b 20 69 73 20 75 6e 69 6d 70  on disk is unimp
2830: 6f 72 74 61 6e 74 20 28 69 74 20 69 73 20 61 6e  ortant (it is an
2840: 0a 2a 2a 20 20 20 20 20 75 6e 75 73 65 64 20 70  .**     unused p
2850: 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  age on the freel
2860: 69 73 74 29 20 73 6f 20 74 68 61 74 20 69 74 20  ist) so that it 
2870: 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 74  is unnecessary t
2880: 6f 20 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62 61  o .**     rollba
2890: 63 6b 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ck changes to th
28a0: 69 73 20 70 61 67 65 20 62 65 63 61 75 73 65 20  is page because 
28b0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
28c0: 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63  he page.**     c
28d0: 61 6e 20 63 68 61 6e 67 65 20 77 69 74 68 6f 75  an change withou
28e0: 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6d  t changing the m
28f0: 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  eaning of the da
2900: 74 61 62 61 73 65 2e 20 20 54 68 69 73 0a 2a 2a  tabase.  This.**
2910: 20 20 20 20 20 66 6c 61 67 20 6f 76 65 72 72 69       flag overri
2920: 64 65 73 20 61 6e 79 20 44 6f 6e 74 52 6f 6c 6c  des any DontRoll
2930: 62 61 63 6b 28 29 20 61 74 74 65 6d 70 74 2e 20  back() attempt. 
2940: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65   This flag is se
2950: 74 0a 2a 2a 20 20 20 20 20 77 68 65 6e 20 61 20  t.**     when a 
2960: 70 61 67 65 20 74 68 61 74 20 6f 72 69 67 69 6e  page that origin
2970: 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 76  ally contained v
2980: 61 6c 69 64 20 64 61 74 61 20 69 73 20 61 64 64  alid data is add
2990: 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  ed to.**     the
29a0: 20 66 72 65 65 6c 69 73 74 2e 20 20 4c 61 74 65   freelist.  Late
29b0: 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74 72  r in the same tr
29c0: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20  ansaction, this 
29d0: 70 61 67 65 20 6d 69 67 68 74 0a 2a 2a 20 20 20  page might.**   
29e0: 20 20 62 65 20 70 75 6c 6c 65 64 20 66 72 6f 6d    be pulled from
29f0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e   the freelist an
2a00: 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d  d reused for som
2a10: 65 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ething different
2a20: 0a 2a 2a 20 20 20 20 20 61 6e 64 20 61 74 20 74  .**     and at t
2a30: 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20 44 6f  hat point the Do
2a40: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50 49  ntRollback() API
2a50: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
2a60: 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20 70  because.**     p
2a70: 61 67 65 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  ages taken from 
2a80: 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 6f 20  the freelist do 
2a90: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70  not need to be p
2aa0: 72 6f 74 65 63 74 65 64 20 62 79 0a 2a 2a 20 20  rotected by.**  
2ab0: 20 20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20     the rollback 
2ac0: 6a 6f 75 72 6e 61 6c 2e 20 20 42 75 74 20 74 68  journal.  But th
2ad0: 69 73 20 66 6c 61 67 20 73 61 79 73 20 74 68 61  is flag says tha
2ae0: 74 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a  t the page was.*
2af0: 2a 20 20 20 20 20 6e 6f 74 20 6f 72 69 67 69 6e  *     not origin
2b00: 61 6c 6c 79 20 70 61 72 74 20 6f 66 20 74 68 65  ally part of the
2b10: 20 66 72 65 65 6c 69 73 74 20 73 6f 20 74 68 61   freelist so tha
2b20: 74 20 69 74 20 73 74 69 6c 6c 20 6e 65 65 64 73  t it still needs
2b30: 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65 20 72 6f   to.**     be ro
2b40: 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69  lled back in spi
2b50: 74 65 20 6f 66 20 61 6e 79 20 73 75 62 73 65 71  te of any subseq
2b60: 75 65 6e 74 20 44 6f 6e 74 52 6f 6c 6c 62 61 63  uent DontRollbac
2b70: 6b 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  k() calls..**.**
2b80: 20 6e 65 65 64 52 65 61 64 20 0a 2a 2a 0a 2a 2a   needRead .**.**
2b90: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 6d       This flag m
2ba0: 65 61 6e 73 20 28 77 68 65 6e 20 74 72 75 65 29  eans (when true)
2bb0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
2bc0: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 61  t of the page ha
2bd0: 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 79 65 74  s.**     not yet
2be0: 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 66 72 6f   been loaded fro
2bf0: 6d 20 64 69 73 6b 2e 20 20 54 68 65 20 69 6e 2d  m disk.  The in-
2c00: 6d 65 6d 6f 72 79 20 63 6f 6e 74 65 6e 74 20 69  memory content i
2c10: 73 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 67 61  s just.**     ga
2c20: 72 62 61 67 65 2e 20 20 28 41 63 74 75 61 6c 6c  rbage.  (Actuall
2c30: 79 2c 20 77 65 20 7a 65 72 6f 20 74 68 65 20 63  y, we zero the c
2c40: 6f 6e 74 65 6e 74 2c 20 62 75 74 20 79 6f 75 20  ontent, but you 
2c50: 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20  should not.**   
2c60: 20 20 6d 61 6b 65 20 61 6e 79 20 61 73 73 75 6d    make any assum
2c70: 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 74 68 65  ptions about the
2c80: 20 63 6f 6e 74 65 6e 74 20 6e 65 76 65 72 74 68   content neverth
2c90: 65 6c 65 73 73 2e 29 20 20 49 66 20 74 68 65 0a  eless.)  If the.
2ca0: 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 69  **     content i
2cb0: 73 20 6e 65 65 64 65 64 20 69 6e 20 74 68 65 20  s needed in the 
2cc0: 66 75 74 75 72 65 2c 20 69 74 20 73 68 6f 75 6c  future, it shoul
2cd0: 64 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  d be read from t
2ce0: 68 65 0a 2a 2a 20 20 20 20 20 6f 72 69 67 69 6e  he.**     origin
2cf0: 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
2d00: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 67 48 64  ..*/.struct PgHd
2d10: 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  r {.  Pager *pPa
2d20: 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ger;            
2d30: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
2d40: 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20  r to which this 
2d50: 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a  page belongs */.
2d60: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d80: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
2d90: 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  ber for this pag
2da0: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  e */.  PgHdr *pN
2db0: 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76 48  extHash, *pPrevH
2dc0: 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f  ash;  /* Hash co
2dd0: 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f  llision chain fo
2de0: 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a  r PgHdr.pgno */.
2df0: 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 66    PagerLruLink f
2e00: 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ree;            
2e10: 20 2f 2a 20 4e 65 78 74 20 61 6e 64 20 70 72 65   /* Next and pre
2e20: 76 69 6f 75 73 20 66 72 65 65 20 70 61 67 65 73  vious free pages
2e30: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
2e40: 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  xtAll;          
2e50: 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f       /* A list o
2e60: 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20  f all pages */. 
2e70: 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20   u8 inJournal;  
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62  /* TRUE if has b
2ea0: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
2eb0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
2ec0: 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  irty;           
2ed0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
2ee0: 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  UE if we need to
2ef0: 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e   write back chan
2f00: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64  ges */.  u8 need
2f10: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
2f20: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20          /* Sync 
2f30: 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77  journal before w
2f40: 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67 65  riting this page
2f50: 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52   */.  u8 alwaysR
2f60: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  ollback;        
2f70: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
2f80: 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66  DontRollback() f
2f90: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
2fa0: 20 20 75 38 20 6e 65 65 64 52 65 61 64 3b 20 20    u8 needRead;  
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 20 2f 2a 20 52 65 61 64 20 63 6f 6e 74 65 6e 74   /* Read content
2fd0: 20 69 66 20 50 61 67 65 72 57 72 69 74 65 28 29   if PagerWrite()
2fe0: 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20   is called */.  
2ff0: 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b 20  short int nRef; 
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3010: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72  * Number of user
3020: 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a  s of this page *
3030: 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74  /.  PgHdr *pDirt
3040: 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79 3b 20  y, *pPrevDirty; 
3050: 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65     /* Dirty page
3060: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
3070: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
3080: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61  _MANAGEMENT.  Pa
3090: 67 65 72 4c 72 75 4c 69 6e 6b 20 67 66 72 65 65  gerLruLink gfree
30a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
30b0: 47 6c 6f 62 61 6c 20 6c 69 73 74 20 6f 66 20 6e  Global list of n
30c0: 52 65 66 3d 3d 30 20 70 61 67 65 73 20 2a 2f 0a  Ref==0 pages */.
30d0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
30e0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
30f0: 0a 20 20 75 33 32 20 70 61 67 65 48 61 73 68 3b  .  u32 pageHash;
3100: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 2a  .#endif.  void *
3110: 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
3120: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
3130: 20 64 61 74 61 20 2a 2f 0a 20 20 2f 2a 20 50 61   data */.  /* Pa
3140: 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73  ger.nExtra bytes
3150: 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 61   of local data a
3160: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 69 73 20  ppended to this 
3170: 68 65 61 64 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  header */.};../*
3180: 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65  .** For an in-me
3190: 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62 61  mory only databa
31a0: 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20 69  se, some extra i
31b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65  nformation is re
31c0: 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20  corded about.** 
31d0: 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68 61  each page so tha
31e0: 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62 65  t changes can be
31f0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28   rolled back.  (
3200: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72  Journal files ar
3210: 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f  e not.** used fo
3220: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
3230: 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f 6c  bases.)  The fol
3240: 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  lowing informati
3250: 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a  on is added to.*
3260: 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  * the end of eve
3270: 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20 66  ry EXTRA block f
3280: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
3290: 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  abases..**.** Th
32a0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  is information c
32b0: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 61  ould have been a
32c0: 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74 6f  dded directly to
32d0: 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75 63   the PgHdr struc
32e0: 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65  ture..** But the
32f0: 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65 20  n it would take 
3300: 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62 79  up an extra 8 by
3310: 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20 6f  tes of storage o
3320: 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a 2a  n every PgHdr.**
3330: 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62   even for disk-b
3340: 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e 20  ased databases. 
3350: 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f 75   Splitting it ou
3360: 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73 2e  t saves 8 bytes.
3370: 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c    This.** is onl
3380: 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20 30  y a savings of 0
3390: 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70 65  .8% but those pe
33a0: 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75 70  rcentages add up
33b0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
33c0: 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50 67  uct PgHistory Pg
33d0: 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74 20  History;.struct 
33e0: 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75 38  PgHistory {.  u8
33f0: 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20   *pOrig;     /* 
3400: 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74 65  Original page te
3410: 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f 20  xt.  Restore to 
3420: 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72  this on a full r
3430: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20  ollback */.  u8 
3440: 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54  *pStmt;     /* T
3450: 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61 74  ext as it was at
3460: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
3470: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
3480: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 50 67 48  atement */.  PgH
3490: 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20 2a  dr *pNextStmt, *
34a0: 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20 4c  pPrevStmt;  /* L
34b0: 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
34c0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
34d0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e  urnal */.  u8 in
34e0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
34f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
3500: 45 20 69 66 20 69 6e 20 74 68 65 20 73 74 61 74  E if in the stat
3510: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
3520: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
3530: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
3540: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
3550: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
3560: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
3570: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
3580: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
3590: 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f  ,N,X) if( P->xCo
35a0: 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43 6f  dec!=0 ){ P->xCo
35b0: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67  dec(P->pCodecArg
35c0: 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65 66  ,D,N,X); }.# def
35d0: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
35e0: 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d 3e  ,X) ((char*)(P->
35f0: 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43 6f  xCodec!=0?P->xCo
3600: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67  dec(P->pCodecArg
3610: 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c 73  ,D,N,X):D)).#els
3620: 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  e.# define CODEC
3630: 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f  1(P,D,N,X) /* NO
3640: 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  -OP */.# define 
3650: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20  CODEC2(P,D,N,X) 
3660: 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64 69  ((char*)D).#endi
3670: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
3680: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
3690: 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f 69  PgHdr into a poi
36a0: 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74 61  nter to its data
36b0: 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67 61  .** and back aga
36c0: 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  in..*/.#define P
36d0: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29 20  GHDR_TO_DATA(P) 
36e0: 20 20 20 28 28 50 29 2d 3e 70 44 61 74 61 29 0a     ((P)->pData).
36f0: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
3700: 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28 76 6f  _EXTRA(G,P) ((vo
3710: 69 64 2a 29 26 28 28 47 29 5b 31 5d 29 29 0a 23  id*)&((G)[1])).#
3720: 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f  define PGHDR_TO_
3730: 48 49 53 54 28 50 2c 50 47 52 29 20 20 5c 0a 20  HIST(P,PGR)  \. 
3740: 20 20 20 20 20 20 20 20 20 20 20 28 28 50 67 48             ((PgH
3750: 69 73 74 6f 72 79 2a 29 26 28 28 63 68 61 72 2a  istory*)&((char*
3760: 29 28 26 28 50 29 5b 31 5d 29 29 5b 28 50 47 52  )(&(P)[1]))[(PGR
3770: 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a  )->nExtra])../*.
3780: 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63  ** A open page c
3790: 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61  ache is an insta
37a0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
37b0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
37c0: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72 43  **.** Pager.errC
37d0: 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ode may be set t
37e0: 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  o SQLITE_IOERR, 
37f0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
3800: 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  or.** or SQLITE_
3810: 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f  FULL. Once one o
3820: 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  f the first thre
3830: 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c  e errors occurs,
3840: 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20   it persists.** 
3850: 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 20  and is returned 
3860: 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  as the result of
3870: 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67   every major pag
3880: 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68  er API call.  Th
3890: 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  e.** SQLITE_FULL
38a0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20   return code is 
38b0: 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65  slightly differe
38c0: 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73 20  nt. It persists 
38d0: 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a  only until the.*
38e0: 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75  * next successfu
38f0: 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65  l rollback is pe
3900: 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70  rformed on the p
3910: 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f  ager cache. Also
3920: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  ,.** SQLITE_FULL
3930: 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74   does not affect
3940: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
3950: 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  rGet() and sqlit
3960: 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 0a  e3PagerLookup().
3970: 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d 61  ** APIs, they ma
3980: 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64 20  y still be used 
3990: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2f  successfully..*/
39a0: 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a  .struct Pager {.
39b0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
39c0: 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Vfs;          /*
39d0: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f   OS functions to
39e0: 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a 20   use for IO */. 
39f0: 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b   u8 journalOpen;
3a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3a10: 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20  True if journal 
3a20: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
3a30: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75   is valid */.  u
3a40: 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  8 journalStarted
3a50: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
3a60: 75 65 20 69 66 20 68 65 61 64 65 72 20 6f 66 20  ue if header of 
3a70: 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
3a80: 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75  d */.  u8 useJou
3a90: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
3aa0: 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c     /* Use a roll
3ab0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20  back journal on 
3ac0: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75  this file */.  u
3ad0: 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20  8 noReadlock;   
3ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
3af0: 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20 6f   not bother to o
3b00: 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20  btain readlocks 
3b10: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65 6e  */.  u8 stmtOpen
3b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3b30: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
3b40: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
3b50: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a  rnal is open */.
3b60: 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b 20    u8 stmtInUse; 
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b80: 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e 20   True we are in 
3b90: 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  a statement subt
3ba0: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
3bb0: 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e 3b  u8 stmtAutoopen;
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3bd0: 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61 6c  pen stmt journal
3be0: 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e   when main journ
3bf0: 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20  al is opened*/. 
3c00: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3c20: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
3c30: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
3c40: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
3c50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3c60: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
3c70: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
3c80: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
3c90: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c   */.  u8 sync_fl
3ca0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
3cb0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43    /* One of SYNC
3cc0: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f  _NORMAL or SYNC_
3cd0: 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 73 74 61  FULL */.  u8 sta
3ce0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
3cf0: 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55        /* PAGER_U
3d00: 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20  NLOCK, _SHARED, 
3d10: 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20  _RESERVED, etc. 
3d20: 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65  */.  u8 tempFile
3d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3d40: 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   /* zFilename is
3d50: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
3d60: 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e  e */.  u8 readOn
3d70: 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ly;             
3d80: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
3d90: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
3da0: 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64  ase */.  u8 need
3db0: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
3dc0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3dd0: 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65  an fsync() is ne
3de0: 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  eded on the jour
3df0: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
3e00: 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20  yCache;         
3e10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3e20: 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61 76  cached pages hav
3e30: 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75  e changed */.  u
3e40: 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  8 alwaysRollback
3e50: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69  ;          /* Di
3e60: 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61  sable DontRollba
3e70: 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61 67  ck() for all pag
3e80: 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62  es */.  u8 memDb
3e90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3ea0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69      /* True to i
3eb0: 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20  nhibit all file 
3ec0: 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d  I/O */.  u8 setM
3ed0: 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
3ee0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3ef0: 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62  a m-j name has b
3f00: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
3f10: 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f  rnl */.  u8 doNo
3f20: 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  tSync;          
3f30: 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e       /* Boolean.
3f40: 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64 6f 20   While true, do 
3f50: 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61  not spill the ca
3f60: 63 68 65 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c  che */.  u8 excl
3f70: 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20  usiveMode;      
3f80: 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e       /* Boolean.
3f90: 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67   True if locking
3fa0: 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45  _mode==EXCLUSIVE
3fb0: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
3fc0: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
3fd0: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
3fe0: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
3ff0: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
4000: 2f 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67 73  /.  u32 vfsFlags
4010: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4020: 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c  /* Flags for sql
4030: 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
4040: 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64   */.  int errCod
4050: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4060: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65    /* One of seve
4070: 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72  ral kinds of err
4080: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53  ors */.  int dbS
4090: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
40a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
40b0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66  f pages in the f
40c0: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69  ile */.  int ori
40d0: 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20  gDbSize;        
40e0: 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62       /* dbSize b
40f0: 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  efore the curren
4100: 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e  t change */.  in
4110: 74 20 73 74 6d 74 53 69 7a 65 3b 20 20 20 20 20  t stmtSize;     
4120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
4130: 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 28 69  e of database (i
4140: 6e 20 70 61 67 65 73 29 20 61 74 20 73 74 6d 74  n pages) at stmt
4150: 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e  _begin() */.  in
4160: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
4170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4180: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
4190: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
41a0: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
41b0: 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  umInit;         
41c0: 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61       /* Quasi-ra
41d0: 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64  ndom value added
41e0: 20 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73   to every checks
41f0: 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74  um */.  int stmt
4200: 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  NRec;           
4210: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4220: 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74   records in stmt
4230: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   subjournal */. 
4240: 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20   int nExtra;    
4250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4260: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  Add this many by
4270: 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  tes to each in-m
4280: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
4290: 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20  int pageSize;   
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
42b0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
42c0: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  n a page */.  in
42d0: 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
42e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
42f0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  al number of in-
4300: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a  memory pages */.
4310: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4330: 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   Number of in-me
4340: 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74 68 20  mory pages with 
4350: 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a  PgHdr.nRef>0 */.
4360: 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20    int mxPage;   
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4380: 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
4390: 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64  of pages to hold
43a0: 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 50   in cache */.  P
43b0: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
43c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
43d0: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
43e0: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
43f0: 73 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 4a  se */.  u8 *aInJ
4400: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
4410: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
4420: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
4430: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
4440: 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 53 74  e */.  u8 *aInSt
4450: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
4460: 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f     /* One bit fo
4470: 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  r each page in t
4480: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
4490: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
44a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
44b0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
44c0: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
44d0: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
44e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
44f0: 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
4500: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  l file */.  char
4510: 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20 20 20   *zDirectory;   
4520: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63          /* Direc
4530: 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61 62 61  tory hold databa
4540: 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66  se and journal f
4550: 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  iles */.  char *
4560: 7a 53 74 6d 74 4a 72 6e 6c 3b 20 20 20 20 20 20  zStmtJrnl;      
4570: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
4580: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
4590: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
45a0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
45b0: 64 2c 20 2a 6a 66 64 3b 20 20 20 20 20 2f 2a 20  d, *jfd;     /* 
45c0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  File descriptors
45d0: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e   for database an
45e0: 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73  d journal */.  s
45f0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 74 66  qlite3_file *stf
4600: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  d;         /* Fi
4610: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
4620: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  r the statement 
4630: 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42  subjournal*/.  B
4640: 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73  usyHandler *pBus
4650: 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f  yHandler;  /* Po
4660: 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 2e  inter to sqlite.
4670: 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20  busyHandler */. 
4680: 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20 6c 72   PagerLruList lr
4690: 75 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  u;           /* 
46a0: 4c 52 55 20 6c 69 73 74 20 6f 66 20 66 72 65 65  LRU list of free
46b0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
46c0: 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20  r *pAll;        
46d0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
46e0: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
46f0: 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74 3b 20    PgHdr *pStmt; 
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4710: 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69   List of pages i
4720: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
4730: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  subjournal */.  
4740: 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b 20 20  PgHdr *pDirty;  
4750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
4760: 69 73 74 20 6f 66 20 61 6c 6c 20 64 69 72 74 79  ist of all dirty
4770: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 36 34 20   pages */.  i64 
4780: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
4790: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
47a0: 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 69  nt byte offset i
47b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
47c0: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
47d0: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
47e0: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
47f0: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
4800: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
4810: 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72 4f 66  .  i64 stmtHdrOf
4820: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
4830: 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  * First journal 
4840: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74  header written t
4850: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  his statement */
4860: 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73 75 6d  .  i64 stmtCksum
4870: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4880: 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68 65 6e  * cksumInit when
4890: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73   statement was s
48a0: 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 36 34 20  tarted */.  i64 
48b0: 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20 20  stmtJSize;      
48c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
48d0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74  of journal at st
48e0: 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20  mt_begin() */.  
48f0: 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b 20  int sectorSize; 
4900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4910: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
4920: 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ze during rollba
4930: 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ck */.#ifdef SQL
4940: 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e  ITE_TEST.  int n
4950: 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20  Hit, nMiss;     
4960: 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20         /* Cache 
4970: 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69 6e 67  hits and missing
4980: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c   */.  int nRead,
4990: 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
49a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61    /* Database pa
49b0: 67 65 73 20 72 65 61 64 2f 77 72 69 74 74 65 6e  ges read/written
49c0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69   */.#endif.  voi
49d0: 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f 72 29  d (*xDestructor)
49e0: 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20 2f  (DbPage*,int); /
49f0: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
4a00: 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e 67  ine when freeing
4a10: 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64   pages */.  void
4a20: 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62   (*xReiniter)(Db
4a30: 50 61 67 65 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a  Page*,int);   /*
4a40: 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   Call this routi
4a50: 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e  ne when reloadin
4a60: 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65  g pages */.#ifde
4a70: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4a80: 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f  EC.  void *(*xCo
4a90: 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
4aa0: 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52  ,Pgno,int); /* R
4ab0: 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65  outine for en/de
4ac0: 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20  coding data */. 
4ad0: 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67   void *pCodecArg
4ae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4af0: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
4b00: 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 23 65  o xCodec() */.#e
4b10: 6e 64 69 66 0a 20 20 69 6e 74 20 6e 48 61 73 68  ndif.  int nHash
4b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4b30: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
4b40: 65 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62  e pager hash tab
4b50: 6c 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a  le */.  PgHdr **
4b60: 61 48 61 73 68 3b 20 20 20 20 20 20 20 20 20 20  aHash;          
4b70: 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c      /* Hash tabl
4b80: 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75  e to map page nu
4b90: 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20 2a 2f  mber to PgHdr */
4ba0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
4bb0: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
4bc0: 41 47 45 4d 45 4e 54 0a 20 20 50 61 67 65 72 20  AGEMENT.  Pager 
4bd0: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
4be0: 20 20 20 20 20 20 2f 2a 20 44 6f 75 62 6c 79 20        /* Doubly 
4bf0: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70  linked list of p
4c00: 61 67 65 72 73 20 6f 6e 20 77 68 69 63 68 20 2a  agers on which *
4c10: 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 72 65 76  /.  Pager *pPrev
4c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4c30: 2f 2a 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  /* sqlite3_relea
4c40: 73 65 5f 6d 65 6d 6f 72 79 28 29 20 77 69 6c 6c  se_memory() will
4c50: 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 6e 74 20 69   work */.  int i
4c60: 49 6e 55 73 65 4d 4d 3b 20 20 20 20 20 20 20 20  InUseMM;        
4c70: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65         /* Non-ze
4c80: 72 6f 20 69 66 20 75 6e 61 76 61 69 6c 61 62 6c  ro if unavailabl
4c90: 65 20 74 6f 20 4d 4d 20 2a 2f 0a 20 20 69 6e 74  e to MM */.  int
4ca0: 20 69 49 6e 55 73 65 44 42 3b 20 20 20 20 20 20   iInUseDB;      
4cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d           /* Non-
4cc0: 7a 65 72 6f 20 69 66 20 69 6e 20 73 71 6c 69 74  zero if in sqlit
4cd0: 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  e3_release_memor
4ce0: 79 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  y() */.#endif.  
4cf0: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
4d10: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
4d20: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
4d30: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63 68   tmp use */.  ch
4d40: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
4d50: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
4d60: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
4d70: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
4d80: 67 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ges */.};../*.**
4d90: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
4da0: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
4db0: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
4dc0: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
4dd0: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
4de0: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
4df0: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
4e00: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
4e10: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
4e20: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
4e30: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
4e40: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4e50: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
4e60: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
4e70: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
4e80: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
4e90: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
4ea0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
4eb0: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
4ec0: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
4ed0: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
4ee0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
4ef0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
4f00: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
4f10: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
4f20: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
4f30: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
4f40: 6c 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  l */.int sqlite3
4f50: 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f  _pager_pgfree_co
4f60: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
4f70: 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
4f80: 61 67 65 73 20 66 72 65 65 64 20 2a 2f 0a 23 20  ages freed */.# 
4f90: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
4fa0: 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a  R(v)  v++.#else.
4fb0: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
4fc0: 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 2f  NCR(v).#endif../
4fd0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
4fe0: 6e 67 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e  ng variable poin
4ff0: 74 73 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  ts to the head o
5000: 66 20 61 20 64 6f 75 62 6c 65 2d 6c 69 6e 6b 65  f a double-linke
5010: 64 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c  d list.** of all
5020: 20 70 61 67 65 72 73 20 74 68 61 74 20 61 72 65   pagers that are
5030: 20 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61   eligible for pa
5040: 67 65 20 73 74 65 61 6c 69 6e 67 20 62 79 20 74  ge stealing by t
5050: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 72 65  he.** sqlite3_re
5060: 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 69  lease_memory() i
5070: 6e 74 65 72 66 61 63 65 2e 20 20 41 63 63 65 73  nterface.  Acces
5080: 73 20 74 6f 20 74 68 69 73 20 6c 69 73 74 20 69  s to this list i
5090: 73 0a 2a 2a 20 70 72 6f 74 65 63 74 65 64 20 62  s.** protected b
50a0: 79 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 55 54  y the SQLITE_MUT
50b0: 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 20 6d  EX_STATIC_MEM2 m
50c0: 75 74 65 78 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  utex..*/.#ifdef 
50d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
50e0: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
50f0: 73 74 61 74 69 63 20 50 61 67 65 72 20 2a 73 71  static Pager *sq
5100: 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 20 3d  lite3PagerList =
5110: 20 30 3b 0a 73 74 61 74 69 63 20 50 61 67 65 72   0;.static Pager
5120: 4c 72 75 4c 69 73 74 20 73 71 6c 69 74 65 33 4c  LruList sqlite3L
5130: 72 75 50 61 67 65 4c 69 73 74 20 3d 20 7b 30 2c  ruPageList = {0,
5140: 20 30 2c 20 30 7d 3b 0a 23 65 6e 64 69 66 0a 0a   0, 0};.#endif..
5150: 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66  ./*.** Journal f
5160: 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20  iles begin with 
5170: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
5180: 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65  gic string.  The
5190: 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74   data.** was obt
51a0: 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f  ained from /dev/
51b0: 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75  random.  It is u
51c0: 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61  sed only as a sa
51d0: 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a  nity check..**.*
51e0: 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20  * Since version 
51f0: 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e  2.8.0, the journ
5200: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69  al format contai
5210: 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  ns additional sa
5220: 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67  nity.** checking
5230: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
5240: 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c  f the power fail
5250: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
5260: 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20  nal is begin.** 
5270: 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61  written, semi-ra
5280: 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74  ndom garbage dat
5290: 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  a might appear i
52a0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
52b0: 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65   file after powe
52c0: 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20  r is restored.  
52d0: 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  If an attempt is
52e0: 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f   then made.** to
52f0: 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61   roll the journa
5300: 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  l back, the data
5310: 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f  base could be co
5320: 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64  rrupted.  The ad
5330: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69  ditional.** sani
5340: 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61  ty checking data
5350: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
5360: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67  o discover the g
5370: 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  arbage in the.**
5380: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e   journal and ign
5390: 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ore it..**.** Th
53a0: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
53b0: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
53c0: 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61  r the new journa
53d0: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74  l format consist
53e0: 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74  s.** of a 32-bit
53f0: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63   checksum on eac
5400: 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20  h page of data. 
5410: 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f   The checksum co
5420: 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65  vers both.** the
5430: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
5440: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67   the pPager->pag
5450: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
5460: 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
5470: 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20  ..** This cksum 
5480: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
5490: 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f  o a 32-bit rando
54a0: 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70  m value that app
54b0: 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  ears in the.** j
54c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68  ournal file righ
54d0: 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64  t after the head
54e0: 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20  er.  The random 
54f0: 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69  initializer is i
5500: 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63  mportant,.** bec
5510: 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74  ause garbage dat
5520: 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  a that appears a
5530: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
5540: 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79  ournal is likely
5550: 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61  .** data that wa
5560: 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20  s once in other 
5570: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
5580: 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64  now been deleted
5590: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72  .  If the.** gar
55a0: 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66  bage data came f
55b0: 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20  rom an obsolete 
55c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
55d0: 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68  e checksums migh
55e0: 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e  t.** be correct.
55f0: 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c    But by initial
5600: 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  izing the checks
5610: 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c  um to random val
5620: 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ue which.** is d
5630: 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
5640: 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d  ry journal, we m
5650: 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73  inimize that ris
5660: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  k..*/.static con
5670: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
5680: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
5690: 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64   = {.  0xd9, 0xd
56a0: 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30  5, 0x05, 0xf9, 0
56b0: 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c  x20, 0xa1, 0x63,
56c0: 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   0xd7,.};../*.**
56d0: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
56e0: 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65   header and of e
56f0: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
5700: 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72  journal is deter
5710: 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  mined.** by the 
5720: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73  following macros
5730: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
5740: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
5750: 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61  r)  ((pPager->pa
5760: 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a  geSize) + 8)../*
5770: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
5780: 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20  header size for 
5790: 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74  this pager. In t
57a0: 68 65 20 66 75 74 75 72 65 2c 20 74 68 69 73 20  he future, this 
57b0: 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20  could be.** set 
57c0: 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65  to some value re
57d0: 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ad from the disk
57e0: 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65   controller. The
57f0: 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68   important.** ch
5800: 61 72 61 63 74 65 72 69 73 74 69 63 20 69 73 20  aracteristic is 
5810: 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20 73  that it is the s
5820: 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64 69  ame size as a di
5830: 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64  sk sector..*/.#d
5840: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
5850: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50  R_SZ(pPager) (pP
5860: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
5870: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  )../*.** The mac
5880: 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65  ro MEMDB is true
5890: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
58a0: 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65  ng with an in-me
58b0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
58c0: 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20  * We do this as 
58d0: 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20  a macro so that 
58e0: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d  if the SQLITE_OM
58f0: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72  IT_MEMORYDB macr
5900: 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  o is set,.** the
5910: 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20   value of MEMDB 
5920: 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61  will be a consta
5930: 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  nt and the compi
5940: 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a  ler will optimiz
5950: 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68  e.** out code th
5960: 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65  at would never e
5970: 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  xecute..*/.#ifde
5980: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
5990: 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20  MORYDB.# define 
59a0: 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20  MEMDB 0.#else.# 
59b0: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61  define MEMDB pPa
59c0: 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69  ger->memDb.#endi
59d0: 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75  f../*.** Page nu
59e0: 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  mber PAGER_MJ_PG
59f0: 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  NO is never used
5a00: 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61   in an SQLite da
5a10: 74 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a  tabase (it is.**
5a20: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f   reserved for wo
5a30: 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77  rking around a w
5a40: 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63  indows/posix inc
5a50: 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49  ompatibility). I
5a60: 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20  t is.** used in 
5a70: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
5a80: 69 67 6e 69 66 79 20 74 68 61 74 20 74 68 65 20  ignify that the 
5a90: 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65  remainder of the
5aa0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
5ab0: 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20  * is devoted to 
5ac0: 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72  storing a master
5ad0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20   journal name - 
5ae0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
5af0: 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f  e pages to.** ro
5b00: 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d  ll back. See com
5b10: 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69  ments for functi
5b20: 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  on writeMasterJo
5b30: 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61  urnal() for deta
5b40: 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69  ils..*/./* #defi
5b50: 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  ne PAGER_MJ_PGNO
5b60: 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54  (x) (PENDING_BYT
5b70: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
5b80: 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )) */.#define PA
5b90: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28  GER_MJ_PGNO(x) (
5ba0: 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28  (PENDING_BYTE/((
5bb0: 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31  x)->pageSize))+1
5bc0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  )../*.** The max
5bd0: 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20  imum legal page 
5be0: 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20  number is (2^31 
5bf0: 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  - 1)..*/.#define
5c00: 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20   PAGER_MAX_PGNO 
5c10: 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a  2147483647../*.*
5c20: 2a 20 54 68 65 20 70 61 67 65 72 45 6e 74 65 72  * The pagerEnter
5c30: 28 29 20 61 6e 64 20 70 61 67 65 72 4c 65 61 76  () and pagerLeav
5c40: 65 28 29 20 72 6f 75 74 69 6e 65 73 20 61 63 71  e() routines acq
5c50: 75 69 72 65 20 61 6e 64 20 72 65 6c 65 61 73 65  uire and release
5c60: 0a 2a 2a 20 61 20 6d 75 74 65 78 20 6f 6e 20 65  .** a mutex on e
5c70: 61 63 68 20 70 61 67 65 72 2e 20 20 54 68 65 20  ach pager.  The 
5c80: 6d 75 74 65 78 20 69 73 20 72 65 63 75 72 73 69  mutex is recursi
5c90: 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ve..**.** This i
5ca0: 73 20 61 20 73 70 65 63 69 61 6c 2d 70 75 72 70  s a special-purp
5cb0: 6f 73 65 20 6d 75 74 65 78 2e 20 20 49 74 20 6f  ose mutex.  It o
5cc0: 6e 6c 79 20 70 72 6f 76 69 64 65 73 20 6d 75 74  nly provides mut
5cd0: 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e 0a 2a 2a  ual exclusion.**
5ce0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 42 74 72   between the Btr
5cf0: 65 65 20 61 6e 64 20 74 68 65 20 4d 65 6d 6f 72  ee and the Memor
5d00: 79 20 4d 61 6e 61 67 65 6d 65 6e 74 20 73 71 6c  y Management sql
5d10: 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
5d20: 6f 72 79 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f  ory().** functio
5d30: 6e 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  n.  It does not 
5d40: 70 72 65 76 65 6e 74 2c 20 66 6f 72 20 65 78 61  prevent, for exa
5d50: 6d 70 6c 65 2c 20 74 77 6f 20 42 74 72 65 65 73  mple, two Btrees
5d60: 20 66 72 6f 6d 20 61 63 63 65 73 73 69 6e 67 0a   from accessing.
5d70: 2a 2a 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  ** the same page
5d80: 72 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  r at the same ti
5d90: 6d 65 2e 20 20 4f 74 68 65 72 20 67 65 6e 65 72  me.  Other gener
5da0: 61 6c 2d 70 75 72 70 6f 73 65 20 6d 75 74 65 78  al-purpose mutex
5db0: 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 62 74 72  es in.** the btr
5dc0: 65 65 20 6c 61 79 65 72 20 68 61 6e 64 6c 65 20  ee layer handle 
5dd0: 74 68 61 74 20 63 68 6f 72 65 2e 0a 2a 2f 0a 23  that chore..*/.#
5de0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
5df0: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
5e00: 45 4d 45 4e 54 0a 20 20 73 74 61 74 69 63 20 76  EMENT.  static v
5e10: 6f 69 64 20 70 61 67 65 72 45 6e 74 65 72 28 50  oid pagerEnter(P
5e20: 61 67 65 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d  ager *p){.    p-
5e30: 3e 69 49 6e 55 73 65 44 42 2b 2b 3b 0a 20 20 20  >iInUseDB++;.   
5e40: 20 69 66 28 20 70 2d 3e 69 49 6e 55 73 65 4d 4d   if( p->iInUseMM
5e50: 20 26 26 20 70 2d 3e 69 49 6e 55 73 65 44 42 3d   && p->iInUseDB=
5e60: 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
5e70: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
5e80: 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 20 3d 20  ;.      mutex = 
5e90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
5ea0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
5eb0: 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20  _STATIC_MEM2);. 
5ec0: 20 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42       p->iInUseDB
5ed0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
5ee0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
5ef0: 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 70 2d  mutex);.      p-
5f00: 3e 69 49 6e 55 73 65 44 42 20 3d 20 31 3b 0a 20  >iInUseDB = 1;. 
5f10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
5f20: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b  ex_leave(mutex);
5f30: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
5f40: 74 28 20 70 2d 3e 69 49 6e 55 73 65 4d 4d 3d 3d  t( p->iInUseMM==
5f50: 30 20 29 3b 0a 20 20 7d 0a 20 20 73 74 61 74 69  0 );.  }.  stati
5f60: 63 20 76 6f 69 64 20 70 61 67 65 72 4c 65 61 76  c void pagerLeav
5f70: 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 20  e(Pager *p){.   
5f80: 20 70 2d 3e 69 49 6e 55 73 65 44 42 2d 2d 3b 0a   p->iInUseDB--;.
5f90: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
5fa0: 49 6e 55 73 65 44 42 3e 3d 30 20 29 3b 0a 20 20  InUseDB>=0 );.  
5fb0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
5fc0: 20 70 61 67 65 72 45 6e 74 65 72 28 58 29 0a 23   pagerEnter(X).#
5fd0: 20 64 65 66 69 6e 65 20 70 61 67 65 72 4c 65 61   define pagerLea
5fe0: 76 65 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ve(X).#endif../*
5ff0: 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72  .** Enable refer
6000: 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b  ence count track
6010: 69 6e 67 20 28 66 6f 72 20 64 65 62 75 67 67 69  ing (for debuggi
6020: 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66  ng) here:.*/.#if
6030: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
6040: 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f 72 65  .  int pager3_re
6050: 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30  finfo_enable = 0
6060: 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  ;.  static void 
6070: 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 50 67  pager_refinfo(Pg
6080: 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73 74 61  Hdr *p){.    sta
6090: 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  tic int cnt = 0;
60a0: 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 72 33  .    if( !pager3
60b0: 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20  _refinfo_enable 
60c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71  ) return;.    sq
60d0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
60e0: 28 0a 20 20 20 20 20 20 20 22 52 45 46 43 4e 54  (.       "REFCNT
60f0: 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20 6e 52  : %4d addr=%p nR
6100: 65 66 3d 25 2d 33 64 20 74 6f 74 61 6c 3d 25 64  ef=%-3d total=%d
6110: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70  \n",.       p->p
6120: 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  gno, PGHDR_TO_DA
6130: 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 2c 20  TA(p), p->nRef, 
6140: 70 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 0a  p->pPager->nRef.
6150: 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b      );.    cnt++
6160: 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67  ;   /* Something
6170: 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
6180: 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23  oint on */.  }.#
6190: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
61a0: 58 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66  X)  pager_refinf
61b0: 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  o(X).#else.# def
61c0: 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23  ine REFINFO(X).#
61d0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  endif../*.** Add
61e0: 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
61f0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 6e 6b   end of the link
6200: 65 64 20 6c 69 73 74 20 6d 61 6e 61 67 65 64 20  ed list managed 
6210: 62 79 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  by structure.** 
6220: 70 4c 69 73 74 20 28 70 50 67 20 62 65 63 6f 6d  pList (pPg becom
6230: 65 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  es the last entr
6240: 79 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2d 20  y in the list - 
6250: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
6260: 79 20 0a 2a 2a 20 75 73 65 64 29 2e 20 41 72 67  y .** used). Arg
6270: 75 6d 65 6e 74 20 70 4c 69 6e 6b 20 73 68 6f 75  ument pLink shou
6280: 6c 64 20 70 6f 69 6e 74 20 74 6f 20 65 69 74 68  ld point to eith
6290: 65 72 20 70 50 67 2d 3e 66 72 65 65 20 6f 72 20  er pPg->free or 
62a0: 70 50 67 2d 3e 67 66 72 65 65 2c 0a 2a 2a 20 64  pPg->gfree,.** d
62b0: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
62c0: 68 65 72 20 70 50 67 20 69 73 20 62 65 69 6e 67  her pPg is being
62d0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 61   added to the pa
62e0: 67 65 72 2d 73 70 65 63 69 66 69 63 20 6f 72 0a  ger-specific or.
62f0: 2a 2a 20 67 6c 6f 62 61 6c 20 4c 52 55 20 6c 69  ** global LRU li
6300: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
6310: 69 64 20 6c 69 73 74 41 64 64 28 50 61 67 65 72  id listAdd(Pager
6320: 4c 72 75 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  LruList *pList, 
6330: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c  PagerLruLink *pL
6340: 69 6e 6b 2c 20 50 67 48 64 72 20 2a 70 50 67 29  ink, PgHdr *pPg)
6350: 7b 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74  {.  pLink->pNext
6360: 20 3d 20 30 3b 0a 20 20 70 4c 69 6e 6b 2d 3e 70   = 0;.  pLink->p
6370: 50 72 65 76 20 3d 20 70 4c 69 73 74 2d 3e 70 4c  Prev = pList->pL
6380: 61 73 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ast;..#ifdef SQL
6390: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
63a0: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 61  Y_MANAGEMENT.  a
63b0: 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50  ssert(pLink==&pP
63c0: 67 2d 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e 6b  g->free || pLink
63d0: 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 29 3b 0a  ==&pPg->gfree);.
63e0: 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d    assert(pLink==
63f0: 26 70 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20 70  &pPg->gfree || p
6400: 4c 69 73 74 21 3d 26 73 71 6c 69 74 65 33 4c 72  List!=&sqlite3Lr
6410: 75 50 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e 64  uPageList);.#end
6420: 69 66 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  if..  if( pList-
6430: 3e 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 69 6e  >pLast ){.    in
6440: 74 20 69 4f 66 66 20 3d 20 28 63 68 61 72 20 2a  t iOff = (char *
6450: 29 70 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20 2a  )pLink - (char *
6460: 29 70 50 67 3b 0a 20 20 20 20 50 61 67 65 72 4c  )pPg;.    PagerL
6470: 72 75 4c 69 6e 6b 20 2a 70 4c 61 73 74 4c 69 6e  ruLink *pLastLin
6480: 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e  k = (PagerLruLin
6490: 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c 69  k *)(&((u8 *)pLi
64a0: 73 74 2d 3e 70 4c 61 73 74 29 5b 69 4f 66 66 5d  st->pLast)[iOff]
64b0: 29 3b 0a 20 20 20 20 70 4c 61 73 74 4c 69 6e 6b  );.    pLastLink
64c0: 2d 3e 70 4e 65 78 74 20 3d 20 70 50 67 3b 0a 20  ->pNext = pPg;. 
64d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
64e0: 72 74 28 21 70 4c 69 73 74 2d 3e 70 46 69 72 73  rt(!pList->pFirs
64f0: 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  t);.    pList->p
6500: 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 7d  First = pPg;.  }
6510: 0a 0a 20 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74  ..  pList->pLast
6520: 20 3d 20 70 50 67 3b 0a 20 20 69 66 28 20 21 70   = pPg;.  if( !p
6530: 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63  List->pFirstSync
6540: 65 64 20 26 26 20 70 50 67 2d 3e 6e 65 65 64 53  ed && pPg->needS
6550: 79 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ync==0 ){.    pL
6560: 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ist->pFirstSynce
6570: 64 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a  d = pPg;.  }.}..
6580: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 50 67  /*.** Remove pPg
6590: 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6d   from the list m
65a0: 61 6e 61 67 65 64 20 62 79 20 74 68 65 20 73 74  anaged by the st
65b0: 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
65c0: 74 6f 20 62 79 20 70 4c 69 73 74 2e 0a 2a 2a 0a  to by pList..**.
65d0: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 69 6e  ** Argument pLin
65e0: 6b 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74  k should point t
65f0: 6f 20 65 69 74 68 65 72 20 70 50 67 2d 3e 66 72  o either pPg->fr
6600: 65 65 20 6f 72 20 70 50 67 2d 3e 67 66 72 65 65  ee or pPg->gfree
6610: 2c 20 64 65 70 65 6e 64 69 6e 67 20 0a 2a 2a 20  , depending .** 
6620: 6f 6e 20 77 68 65 74 68 65 72 20 70 50 67 20 69  on whether pPg i
6630: 73 20 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f  s being added to
6640: 20 74 68 65 20 70 61 67 65 72 2d 73 70 65 63 69   the pager-speci
6650: 66 69 63 20 6f 72 20 67 6c 6f 62 61 6c 20 4c 52  fic or global LR
6660: 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  U list..*/.stati
6670: 63 20 76 6f 69 64 20 6c 69 73 74 52 65 6d 6f 76  c void listRemov
6680: 65 28 50 61 67 65 72 4c 72 75 4c 69 73 74 20 2a  e(PagerLruList *
6690: 70 4c 69 73 74 2c 20 50 61 67 65 72 4c 72 75 4c  pList, PagerLruL
66a0: 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20 50 67 48 64  ink *pLink, PgHd
66b0: 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 69  r *pPg){.  int i
66c0: 4f 66 66 20 3d 20 28 63 68 61 72 20 2a 29 70 4c  Off = (char *)pL
66d0: 69 6e 6b 20 2d 20 28 63 68 61 72 20 2a 29 70 50  ink - (char *)pP
66e0: 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  g;..#ifdef SQLIT
66f0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
6700: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 61 73 73  MANAGEMENT.  ass
6710: 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d  ert(pLink==&pPg-
6720: 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e 6b 3d 3d  >free || pLink==
6730: 26 70 50 67 2d 3e 67 66 72 65 65 29 3b 0a 20 20  &pPg->gfree);.  
6740: 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70  assert(pLink==&p
6750: 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20 70 4c 69  Pg->gfree || pLi
6760: 73 74 21 3d 26 73 71 6c 69 74 65 33 4c 72 75 50  st!=&sqlite3LruP
6770: 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66  ageList);.#endif
6780: 0a 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 4c 69  ..  if( pPg==pLi
6790: 73 74 2d 3e 70 46 69 72 73 74 20 29 7b 0a 20 20  st->pFirst ){.  
67a0: 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 20    pList->pFirst 
67b0: 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLink->pNext;.
67c0: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 70    }.  if( pPg==p
67d0: 4c 69 73 74 2d 3e 70 4c 61 73 74 20 29 7b 0a 20  List->pLast ){. 
67e0: 20 20 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20     pList->pLast 
67f0: 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 3b 0a  = pLink->pPrev;.
6800: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 6e 6b 2d    }.  if( pLink-
6810: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 50 61  >pPrev ){.    Pa
6820: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 50 72 65  gerLruLink *pPre
6830: 76 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72  vLink = (PagerLr
6840: 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a  uLink *)(&((u8 *
6850: 29 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 29 5b 69  )pLink->pPrev)[i
6860: 4f 66 66 5d 29 3b 0a 20 20 20 20 70 50 72 65 76  Off]);.    pPrev
6870: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 4c  Link->pNext = pL
6880: 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ink->pNext;.  }.
6890: 20 20 69 66 28 20 70 4c 69 6e 6b 2d 3e 70 4e 65    if( pLink->pNe
68a0: 78 74 20 29 7b 0a 20 20 20 20 50 61 67 65 72 4c  xt ){.    PagerL
68b0: 72 75 4c 69 6e 6b 20 2a 70 4e 65 78 74 4c 69 6e  ruLink *pNextLin
68c0: 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e  k = (PagerLruLin
68d0: 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c 69  k *)(&((u8 *)pLi
68e0: 6e 6b 2d 3e 70 4e 65 78 74 29 5b 69 4f 66 66 5d  nk->pNext)[iOff]
68f0: 29 3b 0a 20 20 20 20 70 4e 65 78 74 4c 69 6e 6b  );.    pNextLink
6900: 2d 3e 70 50 72 65 76 20 3d 20 70 4c 69 6e 6b 2d  ->pPrev = pLink-
6910: 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66  >pPrev;.  }.  if
6920: 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70 46  ( pPg==pList->pF
6930: 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20  irstSynced ){.  
6940: 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 4c 69    PgHdr *p = pLi
6950: 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 77  nk->pNext;.    w
6960: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65  hile( p && p->ne
6970: 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
6980: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c  PagerLruLink *pL
6990: 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b   = (PagerLruLink
69a0: 20 2a 29 28 26 28 28 75 38 20 2a 29 70 29 5b 69   *)(&((u8 *)p)[i
69b0: 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 70 20 3d  Off]);.      p =
69c0: 20 70 4c 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20   pL->pNext;.    
69d0: 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69  }.    pList->pFi
69e0: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
69f0: 20 7d 0a 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65   }..  pLink->pNe
6a00: 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65  xt = pLink->pPre
6a10: 76 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  v = 0;.}../* .**
6a20: 20 41 64 64 20 70 61 67 65 20 70 50 67 20 74 6f   Add page pPg to
6a30: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65   the list of fre
6a40: 65 20 70 61 67 65 73 20 66 6f 72 20 74 68 65 20  e pages for the 
6a50: 70 61 67 65 72 2e 20 49 66 20 0a 2a 2a 20 6d 65  pager. If .** me
6a60: 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
6a70: 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c 73 6f  is enabled, also
6a80: 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f   add the page to
6a90: 20 74 68 65 20 67 6c 6f 62 61 6c 20 0a 2a 2a 20   the global .** 
6aa0: 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67  list of free pag
6ab0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
6ac0: 69 64 20 6c 72 75 4c 69 73 74 41 64 64 28 50 67  id lruListAdd(Pg
6ad0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 6c 69 73  Hdr *pPg){.  lis
6ae0: 74 41 64 64 28 26 70 50 67 2d 3e 70 50 61 67 65  tAdd(&pPg->pPage
6af0: 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d 3e 66 72  r->lru, &pPg->fr
6b00: 65 65 2c 20 70 50 67 29 3b 0a 23 69 66 64 65 66  ee, pPg);.#ifdef
6b10: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
6b20: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
6b30: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 70 50 61  .  if( !pPg->pPa
6b40: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
6b50: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6b60: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75  enter(sqlite3_mu
6b70: 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
6b80: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52  _MUTEX_STATIC_LR
6b90: 55 29 29 3b 0a 20 20 20 20 6c 69 73 74 41 64 64  U));.    listAdd
6ba0: 28 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  (&sqlite3LruPage
6bb0: 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67 66 72 65  List, &pPg->gfre
6bc0: 65 2c 20 70 50 67 29 3b 0a 20 20 20 20 73 71 6c  e, pPg);.    sql
6bd0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6be0: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
6bf0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
6c00: 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
6c10: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
6c20: 20 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 61 67 65   .** Remove page
6c30: 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20 6c 69   pPg from the li
6c40: 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73  st of free pages
6c50: 20 66 6f 72 20 74 68 65 20 61 73 73 6f 63 69 61   for the associa
6c60: 74 65 64 20 70 61 67 65 72 2e 0a 2a 2a 20 49 66  ted pager..** If
6c70: 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65   memory-manageme
6c80: 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61  nt is enabled, a
6c90: 6c 73 6f 20 72 65 6d 6f 76 65 20 70 50 67 20 66  lso remove pPg f
6ca0: 72 6f 6d 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c  rom the global l
6cb0: 69 73 74 0a 2a 2a 20 6f 66 20 66 72 65 65 20 70  ist.** of free p
6cc0: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
6cd0: 76 6f 69 64 20 6c 72 75 4c 69 73 74 52 65 6d 6f  void lruListRemo
6ce0: 76 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ve(PgHdr *pPg){.
6cf0: 20 20 6c 69 73 74 52 65 6d 6f 76 65 28 26 70 50    listRemove(&pP
6d00: 67 2d 3e 70 50 61 67 65 72 2d 3e 6c 72 75 2c 20  g->pPager->lru, 
6d10: 26 70 50 67 2d 3e 66 72 65 65 2c 20 70 50 67 29  &pPg->free, pPg)
6d20: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6d30: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
6d40: 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NAGEMENT.  if( !
6d50: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d  pPg->pPager->mem
6d60: 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Db ){.    sqlite
6d70: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71  3_mutex_enter(sq
6d80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
6d90: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
6da0: 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20  TATIC_LRU));.   
6db0: 20 6c 69 73 74 52 65 6d 6f 76 65 28 26 73 71 6c   listRemove(&sql
6dc0: 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2c  ite3LruPageList,
6dd0: 20 26 70 50 67 2d 3e 67 66 72 65 65 2c 20 70 50   &pPg->gfree, pP
6de0: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g);.    sqlite3_
6df0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
6e00: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
6e10: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
6e20: 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23  TIC_LRU));.  }.#
6e30: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  endif.}../* .** 
6e40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
6e50: 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 61 66 74   called just aft
6e60: 65 72 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  er the needSync 
6e70: 66 6c 61 67 20 68 61 73 20 62 65 65 6e 20 63 6c  flag has been cl
6e80: 65 61 72 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 6c  eared.** from al
6e90: 6c 20 70 61 67 65 73 20 6d 61 6e 61 67 65 64 20  l pages managed 
6ea0: 62 79 20 70 50 61 67 65 72 20 28 75 73 75 61 6c  by pPager (usual
6eb0: 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6a  ly because the j
6ec0: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68  ournal file.** h
6ed0: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 79 6e  as just been syn
6ee0: 63 65 64 29 2e 20 49 74 20 75 70 64 61 74 65 73  ced). It updates
6ef0: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6c 72 75   the pPager->lru
6f00: 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 76 61  .pFirstSynced va
6f10: 72 69 61 62 6c 65 0a 2a 2a 20 61 6e 64 2c 20 69  riable.** and, i
6f20: 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d  f memory-managem
6f30: 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ent is enabled, 
6f40: 74 68 65 20 73 71 6c 69 74 65 33 4c 72 75 50 61  the sqlite3LruPa
6f50: 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e  geList.pFirstSyn
6f60: 63 65 64 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ced.** variable 
6f70: 61 6c 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  also..*/.static 
6f80: 76 6f 69 64 20 6c 72 75 4c 69 73 74 53 65 74 46  void lruListSetF
6f90: 69 72 73 74 53 79 6e 63 65 64 28 50 61 67 65 72  irstSynced(Pager
6fa0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70 50 61   *pPager){.  pPa
6fb0: 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53  ger->lru.pFirstS
6fc0: 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
6fd0: 6c 72 75 2e 70 46 69 72 73 74 3b 0a 23 69 66 64  lru.pFirst;.#ifd
6fe0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6ff0: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
7000: 4e 54 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  NT.  if( !pPager
7010: 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 50  ->memDb ){.    P
7020: 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 73 71 6c  gHdr *p;.    sql
7030: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
7040: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
7050: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
7060: 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
7070: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
7080: 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69  3LruPageList.pFi
7090: 72 73 74 3b 20 70 20 26 26 20 70 2d 3e 6e 65 65  rst; p && p->nee
70a0: 64 53 79 6e 63 3b 20 70 3d 70 2d 3e 67 66 72 65  dSync; p=p->gfre
70b0: 65 2e 70 4e 65 78 74 29 3b 0a 20 20 20 20 61 73  e.pNext);.    as
70c0: 73 65 72 74 28 70 3d 3d 70 50 61 67 65 72 2d 3e  sert(p==pPager->
70d0: 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64  lru.pFirstSynced
70e0: 20 7c 7c 20 70 3d 3d 73 71 6c 69 74 65 33 4c 72   || p==sqlite3Lr
70f0: 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74  uPageList.pFirst
7100: 53 79 6e 63 65 64 29 3b 0a 20 20 20 20 73 71 6c  Synced);.    sql
7110: 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e  ite3LruPageList.
7120: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
7130: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
7140: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
7150: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
7160: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
7170: 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23 65 6e  C_LRU));.  }.#en
7180: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
7190: 75 72 6e 20 74 72 75 65 20 69 66 20 70 61 67 65  urn true if page
71a0: 20 2a 70 50 67 20 68 61 73 20 61 6c 72 65 61 64   *pPg has alread
71b0: 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
71c0: 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  o the statement.
71d0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 6f 72 20 73  ** journal (or s
71e0: 74 61 74 65 6d 65 6e 74 20 73 6e 61 70 73 68 6f  tatement snapsho
71f0: 74 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  t has been creat
7200: 65 64 2c 20 69 66 20 2a 70 50 67 20 69 73 20 70  ed, if *pPg is p
7210: 61 72 74 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d  art.** of an in-
7220: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 29  memory database)
7230: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7240: 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28  pageInStatement(
7250: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
7260: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
7270: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
7280: 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72  ( MEMDB ){.    r
7290: 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 48  eturn PGHDR_TO_H
72a0: 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
72b0: 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20 7d 65 6c 73  ->inStmt;.  }els
72c0: 65 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  e{.    Pgno pgno
72d0: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
72e0: 20 20 75 38 20 2a 61 20 3d 20 70 50 61 67 65 72    u8 *a = pPager
72f0: 2d 3e 61 49 6e 53 74 6d 74 3b 0a 20 20 20 20 72  ->aInStmt;.    r
7300: 65 74 75 72 6e 20 28 61 20 26 26 20 28 69 6e 74  eturn (a && (int
7310: 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  )pgno<=pPager->s
7320: 74 6d 74 53 69 7a 65 20 26 26 20 28 61 5b 70 67  tmtSize && (a[pg
7330: 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e  no/8] & (1<<(pgn
7340: 6f 26 37 29 29 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  o&7))));.  }.}..
7350: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
7360: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   size of the pag
7370: 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  er hash table to
7380: 20 4e 2e 20 20 4e 20 6d 75 73 74 20 62 65 20 61   N.  N must be a
7390: 20 70 6f 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f   power.** of two
73a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
73b0: 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61   pager_resize_ha
73c0: 73 68 5f 74 61 62 6c 65 28 50 61 67 65 72 20 2a  sh_table(Pager *
73d0: 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a  pPager, int N){.
73e0: 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68 2c    PgHdr **aHash,
73f0: 20 2a 70 50 67 3b 0a 20 20 61 73 73 65 72 74 28   *pPg;.  assert(
7400: 20 4e 3e 30 20 26 26 20 28 4e 26 28 4e 2d 31 29   N>0 && (N&(N-1)
7410: 29 3d 3d 30 20 29 3b 0a 20 20 70 61 67 65 72 4c  )==0 );.  pagerL
7420: 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
7430: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 42 65 6e  sqlite3MallocBen
7440: 69 67 6e 46 61 69 6c 75 72 65 28 28 69 6e 74 29  ignFailure((int)
7450: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a  pPager->aHash);.
7460: 20 20 61 48 61 73 68 20 3d 20 73 71 6c 69 74 65    aHash = sqlite
7470: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
7480: 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e 20  eof(aHash[0])*N 
7490: 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  );.  pagerEnter(
74a0: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 61  pPager);.  if( a
74b0: 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Hash==0 ){.    /
74c0: 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65 68  * Failure to reh
74d0: 61 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65 72  ash is not an er
74e0: 72 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ror.  It is only
74f0: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68   a performance h
7500: 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  it. */.    retur
7510: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
7520: 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48  _free(pPager->aH
7530: 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ash);.  pPager->
7540: 6e 48 61 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61  nHash = N;.  pPa
7550: 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 61 48 61  ger->aHash = aHa
7560: 73 68 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  sh;.  for(pPg=pP
7570: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
7580: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
7590: 6c 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a  ll){.    int h;.
75a0: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
75b0: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  o==0 ){.      as
75c0: 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
75d0: 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e  Hash==0 && pPg->
75e0: 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
75f0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
7600: 20 20 20 20 7d 0a 20 20 20 20 68 20 3d 20 70 50      }.    h = pP
7610: 67 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b  g->pgno & (N-1);
7620: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
7630: 61 73 68 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a  ash = aHash[h];.
7640: 20 20 20 20 69 66 28 20 61 48 61 73 68 5b 68 5d      if( aHash[h]
7650: 20 29 7b 0a 20 20 20 20 20 20 61 48 61 73 68 5b   ){.      aHash[
7660: 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  h]->pPrevHash = 
7670: 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  pPg;.    }.    a
7680: 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
7690: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73     pPg->pPrevHas
76a0: 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  h = 0;.  }.}../*
76b0: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
76c0: 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  t integer from t
76d0: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
76e0: 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65  scriptor.  Store
76f0: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
7700: 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20  that is read in 
7710: 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53  *pRes.  Return S
7720: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
7730: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f  ything worked, o
7740: 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  r an.** error co
7750: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
7760: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
7770: 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65  * All values are
7780: 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20   stored on disk 
7790: 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a  as big-endian..*
77a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
77b0: 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  d32bits(sqlite3_
77c0: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
77d0: 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29  fset, u32 *pRes)
77e0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
77f0: 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72  r ac[4];.  int r
7800: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
7810: 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66  d(fd, ac, sizeof
7820: 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20  (ac), offset);. 
7830: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7840: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  OK ){.    *pRes 
7850: 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
7860: 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(ac);.  }.  ret
7870: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7880: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
7890: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
78a0: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
78b0: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
78c0: 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  order..*/.#defin
78d0: 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29  e put32bits(A,B)
78e0: 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74    sqlite3Put4byt
78f0: 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a  e((u8*)A,B)../*.
7900: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
7910: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74  t integer into t
7920: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
7930: 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72  scriptor.  Retur
7940: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
7950: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
7960: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
7970: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
7980: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
7990: 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71  t write32bits(sq
79a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
79b0: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
79c0: 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b  val){.  char ac[
79d0: 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  4];.  put32bits(
79e0: 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75  ac, val);.  retu
79f0: 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  rn sqlite3OsWrit
7a00: 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66  e(fd, ac, 4, off
7a10: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  set);.}../*.** I
7a20: 66 20 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70  f file pFd is op
7a30: 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  en, call sqlite3
7a40: 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74  OsUnlock() on it
7a50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7a60: 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  osUnlock(sqlite3
7a70: 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20  _file *pFd, int 
7a80: 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 70  eLock){.  if( !p
7a90: 46 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  Fd->pMethods ){.
7aa0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7ab0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
7ac0: 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  rn sqlite3OsUnlo
7ad0: 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a  ck(pFd, eLock);.
7ae0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
7af0: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
7b00: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
7b10: 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
7b20: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
7b30: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69  * can be used wi
7b40: 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54  th this pager. T
7b50: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
7b60: 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a  can be used if:.
7b70: 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76  **.**  (a) the v
7b80: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
7b90: 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74   OsDeviceCharact
7ba0: 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63  eristics() indic
7bb0: 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  ates that.**    
7bc0: 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67    a database pag
7bd0: 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  e may be written
7be0: 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64   atomically, and
7bf0: 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c  .**  (b) the val
7c00: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
7c10: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73  sSectorSize() is
7c20: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
7c30: 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ual.**      to t
7c40: 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
7c50: 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d  .** If the optim
7c60: 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ization cannot b
7c70: 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74  e used, 0 is ret
7c80: 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e  urned. If it can
7c90: 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65   be used,.** the
7ca0: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
7cb0: 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65  rned is the size
7cc0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
7cd0: 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20  file when it.** 
7ce0: 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63  contains rollbac
7cf0: 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74  k data for exact
7d00: 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a  ly one page..*/.
7d10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
7d20: 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
7d30: 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e  E.static int jrn
7d40: 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65  lBufferSize(Page
7d50: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
7d60: 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20  t dc;           
7d70: 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63  /* Device charac
7d80: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 69  teristics */.  i
7d90: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
7da0: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
7db0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
7dc0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73         /* Page s
7dd0: 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ize */.  sqlite3
7de0: 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67  _file *fd = pPag
7df0: 65 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66  er->fd;..  if( f
7e00: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
7e10: 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f     dc = sqlite3O
7e20: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
7e30: 69 73 74 69 63 73 28 66 64 29 3b 0a 20 20 20 20  istics(fd);.    
7e40: 6e 53 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nSector = sqlite
7e50: 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66 64  3OsSectorSize(fd
7e60: 29 3b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 70  );.    nPage = p
7e70: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
7e80: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 53  .  }..  assert(S
7e90: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
7ea0: 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
7eb0: 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49 54  ;.  assert(SQLIT
7ec0: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
7ed0: 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
7ee0: 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d 65 74  .  if( !fd->pMet
7ef0: 68 6f 64 73 20 7c 7c 20 28 64 63 26 28 53 51 4c  hods || (dc&(SQL
7f00: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
7f10: 7c 28 6e 50 61 67 65 3e 3e 38 29 29 26 26 6e 53  |(nPage>>8))&&nS
7f20: 65 63 74 6f 72 3c 3d 6e 50 61 67 65 29 20 29 7b  ector<=nPage) ){
7f30: 0a 20 20 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  .    return JOUR
7f40: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
7f50: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
7f60: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
7f70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
7f80: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
7f90: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
7fa0: 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
7fb0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
7fc0: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 72  within the pager
7fd0: 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69  .** code. The fi
7fe0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
7ff0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
8000: 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65   pager structure
8010: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
8020: 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
8030: 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
8040: 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41  ned by a pager A
8050: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  PI function. .**
8060: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
8070: 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
8080: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
8090: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
80a0: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
80b0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
80c0: 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49  ment is SQLITE_I
80d0: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
80e0: 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f  RUPT, or SQLITE_
80f0: 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  FULL.** the erro
8100: 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73  r becomes persis
8110: 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20  tent. Until the 
8120: 70 65 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20  persisten error 
8130: 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73  is cleared,.** s
8140: 75 62 73 65 71 75 65 6e 74 20 41 50 49 20 63 61  ubsequent API ca
8150: 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65  lls on this Page
8160: 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  r will immediate
8170: 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ly return the sa
8180: 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  me .** error cod
8190: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69  e..**.** A persi
81a0: 73 74 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69  stent error indi
81b0: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63  cates that the c
81c0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
81d0: 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63  ager-cache .** c
81e0: 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
81f0: 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e  . This state can
8200: 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63   be cleared by c
8210: 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72  ompletely discar
8220: 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ding .** the con
8230: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
8240: 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74  er-cache. If a t
8250: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61  ransaction was a
8260: 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68  ctive when.** th
8270: 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  e persistent err
8280: 6f 72 20 6f 63 63 75 72 65 64 2c 20 74 68 65 6e  or occured, then
8290: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
82a0: 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a  urnal may need.*
82b0: 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64  * to be replayed
82c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
82d0: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61   pager_unlock(Pa
82e0: 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 73 74  ger *pPager);.st
82f0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
8300: 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
8310: 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
8320: 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
8330: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20  ff;.  assert(.  
8340: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
8350: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
8360: 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67  L ||.       pPag
8370: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
8380: 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20  ITE_OK ||.      
8390: 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   (pPager->errCod
83a0: 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54  e & 0xff)==SQLIT
83b0: 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69  E_IOERR.  );.  i
83c0: 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49  f(.    rc2==SQLI
83d0: 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72  TE_FULL ||.    r
83e0: 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  c2==SQLITE_IOERR
83f0: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
8400: 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b  ITE_CORRUPT.  ){
8410: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
8420: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 69  Code = rc;.    i
8430: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
8440: 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 26  ==PAGER_UNLOCK &
8450: 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  & pPager->nRef==
8460: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
8470: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   the pager is al
8480: 72 65 61 64 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ready unlocked, 
8490: 63 61 6c 6c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  call pager_unloc
84a0: 6b 28 29 20 6e 6f 77 20 74 6f 0a 20 20 20 20 20  k() now to.     
84b0: 20 2a 2a 20 63 6c 65 61 72 20 74 68 65 20 65 72   ** clear the er
84c0: 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 65 6e  ror state and en
84d0: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61  sure that the pa
84e0: 67 65 72 2d 63 61 63 68 65 20 69 73 20 0a 20 20  ger-cache is .  
84f0: 20 20 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c      ** completel
8500: 79 20 65 6d 70 74 79 2e 0a 20 20 20 20 20 20 2a  y empty..      *
8510: 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e  /.      pager_un
8520: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
8530: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8540: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
8550: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
8560: 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74  GES is defined t
8570: 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73  hen we do some s
8580: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a  anity checking.*
8590: 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75  * on the cache u
85a0: 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63  sing a hash func
85b0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75  tion.  This is u
85c0: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a  sed for testing.
85d0: 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ** and debugging
85e0: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66   only..*/.#ifdef
85f0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
8600: 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  GES./*.** Return
8610: 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f   a 32-bit hash o
8620: 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  f the page data 
8630: 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74  for pPage..*/.st
8640: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64  atic u32 pager_d
8650: 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74  atahash(int nByt
8660: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
8670: 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *pData){.  u32 
8680: 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20  hash = 0;.  int 
8690: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
86a0: 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nByte; i++){.   
86b0: 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30   hash = (hash*10
86c0: 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a  39) + pData[i];.
86d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
86e0: 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20  h;.}.static u32 
86f0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50  pager_pagehash(P
8700: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
8710: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74  return pager_dat
8720: 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61  ahash(pPage->pPa
8730: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 0a  ger->pageSize, .
8740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8750: 20 20 20 20 20 20 20 20 28 75 6e 73 69 67 6e 65          (unsigne
8760: 64 20 63 68 61 72 20 2a 29 50 47 48 44 52 5f 54  d char *)PGHDR_T
8770: 4f 5f 44 41 54 41 28 70 50 61 67 65 29 29 3b 0a  O_DATA(pPage));.
8780: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
8790: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
87a0: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
87b0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
87c0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
87d0: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
87e0: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
87f0: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
8800: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
8810: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
8820: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
8830: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
8840: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
8850: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
8860: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
8870: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
8880: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
8890: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
88a0: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
88b0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
88c0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
88d0: 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61  assert( !pPg->pa
88e0: 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72  geHash || pPager
88f0: 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d  ->errCode || MEM
8900: 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79  DB || pPg->dirty
8910: 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e   || .      pPg->
8920: 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f  pageHash==pager_
8930: 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b  pagehash(pPg) );
8940: 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  .}..#else.#defin
8950: 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  e pager_datahash
8960: 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65  (X,Y)  0.#define
8970: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
8980: 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 43 48  X)  0.#define CH
8990: 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64  ECK_PAGE(x).#end
89a0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  if../*.** When t
89b0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
89c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
89d0: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
89e0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
89f0: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
8a00: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
8a10: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 65   read from the e
8a20: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
8a30: 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69  nd .** written i
8a40: 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c  nto memory suppl
8a50: 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ied by the calle
8a60: 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65  r. .**.** zMaste
8a70: 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  r must point to 
8a80: 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c  a buffer of at l
8a90: 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74  east nMaster byt
8aa0: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  es allocated by.
8ab0: 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  ** the caller. T
8ac0: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71  his should be sq
8ad0: 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
8ae0: 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72  name+1 (to ensur
8af0: 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e  e there is.** en
8b00: 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77 72  ough space to wr
8b10: 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
8b20: 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66  ournal name). If
8b30: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8b40: 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74  nal.** name in t
8b50: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f  he journal is lo
8b60: 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65  nger than nMaste
8b70: 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69  r bytes (includi
8b80: 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  ng a.** nul-term
8b90: 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68  inator), then th
8ba0: 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73  is is handled as
8bb0: 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   if no master jo
8bc0: 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65  urnal name.** we
8bd0: 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  re present in th
8be0: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
8bf0: 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   If no master jo
8c00: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
8c10: 69 73 20 70 72 65 73 65 6e 74 20 7a 4d 61 73 74  is present zMast
8c20: 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20  er[0] is set to 
8c30: 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  0 and.** SQLITE_
8c40: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
8c50: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
8c60: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c  asterJournal(sql
8c70: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c  ite3_file *pJrnl
8c80: 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  , char *zMaster,
8c90: 20 69 6e 74 20 6e 4d 61 73 74 65 72 29 7b 0a 20   int nMaster){. 
8ca0: 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c   int rc;.  u32 l
8cb0: 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20  en;.  i64 szJ;. 
8cc0: 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e   u32 cksum;.  in
8cd0: 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t i;.  unsigned 
8ce0: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
8cf0: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
8d00: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
8d10: 61 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61 73 74  ader */..  zMast
8d20: 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  er[0] = '\0';.. 
8d30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
8d40: 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26  ileSize(pJrnl, &
8d50: 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
8d60: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a  SQLITE_OK || szJ
8d70: 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b  <16 ) return rc;
8d80: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
8d90: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
8da0: 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20  6, &len);.  if( 
8db0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
8dc0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66  return rc;..  if
8dd0: 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 29  ( len>=nMaster )
8de0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8df0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72  ITE_OK;.  }..  r
8e00: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8e10: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63  Jrnl, szJ-12, &c
8e20: 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21  ksum);.  if( rc!
8e30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
8e40: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
8e50: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
8e60: 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  rnl, aMagic, 8, 
8e70: 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28 20 72 63  szJ-8);.  if( rc
8e80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d  !=SQLITE_OK || m
8e90: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
8ea0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
8eb0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
8ec0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
8ed0: 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65  ad(pJrnl, zMaste
8ee0: 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c  r, len, szJ-16-l
8ef0: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
8f00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8f10: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
8f20: 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20   zMaster[len] = 
8f30: 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53 65 65 20  '\0';..  /* See 
8f40: 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  if the checksum 
8f50: 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74  matches the mast
8f60: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
8f70: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
8f80: 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  len; i++){.    c
8f90: 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b  ksum -= zMaster[
8fa0: 69 5d 3b 0a 20 20 20 7d 0a 20 20 69 66 28 20 63  i];.   }.  if( c
8fb0: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
8fc0: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
8fd0: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
8fe0: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
8ff0: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
9000: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
9010: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
9020: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
9030: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
9040: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
9050: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
9060: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
9070: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9080: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
9090: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
90a0: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
90b0: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a  me..    */.    z
90c0: 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27  Master[0] = '\0'
90d0: 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74 75  ;.  }.   .  retu
90e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
90f0: 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20  ./*.** Seek the 
9100: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
9110: 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 6e  criptor to the n
9120: 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
9130: 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a  ary where a.** j
9140: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d 61  ournal header ma
9150: 79 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69  y be read or wri
9160: 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72  tten. Pager.jour
9170: 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74 65  nalOff is update
9180: 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65  d with.** the ne
9190: 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a  w seek offset..*
91a0: 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73  *.** i.e for a s
91b0: 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31  ector size of 51
91c0: 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f  2:.**.** Input O
91d0: 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20  ffset           
91e0: 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65 74     Output Offset
91f0: 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
9200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30  -----------.** 0
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9230: 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35 31           0.** 51
9240: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
9250: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 31          512.** 1
9260: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
9270: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
9280: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
9290: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
92a0: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  * .*/.static voi
92b0: 64 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  d seekJournalHdr
92c0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
92d0: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20  .  i64 offset = 
92e0: 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61  0;.  i64 c = pPa
92f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
9300: 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20  .  if( c ){.    
9310: 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f  offset = ((c-1)/
9320: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9330: 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f  Pager) + 1) * JO
9340: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
9350: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ger);.  }.  asse
9360: 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e  rt( offset%JOURN
9370: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9380: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
9390: 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20  ( offset>=c );. 
93a0: 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74   assert( (offset
93b0: 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -c)<JOURNAL_HDR_
93c0: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
93d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
93e0: 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a  ff = offset;.}..
93f0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
9400: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
9410: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
9420: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
9430: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
9440: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
9450: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
9460: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
9470: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
9480: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
9490: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
94a0: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
94b0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
94c0: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
94d0: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
94e0: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
94f0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
9500: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
9510: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
9520: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
9530: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
9540: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
9550: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
9560: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
9570: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
9580: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
9590: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
95a0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
95b0: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
95c0: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
95d0: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
95e0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46  ournal..** .** F
95f0: 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52  ollowed by (JOUR
9600: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29  NAL_HDR_SZ - 24)
9610: 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64   bytes of unused
9620: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
9630: 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e  c int writeJourn
9640: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
9650: 67 65 72 29 7b 0a 20 20 63 68 61 72 20 7a 48 65  ger){.  char zHe
9660: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
9670: 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 3b 0a  rnalMagic)+16];.
9680: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
9690: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
96a0: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  Off==0 ){.    pP
96b0: 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
96c0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
96d0: 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 73 65  alOff;.  }..  se
96e0: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  ekJournalHdr(pPa
96f0: 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
9700: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
9710: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
9720: 0a 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64  ..  memcpy(zHead
9730: 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  er, aJournalMagi
9740: 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
9750: 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20 20 2f 2a  alMagic));..  /*
9760: 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65   .  ** Write the
9770: 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68   nRec Field - th
9780: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
9790: 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f   records that fo
97a0: 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a  llow this.  ** j
97b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e  ournal header. N
97c0: 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73  ormally, zero is
97d0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73   written to this
97e0: 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20 74   value at this t
97f0: 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20  ime..  ** After 
9800: 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65 20  the records are 
9810: 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75  added to the jou
9820: 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f  rnal (and the jo
9830: 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20  urnal synced, . 
9840: 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73   ** if in full-s
9850: 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a  ync mode), the z
9860: 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74  ero is overwritt
9870: 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75 65  en with the true
9880: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20   number.  ** of 
9890: 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e  records (see syn
98a0: 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a  cJournal())..  *
98b0: 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20  *.  ** A faster 
98c0: 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20 74  alternative is t
98d0: 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46 46  o write 0xFFFFFF
98e0: 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66  FF to the nRec f
98f0: 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20  ield. When.  ** 
9900: 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72  reading the jour
9910: 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74  nal this value t
9920: 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61  ells SQLite to a
9930: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20  ssume that the. 
9940: 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20   ** rest of the 
9950: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
9960: 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65  tains valid page
9970: 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61   records. This a
9980: 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69  ssumption.  ** i
9990: 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20  s dangerous, as 
99a0: 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
99b0: 75 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74  ured whilst writ
99c0: 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
99d0: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20  al.  ** file it 
99e0: 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65  may contain some
99f0: 20 67 61 72 62 61 67 65 20 64 61 74 61 2e 20 54   garbage data. T
9a00: 68 65 72 65 20 61 72 65 20 74 77 6f 20 73 63 65  here are two sce
9a10: 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72  narios.  ** wher
9a20: 65 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20  e this risk can 
9a30: 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a  be ignored:.  **
9a40: 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74  .  **   * When t
9a50: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e  he pager is in n
9a60: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72  o-sync mode. Cor
9a70: 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c  ruption can foll
9a80: 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f  ow a.  **     po
9a90: 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74  wer failure in t
9aa0: 68 69 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e  his case anyway.
9ab0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
9ac0: 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49  hen the SQLITE_I
9ad0: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
9ae0: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68   flag is set. Th
9af0: 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20  is guarantees.  
9b00: 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61 72 62  **     that garb
9b10: 61 67 65 20 64 61 74 61 20 69 73 20 6e 65 76 65  age data is neve
9b20: 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  r appended to th
9b30: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
9b40: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 70 50    */.  assert(pP
9b50: 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
9b60: 64 73 7c 7c 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ds||pPager->noSy
9b70: 6e 63 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  nc);.  if( (pPag
9b80: 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 0a 20 20 20  er->noSync) .   
9b90: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
9ba0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
9bb0: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
9bc0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
9bd0: 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20  _APPEND) .  ){. 
9be0: 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
9bf0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
9c00: 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78  urnalMagic)], 0x
9c10: 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c  ffffffff);.  }el
9c20: 73 65 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74  se{.    put32bit
9c30: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
9c40: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
9c50: 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ], 0);.  }..  /*
9c60: 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63   The random chec
9c70: 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73  k-hash initialis
9c80: 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33  er */ .  sqlite3
9c90: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  Randomness(sizeo
9ca0: 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
9cb0: 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
9cc0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74  ksumInit);.  put
9cd0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
9ce0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
9cf0: 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72  agic)+4], pPager
9d00: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
9d10: 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64  /* The initial d
9d20: 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a  atabase size */.
9d30: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
9d40: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
9d50: 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70  rnalMagic)+8], p
9d60: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
9d70: 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64    /* The assumed
9d80: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72   sector size for
9d90: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
9da0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
9db0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
9dc0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c  urnalMagic)+12],
9dd0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
9de0: 69 7a 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ize);.  IOTRACE(
9df0: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
9e00: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
9e10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
9e20: 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
9e30: 29 29 29 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ))).  rc = sqlit
9e40: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
9e50: 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
9e60: 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c  sizeof(zHeader),
9e70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9e80: 66 66 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ff);.  pPager->j
9e90: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
9ea0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
9eb0: 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a  er);..  /* The j
9ec0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61  ournal header ha
9ed0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 73  s been written s
9ee0: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65 65  uccessfully. See
9ef0: 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  k the journal.  
9f00: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
9f10: 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  or to the end of
9f20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
9f30: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
9f40: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
9f50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 49 4f 54 52  E_OK ){.    IOTR
9f60: 41 43 45 28 28 22 4a 54 41 49 4c 20 25 70 20 25  ACE(("JTAIL %p %
9f70: 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20  lld\n", pPager, 
9f80: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9f90: 66 66 2d 31 29 29 0a 20 20 20 20 72 63 20 3d 20  ff-1)).    rc = 
9fa0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
9fb0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30  Pager->jfd, "\00
9fc0: 30 22 2c 20 31 2c 20 70 50 61 67 65 72 2d 3e 6a  0", 1, pPager->j
9fd0: 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20  ournalOff-1);.  
9fe0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
9ff0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
a000: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
a010: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
a020: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
a030: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
a040: 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  .** (JOURNAL_HDR
a050: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65  _SZ bytes) is re
a060: 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
a070: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
a080: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
a090: 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ile. See comment
a0a0: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
a0b0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
a0c0: 28 29 20 66 6f 72 20 61 20 64 65 73 63 72 69 70  () for a descrip
a0d0: 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a  tion of.** the j
a0e0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
a0f0: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
a100: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
a110: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
a120: 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  *nRec is set to 
a130: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
a140: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
a150: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
a160: 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20  der and *dbSize 
a170: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69  is set to the si
a180: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ze of the.** dat
a190: 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65  abase before the
a1a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67   transaction beg
a1b0: 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c  an, in pages. Al
a1c0: 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  so, pPager->cksu
a1d0: 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20  mInit.** is set 
a1e0: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  to the value rea
a1f0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
a200: 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54  al header. SQLIT
a210: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
a220: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
a230: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
a240: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
a250: 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  le appears to be
a260: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
a270: 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65  TE_DONE is.** re
a280: 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63  turned and *nRec
a290: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65   and *dbSize are
a2a0: 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f   not set.  If JO
a2b0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
a2c0: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
a2d0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
a2e0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
a2f0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
a300: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
a310: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
a320: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
a330: 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72  ger, .  i64 jour
a340: 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a  nalSize,.  u32 *
a350: 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70  pNRec, .  u32 *p
a360: 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20  DbSize.){.  int 
a370: 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
a380: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f  har aMagic[8]; /
a390: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
a3a0: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
a3b0: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  der */.  i64 jrn
a3c0: 6c 4f 66 66 3b 0a 0a 20 20 73 65 65 6b 4a 6f 75  lOff;..  seekJou
a3d0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
a3e0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
a3f0: 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41  ournalOff+JOURNA
a400: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
a410: 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29   > journalSize )
a420: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
a430: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
a440: 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  jrnlOff = pPager
a450: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
a460: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
a470: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
a480: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
a490: 61 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66  aMagic), jrnlOff
a4a0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
a4b0: 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f  turn rc;.  jrnlO
a4c0: 66 66 20 2b 3d 20 73 69 7a 65 6f 66 28 61 4d 61  ff += sizeof(aMa
a4d0: 67 69 63 29 3b 0a 0a 20 20 69 66 28 20 6d 65 6d  gic);..  if( mem
a4e0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
a4f0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
a500: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
a510: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a520: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20  TE_DONE;.  }..  
a530: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
a540: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
a550: 6c 4f 66 66 2c 20 70 4e 52 65 63 29 3b 0a 20 20  lOff, pNRec);.  
a560: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
a570: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
a580: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
a590: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20 26  fd, jrnlOff+4, &
a5a0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
a5b0: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
a5c0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
a5d0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
a5e0: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
a5f0: 66 2b 38 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20  f+8, pDbSize);. 
a600: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
a610: 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74   rc;..  /* Updat
a620: 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
a630: 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
a640: 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
a650: 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70  d by .  ** the p
a660: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
a670: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
a680: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
a690: 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74  l was.  ** creat
a6a0: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
a6b0: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
a6c0: 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
a6d0: 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62  outine.  ** is b
a6e0: 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
a6f0: 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
a700: 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
a710: 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f  cal value.  ** o
a720: 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  f Pager.sectorSi
a730: 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61  ze is restored a
a740: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  t the end of tha
a750: 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  t routine..  */.
a760: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
a770: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
a780: 72 6e 6c 4f 66 66 2b 31 32 2c 20 28 75 33 32 20  rnlOff+12, (u32 
a790: 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  *)&pPager->secto
a7a0: 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  rSize);.  if( rc
a7b0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
a7c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a7d0: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
a7e0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
a7f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a800: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  K;.}.../*.** Wri
a810: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
a820: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
a830: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
a840: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
a850: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
a860: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
a870: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
a880: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
a890: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
a8a0: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
a8b0: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
a8c0: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
a8d0: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
a8e0: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
a8f0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
a900: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
a910: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
a920: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
a930: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
a940: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
a950: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
a960: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47  * + 4 bytes: PAG
a970: 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b  ER_MJ_PGNO..** +
a980: 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68   N bytes: length
a990: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
a9a0: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20  al name..** + 4 
a9b0: 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20  bytes: N.** + 4 
a9c0: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
a9d0: 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
a9e0: 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65  sum..** + 8 byte
a9f0: 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  s: aJournalMagic
aa00: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  []..**.** The ma
aa10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ster journal pag
aa20: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68  e checksum is th
aa30: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74  e sum of the byt
aa40: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
aa50: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  .** journal name
aa60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
aa70: 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
aa80: 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
aa90: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
aaa0: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
aab0: 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
aac0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
aad0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
aae0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
aaf0: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
ab00: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
ab10: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
ab20: 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20   len; .  int i; 
ab30: 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a  .  i64 jrnlOff;.
ab40: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
ab50: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a  .  char zBuf[siz
ab60: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
ab70: 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20  c)+2*4];..  if( 
ab80: 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67  !zMaster || pPag
ab90: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72  er->setMaster) r
aba0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
abb0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
abc0: 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e  ster = 1;..  len
abd0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65   = strlen(zMaste
abe0: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
abf0: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
ac00: 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
ac10: 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  [i];.  }..  /* I
ac20: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
ac30: 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
ac40: 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
ac50: 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
ac60: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
ac70: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
ac80: 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
ac90: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
aca0: 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
acb0: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
acc0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
acd0: 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
ace0: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
acf0: 53 79 6e 63 20 29 7b 0a 20 20 20 20 73 65 65 6b  Sync ){.    seek
ad00: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
ad10: 72 29 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66  r);.  }.  jrnlOf
ad20: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
ad30: 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72  nalOff;.  pPager
ad40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
ad50: 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20  (len+20);..  rc 
ad60: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
ad70: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
ad80: 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ff, PAGER_MJ_PGN
ad90: 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  O(pPager));.  if
ada0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
adb0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a  ) return rc;.  j
adc0: 72 6e 6c 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20 20  rnlOff += 4;..  
add0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
ade0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
adf0: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 6a   zMaster, len, j
ae00: 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20 72  rnlOff);.  if( r
ae10: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
ae20: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
ae30: 4f 66 66 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20 70  Off += len;..  p
ae40: 75 74 33 32 62 69 74 73 28 7a 42 75 66 2c 20 6c  ut32bits(zBuf, l
ae50: 65 6e 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  en);.  put32bits
ae60: 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d  (&zBuf[4], cksum
ae70: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  );.  memcpy(&zBu
ae80: 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  f[8], aJournalMa
ae90: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
aea0: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72  rnalMagic));.  r
aeb0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
aec0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
aed0: 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61  zBuf, 8+sizeof(a
aee0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20 6a  JournalMagic), j
aef0: 72 6e 6c 4f 66 66 29 3b 0a 20 20 70 50 61 67 65  rnlOff);.  pPage
af00: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  r->needSync = !p
af10: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
af20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
af30: 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f  *.** Add or remo
af40: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
af50: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
af60: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  ages that are in
af70: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
af80: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
af90: 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73   The Pager keeps
afa0: 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74   a separate list
afb0: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61   of pages that a
afc0: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a  re currently in.
afd0: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
afe0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
aff0: 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65  helps the sqlite
b000: 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74  3PagerStmtCommit
b010: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75  ().** routine ru
b020: 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f  n MUCH faster fo
b030: 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
b040: 65 20 77 68 65 72 65 20 74 68 65 72 65 20 61 72  e where there ar
b050: 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20  e many.** pages 
b060: 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e  in memory but on
b070: 6c 79 20 61 20 66 65 77 20 61 72 65 20 69 6e 20  ly a few are in 
b080: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
b090: 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
b0a0: 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74   void page_add_t
b0b0: 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64  o_stmt_list(PgHd
b0c0: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
b0d0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
b0e0: 70 50 61 67 65 72 3b 0a 20 20 50 67 48 69 73 74  pPager;.  PgHist
b0f0: 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
b100: 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
b110: 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72  pPager);.  asser
b120: 74 28 20 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  t( MEMDB );.  if
b130: 28 20 21 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74  ( !pHist->inStmt
b140: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
b150: 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74  pHist->pPrevStmt
b160: 3d 3d 30 20 26 26 20 70 48 69 73 74 2d 3e 70 4e  ==0 && pHist->pN
b170: 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  extStmt==0 );.  
b180: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53    if( pPager->pS
b190: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 50 47 48  tmt ){.      PGH
b1a0: 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 61 67 65  DR_TO_HIST(pPage
b1b0: 72 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72  r->pStmt, pPager
b1c0: 29 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  )->pPrevStmt = p
b1d0: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 48  Pg;.    }.    pH
b1e0: 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  ist->pNextStmt =
b1f0: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a   pPager->pStmt;.
b200: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
b210: 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 48 69  t = pPg;.    pHi
b220: 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a  st->inStmt = 1;.
b230: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e    }.}../*.** Fin
b240: 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
b250: 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e  hash table given
b260: 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72   its page number
b270: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
b280: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
b290: 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  ge or NULL if no
b2a0: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
b2b0: 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
b2c0: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
b2d0: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
b2e0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20  {.  PgHdr *p;.  
b2f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
b300: 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  h==0 ) return 0;
b310: 0a 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 61  .  p = pPager->a
b320: 48 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50 61  Hash[pgno & (pPa
b330: 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a  ger->nHash-1)];.
b340: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
b350: 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20  >pgno!=pgno ){. 
b360: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48     p = p->pNextH
b370: 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ash;.  }.  retur
b380: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  n p;.}../*.** Cl
b390: 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ear the in-memor
b3a0: 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  y cache.  This r
b3b0: 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74  outine.** sets t
b3c0: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
b3d0: 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68  pager back to wh
b3e0: 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69  at it was when i
b3f0: 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f  t was first.** o
b400: 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73  pened.  Any outs
b410: 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
b420: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e  e invalidated an
b430: 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74  d subsequent att
b440: 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65  empts.** to acce
b450: 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77  ss those pages w
b460: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
b470: 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
b480: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b490: 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
b4a0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
b4b0: 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
b4c0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
b4d0: 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e  errCode ) return
b4e0: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
b4f0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
b500: 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 49  Pg=pNext){.    I
b510: 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20  OTRACE(("PGFREE 
b520: 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
b530: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
b540: 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
b550: 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72  lite3_pager_pgfr
b560: 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 70  ee_count);.    p
b570: 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
b580: 74 41 6c 6c 3b 0a 20 20 20 20 6c 72 75 4c 69 73  tAll;.    lruLis
b590: 74 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 20 20  tRemove(pPg);.  
b5a0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
b5b0: 50 67 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Pg);.  }.  asser
b5c0: 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  t(pPager->lru.pF
b5d0: 69 72 73 74 3d 3d 30 29 3b 0a 20 20 61 73 73 65  irst==0);.  asse
b5e0: 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  rt(pPager->lru.p
b5f0: 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 29 3b  FirstSynced==0);
b600: 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
b610: 2d 3e 6c 72 75 2e 70 4c 61 73 74 3d 3d 30 29 3b  ->lru.pLast==0);
b620: 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  .  pPager->pStmt
b630: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
b640: 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  pAll = 0;.  pPag
b650: 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  er->pDirty = 0;.
b660: 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20    pPager->nHash 
b670: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
b680: 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73  ree(pPager->aHas
b690: 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50  h);.  pPager->nP
b6a0: 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  age = 0;.  pPage
b6b0: 72 2d 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20 20  r->aHash = 0;.  
b6c0: 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
b6d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
b6e0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
b6f0: 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
b700: 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72  he pager is curr
b710: 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72 20 73  ently in error s
b720: 74 61 74 65 2c 20 64 69 73 63 61 72 64 20 74 68  tate, discard th
b730: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a  e contents of .*
b740: 2a 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20  * the cache and 
b750: 72 65 73 65 74 20 74 68 65 20 50 61 67 65 72 20  reset the Pager 
b760: 73 74 72 75 63 74 75 72 65 20 69 6e 74 65 72 6e  structure intern
b770: 61 6c 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  al state. If the
b780: 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e  re is.** an open
b790: 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74   journal-file, t
b7a0: 68 65 6e 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hen the next tim
b7b0: 65 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  e a shared-lock 
b7c0: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f  is obtained.** o
b7d0: 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
b7e0: 20 28 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79   (by this or any
b7f0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 29 2c   other process),
b800: 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74   it will be.** t
b810: 72 65 61 74 65 64 20 61 73 20 61 20 68 6f 74 2d  reated as a hot-
b820: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c  journal and roll
b830: 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  ed back..*/.stat
b840: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
b850: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
b860: 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67  er){.  if( !pPag
b870: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
b880: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45  e ){.    if( !ME
b890: 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 69 66 28  MDB ){.      if(
b8a0: 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
b8b0: 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20  thods ){.       
b8c0: 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72   osUnlock(pPager
b8d0: 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
b8e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
b8f0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
b900: 31 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  1;.      IOTRACE
b910: 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c  (("UNLOCK %p\n",
b920: 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 20   pPager))..     
b930: 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
b940: 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
b950: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
b960: 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
b970: 6e 6f 74 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  not be.      ** 
b980: 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61  trusted. Now tha
b990: 74 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  t the pager file
b9a0: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68   is unlocked, th
b9b0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
b9c0: 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65  e.      ** cache
b9d0: 20 63 61 6e 20 62 65 20 64 69 73 63 61 72 64 65   can be discarde
b9e0: 64 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20  d and the error 
b9f0: 63 6f 64 65 20 73 61 66 65 6c 79 20 63 6c 65 61  code safely clea
ba00: 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  red..      */.  
ba10: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
ba20: 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
ba30: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
ba40: 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  de = SQLITE_OK;.
ba50: 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
ba60: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
ba70: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
ba80: 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
ba90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
baa0: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74  Close(pPager->st
bab0: 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  fd);.          s
bac0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
bad0: 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20  er->aInStmt);.  
bae0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
baf0: 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  aInStmt = 0;.   
bb00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
bb10: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
bb20: 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  alOpen ){.      
bb30: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
bb40: 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
bb50: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
bb60: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
bb70: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   0;.          sq
bb80: 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
bb90: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->aInJournal);.
bba0: 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
bbb0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->aInJournal = 0
bbc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bbd0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
bbe0: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
bbf0: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
bc00: 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Use = 0;.       
bc10: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
bc20: 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Off = 0;.       
bc30: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
bc40: 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
bc50: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d       pPager->stm
bc60: 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
bc70: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f         pPager->o
bc80: 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20  rigDbSize = 0;. 
bc90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
bca0: 20 20 69 66 28 20 21 4d 45 4d 44 42 20 7c 7c 20    if( !MEMDB || 
bcb0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
bcc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bcd0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
bce0: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
bcf0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
bd00: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
bd10: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
bd20: 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
bd30: 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20  a rollback if a 
bd40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
bd50: 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b  ctive and unlock
bd60: 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
bd70: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  e file. If the p
bd80: 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ager has already
bd90: 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72   entered the err
bda0: 6f 72 20 73 74 61 74 65 2c 20 0a 2a 2a 20 64 6f  or state, .** do
bdb0: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68 65   not attempt the
bdc0: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   rollback..*/.st
bdd0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
bde0: 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
bdf0: 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 61 73  (Pager *p){.  as
be00: 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d  sert( p->state>=
be10: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c  PAGER_RESERVED |
be20: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  | p->journalOpen
be30: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
be40: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
be50: 4f 4b 20 26 26 20 70 2d 3e 73 74 61 74 65 3e 3d  OK && p->state>=
be60: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
be70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
be80: 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20  erRollback(p);. 
be90: 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
bea0: 6b 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  k(p);.  assert( 
beb0: 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70  p->errCode || !p
bec0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
bed0: 20 28 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f   (p->exclusiveMo
bee0: 64 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f  de&&!p->journalO
bef0: 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ff) );.  assert(
bf00: 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21   p->errCode || !
bf10: 70 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70  p->stmtOpen || p
bf20: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
bf30: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
bf40: 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20   routine ends a 
bf50: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20  transaction.  A 
bf60: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
bf70: 6e 64 65 64 20 62 79 20 65 69 74 68 65 72 0a 2a  nded by either.*
bf80: 2a 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  * a COMMIT or a 
bf90: 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20  ROLLBACK..**.** 
bfa0: 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
bfb0: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
bfc0: 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 6a   pager has the j
bfd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
bfe0: 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56   and.** a RESERV
bff0: 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
c000: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
c010: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
c020: 69 6e 65 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  ine will release
c030: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
c040: 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72   lock and acquir
c050: 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  es a SHARED lock
c060: 20 69 6e 20 69 74 73 20 70 6c 61 63 65 20 69 66   in its place if
c070: 20 74 68 61 74 20 69 73 0a 2a 2a 20 74 68 65 20   that is.** the 
c080: 61 70 70 72 6f 70 72 69 61 74 65 20 74 68 69 6e  appropriate thin
c090: 67 20 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73  g to do.  Releas
c0a0: 65 20 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20  e locks usually 
c0b0: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2c 0a  is appropriate,.
c0c0: 2a 2a 20 75 6e 6c 65 73 73 20 77 65 20 61 72 65  ** unless we are
c0d0: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
c0e0: 63 65 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c  cess mode or unl
c0f0: 65 73 73 20 74 68 69 73 20 69 73 20 61 20 0a 2a  ess this is a .*
c100: 2a 20 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47  * COMMIT AND BEG
c110: 49 4e 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41  IN or ROLLBACK A
c120: 4e 44 20 42 45 47 49 4e 20 6f 70 65 72 61 74 69  ND BEGIN operati
c130: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  on..**.** The jo
c140: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 65 69  urnal file is ei
c150: 74 68 65 72 20 64 65 6c 65 74 65 64 20 6f 72 20  ther deleted or 
c160: 74 72 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  truncated..**.**
c170: 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20   TODO: Consider 
c180: 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72  keeping the jour
c190: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f  nal file open fo
c1a0: 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
c1b0: 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d  bases..** This m
c1c0: 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66  ight give a perf
c1d0: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
c1e0: 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77  ent on windows w
c1f0: 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  here opening.** 
c200: 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70  a file is an exp
c210: 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  ensive operation
c220: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c230: 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
c240: 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
c250: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
c260: 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
c270: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
c280: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
c290: 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
c2a0: 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  B );.  if( pPage
c2b0: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
c2c0: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
c2d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c2e0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61  .  }.  sqlite3Pa
c2f0: 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50  gerStmtCommit(pP
c300: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
c310: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26  ger->stmtOpen &&
c320: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
c330: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73  iveMode ){.    s
c340: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
c350: 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20  ager->stfd);.   
c360: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
c370: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  n = 0;.  }.  if(
c380: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c390: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  Open ){.    if( 
c3a0: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
c3b0: 65 4d 6f 64 65 20 0a 20 20 20 20 20 20 20 20 20  eMode .         
c3c0: 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
c3d0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
c3e0: 65 72 2d 3e 6a 66 64 2c 20 30 29 29 3d 3d 53 51  er->jfd, 0))==SQ
c3f0: 4c 49 54 45 5f 4f 4b 20 29 7b 3b 0a 20 20 20 20  LITE_OK ){;.    
c400: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
c410: 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
c420: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
c430: 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
c440: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
c450: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
c460: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
c470: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c480: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  pen = 0;.      i
c490: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c4a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
c4b0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
c4c0: 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
c4d0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
c4e0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
c4f0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
c500: 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ree( pPager->aIn
c510: 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70  Journal );.    p
c520: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
c530: 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70  l = 0;.    for(p
c540: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
c550: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
c560: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
c570: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
c580: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64   0;.      pPg->d
c590: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
c5a0: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
c5b0: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 61 6c  0;.      pPg->al
c5c0: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30  waysRollback = 0
c5d0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
c5e0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
c5f0: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
c600: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
c610: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
c620: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
c630: 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
c640: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
c650: 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  he = 0;.    pPag
c660: 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
c670: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
c680: 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
c690: 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
c6a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c6b0: 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c  dirtyCache==0 ||
c6c0: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
c6d0: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  nal==0 );.  }.. 
c6e0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
c6f0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
c700: 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63     rc2 = osUnloc
c710: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
c720: 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
c730: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
c740: 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
c750: 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
c760: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
c770: 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61  YNCED ){.    pPa
c780: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
c790: 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
c7a0: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  }.  pPager->orig
c7b0: 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50  DbSize = 0;.  pP
c7c0: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
c7d0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
c7e0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 6c  eedSync = 0;.  l
c7f0: 72 75 4c 69 73 74 53 65 74 46 69 72 73 74 53 79  ruListSetFirstSy
c800: 6e 63 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  nced(pPager);.  
c810: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
c820: 20 2d 31 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28   -1;..  return (
c830: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63  rc==SQLITE_OK?rc
c840: 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2:rc);.}../*.** 
c850: 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
c860: 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f  rn a checksum fo
c870: 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61  r the page of da
c880: 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ta..**.** This i
c890: 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
c8a0: 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65  cksum.  It is re
c8b0: 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
c8c0: 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
c8d0: 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
c8e0: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e  e and the page n
c8f0: 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72  umber.  We exper
c900: 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20  imented with.** 
c910: 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68  a checksum of th
c920: 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62  e entire data, b
c930: 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e  ut that was foun
c940: 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77  d to be too slow
c950: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
c960: 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
c970: 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  r is stored at t
c980: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
c990: 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20  data and.** the 
c9a0: 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72  checksum is stor
c9b0: 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ed at the end.  
c9c0: 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e  This is importan
c9d0: 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a  t.  If journal.*
c9e0: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63  * corruption occ
c9f0: 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77  urs due to a pow
ca00: 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
ca10: 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e  most likely scen
ca20: 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20  ario.** is that 
ca30: 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f  one end or the o
ca40: 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f  ther of the reco
ca50: 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  rd will be chang
ca60: 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75  ed.  It is.** mu
ca70: 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74  ch less likely t
ca80: 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73  hat the two ends
ca90: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
caa0: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a  record will be.*
cab0: 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68  * correct and th
cac0: 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72  e middle be corr
cad0: 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73  upt.  Thus, this
cae0: 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65   "checksum" sche
caf0: 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61  me,.** though fa
cb00: 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63  st and simple, c
cb10: 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c  atches the mostl
cb20: 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66  y likely kind of
cb30: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a   corruption..**.
cb40: 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73  ** FIX ME:  Cons
cb50: 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72  ider adding ever
cb60: 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20  y 200th (or so) 
cb70: 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61  byte of the data
cb80: 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b   to the.** check
cb90: 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69  sum.  That way i
cba0: 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
cbb0: 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20  spans 3 or more 
cbc0: 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64  disk sectors and
cbd0: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64  .** only the mid
cbe0: 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f  dle sector is co
cbf0: 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73  rrupt, we will s
cc00: 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73  till have a reas
cc10: 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65  onable.** chance
cc20: 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20   of failing the 
cc30: 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75  checksum and thu
cc40: 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20  s detecting the 
cc50: 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74  problem..*/.stat
cc60: 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
cc70: 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
cc80: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
cc90: 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
cca0: 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
ccb0: 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  nit;.  int i = p
ccc0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
ccd0: 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e  200;.  while( i>
cce0: 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  0 ){.    cksum +
ccf0: 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20  = aData[i];.    
cd00: 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20  i -= 200;.  }.  
cd10: 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a  return cksum;.}.
cd20: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
cd30: 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
cd40: 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e  c void makeClean
cd50: 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (PgHdr*);../*.**
cd60: 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
cd70: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  age from the jou
cd80: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64  rnal file opened
cd90: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
cda0: 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61  tor.** jfd.  Pla
cdb0: 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70  yback this one p
cdc0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73  age..**.** If us
cdd0: 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61  eCksum==0 it mea
cde0: 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  ns this journal 
cdf0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65  does not use che
ce00: 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75  cksums.  Checksu
ce10: 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73  ms.** are not us
ce20: 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20  ed in statement 
ce30: 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65  journals because
ce40: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
ce50: 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65  als do not.** ne
ce60: 65 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f  ed to survive po
ce70: 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f  wer failures..*/
ce80: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
ce90: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
cea0: 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
ceb0: 61 67 65 72 2c 20 0a 20 20 73 71 6c 69 74 65 33  ager, .  sqlite3
cec0: 5f 66 69 6c 65 20 2a 6a 66 64 2c 0a 20 20 69 36  _file *jfd,.  i6
ced0: 34 20 6f 66 66 73 65 74 2c 0a 20 20 69 6e 74 20  4 offset,.  int 
cee0: 75 73 65 43 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e  useCksum.){.  in
cef0: 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
cf00: 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
cf10: 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
cf20: 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
cf30: 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
cf40: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
cf50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
cf60: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
cf70: 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
cf80: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
cf90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cfa0: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
cfb0: 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
cfc0: 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75   checking */.  u
cfd0: 38 20 2a 61 44 61 74 61 20 3d 20 28 75 38 20 2a  8 *aData = (u8 *
cfe0: 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  )pPager->pTmpSpa
cff0: 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70 20 73 74  ce;   /* Temp st
d000: 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61 67 65  orage for a page
d010: 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73   */..  /* useCks
d020: 75 6d 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  um should be tru
d030: 65 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a  e for the main j
d040: 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65  ournal and false
d050: 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d   for.  ** statem
d060: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56  ent journals.  V
d070: 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
d080: 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 63 61  is always the ca
d090: 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  se.  */.  assert
d0a0: 28 20 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73  ( jfd == (useCks
d0b0: 75 6d 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64  um ? pPager->jfd
d0c0: 20 3a 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29   : pPager->stfd)
d0d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44   );.  assert( aD
d0e0: 61 74 61 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72  ata );..  rc = r
d0f0: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f  ead32bits(jfd, o
d100: 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20  ffset, &pgno);. 
d110: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d120: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
d130: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d140: 52 65 61 64 28 6a 66 64 2c 20 61 44 61 74 61 2c  Read(jfd, aData,
d150: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
d160: 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20  e, offset+4);.  
d170: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d180: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
d190: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d1a0: 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  Off += pPager->p
d1b0: 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20  ageSize + 4;..  
d1c0: 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
d1d0: 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ng on the page. 
d1e0: 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d   This is more im
d1f0: 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f  portant that I o
d200: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74  riginally.  ** t
d210: 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f  hought.  If a po
d220: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
d230: 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  rs while the jou
d240: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72  rnal is being wr
d250: 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63  itten,.  ** it c
d260: 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c  ould cause inval
d270: 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72  id data to be wr
d280: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
d290: 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64  ournal.  We need
d2a0: 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20   to.  ** detect 
d2b0: 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74  this invalid dat
d2c0: 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f  a (with high pro
d2d0: 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67  bability) and ig
d2e0: 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  nore it..  */.  
d2f0: 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70  if( pgno==0 || p
d300: 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
d310: 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
d320: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d330: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  DONE;.  }.  if( 
d340: 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70  pgno>(unsigned)p
d350: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
d360: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d370: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
d380: 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20   useCksum ){.   
d390: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
d3a0: 28 6a 66 64 2c 20 6f 66 66 73 65 74 2b 70 50 61  (jfd, offset+pPa
d3b0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c  ger->pageSize+4,
d3c0: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
d3d0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
d3e0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
d3f0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20  urnalOff += 4;. 
d400: 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73     if( pager_cks
d410: 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  um(pPager, aData
d420: 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  )!=cksum ){.    
d430: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d440: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
d450: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d460: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
d470: 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67  RESERVED || pPag
d480: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
d490: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20  _EXCLUSIVE );.. 
d4a0: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
d4b0: 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20   is in RESERVED 
d4c0: 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72  state, then ther
d4d0: 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79  e must be a copy
d4e0: 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61   of this.  ** pa
d4f0: 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  ge in the pager 
d500: 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63  cache. In this c
d510: 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20  ase just update 
d520: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c  the pager cache,
d530: 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61  .  ** not the da
d540: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
d550: 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61   page is left ma
d560: 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68  rked dirty in th
d570: 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  is case..  **.  
d580: 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20  ** An exception 
d590: 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c  to the above rul
d5a0: 65 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  e: If the databa
d5b0: 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  se is in no-sync
d5c0: 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61   mode.  ** and a
d5d0: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64   page is moved d
d5e0: 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65  uring an increme
d5f0: 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e  ntal vacuum then
d600: 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20   the page may.  
d610: 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ** not be in the
d620: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61   pager cache. La
d630: 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63  ter: if a malloc
d640: 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f  () or IO error o
d650: 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e  ccurs.  ** durin
d660: 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63  g a Movepage() c
d670: 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61  all, then the pa
d680: 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ge may not be in
d690: 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20   the cache.  ** 
d6a0: 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63  either. So the c
d6b0: 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62  ondition describ
d6c0: 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  ed in the above 
d6d0: 70 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74  paragraph is not
d6e0: 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62  .  ** assert()ab
d6f0: 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  le..  **.  ** If
d700: 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74   in EXCLUSIVE st
d710: 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64  ate, then we upd
d720: 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
d730: 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73  che if it exists
d740: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61  .  ** and the ma
d750: 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  in file. The pag
d760: 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64  e is then marked
d770: 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a   not dirty..  **
d780: 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31  .  ** Ticket #11
d790: 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65  71:  The stateme
d7a0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  nt journal might
d7b0: 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f   contain page co
d7c0: 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20  ntent that is.  
d7d0: 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
d7e0: 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  m the page conte
d7f0: 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
d800: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
d810: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63  on..  ** This oc
d820: 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65  curs when a page
d830: 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f   is changed prio
d840: 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
d850: 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  f a statement.  
d860: 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20  ** then changed 
d870: 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65  again within the
d880: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65   statement.  Whe
d890: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73  n rolling back s
d8a0: 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65  uch a.  ** state
d8b0: 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74  ment we must not
d8c0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72   write to the or
d8d0: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
d8e0: 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20  unless we know. 
d8f0: 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20   ** for certain 
d900: 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61  that original pa
d910: 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
d920: 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20  synced into the 
d930: 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
d940: 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68  ** journal.  Oth
d950: 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20  erwise, a power 
d960: 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65  loss might leave
d970: 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69   modified data i
d980: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
d990: 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74  ase file without
d9a0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
d9b0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
d9c0: 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20  l that can.  ** 
d9d0: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
d9e0: 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
d9f0: 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20  inal form.  Two 
da00: 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
da10: 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f  be.  ** met befo
da20: 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  re writing to th
da30: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  e database files
da40: 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
da50: 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  se must be.  ** 
da60: 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20  locked.  (2) we 
da70: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72  know that the or
da80: 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
da90: 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e  ent is fully syn
daa0: 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ced.  ** in the 
dab0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74  main journal eit
dac0: 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20  her because the 
dad0: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
dae0: 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a  ache or else.  *
daf0: 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  * the page is ma
db00: 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63  rked as needSync
db10: 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  ==0..  */.  pPg 
db20: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
db30: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
db40: 50 41 47 45 52 54 52 41 43 45 34 28 22 50 4c 41  PAGERTRACE4("PLA
db50: 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64  YBACK %d page %d
db60: 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
db70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
db80: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
db90: 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61  pgno, pager_data
dba0: 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67  hash(pPager->pag
dbb0: 65 53 69 7a 65 2c 20 61 44 61 74 61 29 29 3b 0a  eSize, aData));.
dbc0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
dbd0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
dbe0: 53 49 56 45 20 26 26 20 28 70 50 67 3d 3d 30 20  SIVE && (pPg==0 
dbf0: 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  || pPg->needSync
dc00: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 36 34 20  ==0) ){.    i64 
dc10: 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  offset = (pgno-1
dc20: 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
dc30: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
dc40: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
dc50: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61  (pPager->fd, aDa
dc60: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
dc70: 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20  Size, offset);. 
dc80: 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20     if( pPg ){.  
dc90: 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
dca0: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
dcb0: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
dcc0: 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
dcd0: 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
dce0: 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
dcf0: 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
dd00: 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
dd10: 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
dd20: 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
dd30: 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
dd40: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
dd50: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
dd60: 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
dd70: 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
dd80: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
dd90: 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
dda0: 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
ddb0: 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
ddc0: 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
ddd0: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
dde0: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
ddf0: 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
de00: 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
de10: 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50     /* assert( pP
de20: 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50  g->nRef==0 || pP
de30: 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f  g->pgno==1 ); */
de40: 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48  .    pData = PGH
de50: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
de60: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
de70: 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  a, aData, pPager
de80: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
de90: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
dea0: 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
deb0: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
dec0: 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70  r(pPg, pPager->p
ded0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
dee0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
def0: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
df00: 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
df10: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
df20: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a  );.#endif.    /*
df30: 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67   If this was pag
df40: 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72  e 1, then restor
df50: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  e the value of P
df60: 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e  ager.dbFileVers.
df70: 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20  .    ** Do this 
df80: 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64  before any decod
df90: 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ing. */.    if( 
dfa0: 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
dfb0: 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
dfc0: 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28  >dbFileVers, &((
dfd0: 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73  u8*)pData)[24],s
dfe0: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
dff0: 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
e000: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65  }..    /* Decode
e010: 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72   the page just r
e020: 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f  ead from disk */
e030: 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67  .    CODEC1(pPag
e040: 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
e050: 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20  pgno, 3);.  }.  
e060: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e070: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
e080: 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
e090: 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
e0a0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
e0b0: 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
e0c0: 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
e0d0: 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
e0e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
e0f0: 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
e100: 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
e110: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
e120: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
e130: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
e140: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e150: 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
e160: 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
e170: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61  .** Argument zMa
e180: 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74  ster may point t
e190: 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  o Pager.pTmpSpac
e1a0: 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65  e. So that buffe
e1b0: 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61  r is not .** ava
e1c0: 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77  ilable for use w
e1d0: 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
e1e0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  ion..**.**.** Th
e1f0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
e200: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
e210: 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20  he names of all 
e220: 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a  child journals..
e230: 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61 20  ** To tell if a 
e240: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63  master journal c
e250: 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20 63  an be deleted, c
e260: 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66 20  heck to each of 
e270: 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e  the.** children.
e280: 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72 65    If all childre
e290: 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69 73  n are either mis
e2a0: 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72  sing or do not r
e2b0: 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66  efer to.** a dif
e2c0: 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f  ferent master jo
e2d0: 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69 73  urnal, then this
e2e0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e2f0: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 0a  can be deleted..
e300: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
e310: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
e320: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
e330: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
e340: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
e350: 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
e360: 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
e370: 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70  .  int master_op
e380: 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  en = 0;.  sqlite
e390: 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b  3_file *pMaster;
e3a0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
e3b0: 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20 20 63 68 61  *pJournal;.  cha
e3c0: 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r *zMasterJourna
e3d0: 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e  l = 0; /* Conten
e3e0: 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ts of master jou
e3f0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
e400: 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  64 nMasterJourna
e410: 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  l;       /* Size
e420: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
e430: 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a  al file */..  /*
e440: 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
e450: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
e460: 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73  clusively in cas
e470: 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
e480: 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e  cess.  ** is run
e490: 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ning this routin
e4a0: 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74  e also. Not that
e4b0: 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75   it makes too mu
e4c0: 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20  ch difference.. 
e4d0: 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   */.  pMaster = 
e4e0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
e4f0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70  sqlite3_malloc(p
e500: 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
e510: 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d  2);.  pJournal =
e520: 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
e530: 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72  )(((u8 *)pMaster
e540: 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
e550: 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73  le);.  if( !pMas
e560: 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ter ){.    rc = 
e570: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
e580: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 66  }else{.    int f
e590: 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
e5a0: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
e5b0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
e5c0: 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
e5d0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
e5e0: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
e5f0: 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
e600: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
e610: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
e620: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
e630: 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  ;.  master_open 
e640: 3d 20 31 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  = 1;..  rc = sql
e650: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
e660: 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  Master, &nMaster
e670: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
e680: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
e690: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
e6a0: 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
e6b0: 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
e6c0: 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
e6d0: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
e6e0: 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20 20  sterPtr = 0;.   
e6f0: 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 20   int nMasterPtr 
e700: 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  = pPager->pVfs->
e710: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20  mxPathname+1;.. 
e720: 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65     /* Load the e
e730: 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
e740: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
e750: 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
e760: 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
e770: 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
e780: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
e790: 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20  sterJournal. .  
e7a0: 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72    */.    zMaster
e7b0: 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20  Journal = (char 
e7c0: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
e7d0: 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  (nMasterJournal 
e7e0: 2b 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  + nMasterPtr);. 
e7f0: 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a     if( !zMasterJ
e800: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
e810: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
e820: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  M;.      goto de
e830: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
e840: 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74   }.    zMasterPt
e850: 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
e860: 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
e870: 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  al];.    rc = sq
e880: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
e890: 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
e8a0: 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72  nal, nMasterJour
e8b0: 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  nal, 0);.    if(
e8c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e8d0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
e8e0: 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e  out;..    zJourn
e8f0: 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72  al = zMasterJour
e900: 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  nal;.    while( 
e910: 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65  (zJournal-zMaste
e920: 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65  rJournal)<nMaste
e930: 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
e940: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 41    if( sqlite3OsA
e950: 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75  ccess(pVfs, zJou
e960: 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
e970: 45 53 53 5f 45 58 49 53 54 53 29 20 29 7b 0a 20  ESS_EXISTS) ){. 
e980: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
e990: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
e9a0: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
e9b0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
e9c0: 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  xists..        *
e9d0: 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
e9e0: 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
e9f0: 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
ea00: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
ea10: 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
ea20: 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
ea30: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
ea40: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
ea50: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
ea60: 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  t c;.        int
ea70: 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
ea80: 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
ea90: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
eaa0: 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20  JOURNAL);.      
eab0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
eac0: 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72  Open(pVfs, zJour
ead0: 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66  nal, pJournal, f
eae0: 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
eaf0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
eb00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
eb10: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
eb20: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
eb30: 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61          rc = rea
eb40: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
eb50: 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
eb60: 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
eb70: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
eb80: 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61  3OsClose(pJourna
eb90: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
eba0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ebb0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
ebc0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
ebd0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
ebe0: 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72    c = zMasterPtr
ebf0: 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70  [0]!=0 && strcmp
ec00: 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61  (zMasterPtr, zMa
ec10: 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ster)==0;.      
ec20: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20    if( c ){.     
ec30: 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
ec40: 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20  a match. Do not 
ec50: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
ec60: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
ec70: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  */.          got
ec80: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
ec90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
eca0: 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61   }.      zJourna
ecb0: 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f  l += (strlen(zJo
ecc0: 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d  urnal)+1);.    }
ecd0: 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73  .  }.  .  rc = s
ece0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
ecf0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
ed00: 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  ;..delmaster_out
ed10: 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a  :.  if( zMasterJ
ed20: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71  ournal ){.    sq
ed30: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74  lite3_free(zMast
ed40: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20  erJournal);.  } 
ed50: 20 0a 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f   .  if( master_o
ed60: 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
ed70: 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
ed80: 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
ed90: 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b  3_free(pMaster);
eda0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
edb0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  ..static void pa
edc0: 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
edd0: 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  he(Pager *pPager
ede0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  );../*.** Trunca
edf0: 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  te the main file
ee00: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70 61   of the given pa
ee10: 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ger to the numbe
ee20: 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e  r of pages.** in
ee30: 64 69 63 61 74 65 64 2e 20 41 6c 73 6f 20 74 72  dicated. Also tr
ee40: 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65  uncate the cache
ee50: 64 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  d representation
ee60: 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f   of the file..*/
ee70: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
ee80: 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
ee90: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50   *pPager, int nP
eea0: 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
eeb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
eec0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
eed0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
eee0: 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e   && pPager->fd->
eef0: 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
ef00: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
ef10: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66  uncate(pPager->f
ef20: 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  d, pPager->pageS
ef30: 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 29 3b  ize*(i64)nPage);
ef40: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
ef50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ef60: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
ef70: 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65   nPage;.    page
ef80: 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
ef90: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
efa0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
efb0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63 74  .** Set the sect
efc0: 6f 72 53 69 7a 65 20 66 6f 72 20 74 68 65 20 67  orSize for the g
efd0: 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a  iven pager..**.*
efe0: 2a 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a  * The sector siz
eff0: 65 20 69 73 20 74 68 65 20 6c 61 72 67 65 72 20  e is the larger 
f000: 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  of the sector si
f010: 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20 62  ze reported.** b
f020: 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
f030: 72 53 69 7a 65 28 29 20 61 6e 64 20 74 68 65 20  rSize() and the 
f040: 70 61 67 65 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61  pageSize..*/.sta
f050: 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74  tic void setSect
f060: 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  orSize(Pager *pP
f070: 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
f080: 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
f090: 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65  hods||pPager->te
f0a0: 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  mpFile);.  if( !
f0b0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
f0c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
f0d0: 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
f0e0: 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
f0f0: 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
f100: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
f110: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
f120: 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
f130: 6e 20 77 68 63 69 68 20 63 61 73 65 20 74 68 65  n whcih case the
f140: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
f150: 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
f160: 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
f170: 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
f180: 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
f190: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
f1a0: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
f1b0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
f1c0: 63 74 6f 72 53 69 7a 65 3c 70 50 61 67 65 72 2d  ctorSize<pPager-
f1d0: 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
f1e0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
f1f0: 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
f200: 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f  geSize;.  }.}../
f210: 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
f220: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
f230: 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
f240: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
f250: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
f260: 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
f270: 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
f280: 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
f290: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
f2a0: 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
f2b0: 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
f2c0: 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
f2d0: 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
f2e0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
f2f0: 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
f300: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
f310: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
f320: 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
f330: 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
f340: 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
f350: 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
f360: 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
f370: 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
f380: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
f390: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
f3a0: 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
f3b0: 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
f3c0: 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
f3d0: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
f3e0: 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
f3f0: 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
f400: 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
f410: 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
f420: 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
f430: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
f440: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
f450: 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
f460: 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
f470: 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
f480: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
f490: 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
f4a0: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
f4b0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
f4c0: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
f4d0: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61  rnal.**       na
f4e0: 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d  me.  The value m
f4f0: 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69  ay be zero (indi
f500: 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20  cate that there 
f510: 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  is no master.** 
f520: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a        journal.).
f530: 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65 73  **  (6)  N bytes
f540: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
f550: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68  ournal name.  Th
f560: 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e  e name will be n
f570: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  ul-terminated.**
f580: 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74         and might
f590: 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e   be shorter than
f5a0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
f5b0: 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68  from (5).  If th
f5c0: 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20  e first byte.** 
f5d0: 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d        of the nam
f5e0: 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74  e is \000 then t
f5f0: 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
f600: 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  r journal.  The 
f610: 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
f620: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20  journal name is 
f630: 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e  stored in UTF-8.
f640: 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f  .**  (7)  Zero o
f650: 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
f660: 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
f670: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
f680: 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
f690: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
f6a0: 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
f6b0: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
f6c0: 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
f6d0: 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
f6e0: 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
f6f0: 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
f700: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
f710: 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
f720: 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   6 items above..
f730: 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
f740: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
f750: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
f760: 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 7th item..**.
f770: 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
f780: 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
f790: 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
f7a0: 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
f7b0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
f7c0: 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
f7d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
f7e0: 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
f7f0: 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
f800: 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
f810: 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
f820: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f830: 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
f840: 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
f850: 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
f860: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
f870: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
f880: 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
f890: 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
f8a0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
f8b0: 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
f8c0: 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
f8d0: 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
f8e0: 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
f8f0: 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
f900: 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
f910: 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
f920: 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
f930: 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
f940: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
f950: 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
f960: 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
f970: 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
f980: 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
f990: 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
f9a0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
f9b0: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
f9c0: 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
f9d0: 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
f9e0: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
f9f0: 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
fa00: 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
fa10: 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
fa20: 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
fa30: 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
fa40: 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
fa50: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
fa60: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
fa70: 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
fa80: 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
fa90: 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
faa0: 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
fab0: 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
fac0: 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
fad0: 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
fae0: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
faf0: 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
fb00: 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
fb10: 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
fb20: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
fb30: 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
fb40: 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
fb50: 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
fb60: 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
fb70: 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
fb80: 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
fb90: 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
fba0: 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
fbb0: 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
fbc0: 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
fbd0: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
fbe0: 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
fbf0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
fc00: 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
fc10: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
fc20: 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
fc30: 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
fc40: 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
fc50: 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
fc60: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
fc70: 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
fc80: 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
fc90: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
fca0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fcb0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
fcc0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
fcd0: 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69  t isHot){.  sqli
fce0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
fcf0: 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
fd00: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
fd10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
fd20: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
fd30: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
fd40: 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
fd50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
fd60: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
fd70: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
fd80: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fda0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
fdb0: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
fdc0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
fdd0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
fde0: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
fdf0: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
fe00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe10: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
fe20: 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
fe30: 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
fe40: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
fe50: 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Name of master j
fe60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61  ournal file if a
fe70: 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ny */..  /* Figu
fe80: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
fe90: 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
fea0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
feb0: 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
fec0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
fed0: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
fee0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
fef0: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72  urnalOpen );.  r
ff00: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
ff10: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
ff20: 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
ff30: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
ff40: 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67   szJ==0 ){.    g
ff50: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
ff60: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  ;.  }..  /* Read
ff70: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ff80: 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  nal name from th
ff90: 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  e journal, if it
ffa0: 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a   is present..  *
ffb0: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
ffc0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
ffd0: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75  is specified, bu
ffe0: 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  t the file is no
fff0: 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f  t.  ** present o
10000 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65  n disk, then the
10010 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20   journal is not 
10020 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  hot and does not
10030 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a   need to be.  **
10040 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
10050 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  */.  zMaster = p
10060 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
10070 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  ;.  rc = readMas
10080 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
10090 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
100a0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
100b0 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
100c0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
100d0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28  TE_DONE );.  if(
100e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a   rc!=SQLITE_OK .
100f0 20 20 20 7c 7c 20 28 7a 4d 61 73 74 65 72 5b 30     || (zMaster[0
10100 5d 20 26 26 20 21 73 71 6c 69 74 65 33 4f 73 41  ] && !sqlite3OsA
10110 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
10120 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
10130 53 53 5f 45 58 49 53 54 53 29 29 20 0a 20 20 29  SS_EXISTS)) .  )
10140 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
10150 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  0;.    if( rc==S
10160 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20  QLITE_DONE ) rc 
10170 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
10180 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
10190 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
101a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
101b0 3b 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ;.  zMaster = 0;
101c0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
101d0 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
101e0 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61 64  er when the read
101f0 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c  JournalHdr() cal
10200 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53  l returns.  ** S
10210 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
10220 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
10230 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20  . */.  while( 1 
10240 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  ){..    /* Read 
10250 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
10260 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
10270 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
10280 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
10290 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
102a0 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
102b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
102c0 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
102d0 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
102e0 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
102f0 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
10300 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68  ust of failed wh
10310 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
10320 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
10330 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
10340 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
10350 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
10360 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
10370 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
10380 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  r, szJ, &nRec, &
10390 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
103a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
103b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
103c0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
103d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
103e0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
103f0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
10400 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
10410 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
10420 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
10430 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
10440 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
10450 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
10460 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
10470 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
10480 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
10490 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
104a0 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
104b0 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
104c0 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
104d0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
104e0 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
104f0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
10500 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
10510 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
10520 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
10530 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
10540 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
10550 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
10560 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
10570 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
10580 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a   nRec = (szJ - J
10590 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
105a0 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
105b0 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
105c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
105d0 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
105e0 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
105f0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
10600 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
10610 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e     ** process an
10620 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
10630 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e   final header in
10640 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68   the journal, th
10650 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20  en it means.    
10660 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72  ** that this par
10670 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
10680 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65   was being fille
10690 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65  d but has not ye
106a0 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79  t been.    ** sy
106b0 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43  nced to disk.  C
106c0 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65  ompute the numbe
106d0 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64  r of pages based
106e0 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   on the remainin
106f0 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  g.    ** size of
10700 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
10710 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69  *.    ** The thi
10720 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74  rd term of the t
10730 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f  est was added to
10740 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36   fix ticket #256
10750 35 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  5..    */.    if
10760 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
10770 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70  Hot &&.        p
10780 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
10790 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
107a0 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
107b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
107c0 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a        nRec = (sz
107d0 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
107e0 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41  nalOff) / JOURNA
107f0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
10800 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
10810 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
10820 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20  rst header read 
10830 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
10840 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
10850 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
10860 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73  ile back to it's
10870 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
10880 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
10890 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
108a0 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
108b0 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
108c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
108d0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
108e0 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
108f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10900 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
10910 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
10920 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
10930 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
10940 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
10950 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
10960 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
10970 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
10980 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10990 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRec; i++){.    
109a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
109b0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
109c0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
109d0 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
109e0 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20  nalOff, 1);.    
109f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10a00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
10a10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
10a20 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
10a30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10a40 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
10a50 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
10a60 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
10a70 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
10a80 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  se{.          go
10a90 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
10aa0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10ab0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
10ac0 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
10ad0 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e  assert( 0 );..en
10ae0 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  d_playback:.  if
10af0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10b00 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  ){.    zMaster =
10b10 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
10b20 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  ce;.    rc = rea
10b30 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
10b40 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
10b50 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
10b60 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
10b70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
10b80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10b90 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
10ba0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
10bb0 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
10bc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
10bd0 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20  zMaster[0] ){.  
10be0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
10bf0 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
10c00 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  al and this rout
10c10 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
10c20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20  success,.    ** 
10c30 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  see if it is pos
10c40 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
10c50 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10c60 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  al..    */.    r
10c70 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
10c80 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ter(pPager, zMas
10c90 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter);.  }..  /* 
10ca0 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  The Pager.sector
10cb0 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
10cc0 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61  y have been upda
10cd0 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  ted while rollin
10ce0 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f  g.  ** back a jo
10cf0 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79  urnal created by
10d00 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20   a process with 
10d10 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74  a different sect
10d20 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c  or size.  ** val
10d30 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20  ue. Reset it to 
10d40 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
10d50 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
10d60 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65  ss..  */.  setSe
10d70 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
10d80 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10d90 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
10da0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
10db0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
10dc0 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  is is similar to
10dd0 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
10de0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
10df0 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a  urnal but with.*
10e00 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74 77  * a few extra tw
10e10 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ists..**.**    (
10e20 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1)  The number o
10e30 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
10e40 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
10e50 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
10e60 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61 74          the stat
10e70 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20  ement is stored 
10e80 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  in pPager->stmtS
10e90 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a  ize, not in the.
10ea0 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e  **         journ
10eb0 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a  al file itself..
10ec0 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e  **.**    (2)  In
10ed0 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61   addition to pla
10ee0 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74  ying back the st
10ef0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c  atement journal,
10f00 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20   also.**        
10f10 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61   playback all pa
10f20 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ges of the trans
10f30 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62  action journal b
10f40 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  eginning.**     
10f50 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50      at offset pP
10f60 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e  ager->stmtJSize.
10f70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
10f80 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
10f90 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
10fa0 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
10fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10fc0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c   Size of the ful
10fd0 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  l journal */.  i
10fe0 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74  64 hdrOff;.  int
10ff0 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
11000 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11010 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  of Records */.  
11020 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
11030 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
11040 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
11050 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70  t rc;..  szJ = p
11060 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11070 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  f;.#ifndef NDEBU
11080 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f  G .  {.    i64 o
11090 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20  s_szJ;.    rc = 
110a0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
110b0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
110c0 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28  os_szJ);.    if(
110d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
110e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
110f0 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f  assert( szJ==os_
11100 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  szJ );.  }.#endi
11110 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f  f..  /* Set hdrO
11120 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66  ff to be the off
11130 73 65 74 20 6a 75 73 74 20 61 66 74 65 72 20 74  set just after t
11140 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 61  he end of the la
11150 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  st journal.  ** 
11160 70 61 67 65 20 77 72 69 74 74 65 6e 20 62 65 66  page written bef
11170 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f  ore the first jo
11180 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f 72  urnal-header for
11190 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 0a   this statement.
111a0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
111b0 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 6f 72   was written, or
111c0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
111d0 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e  file if no journ
111e0 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77  al.  ** header w
111f0 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f  as written..  */
11200 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67  .  hdrOff = pPag
11210 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a  er->stmtHdrOff;.
11220 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11230 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68  ->fullSync || !h
11240 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21  drOff );.  if( !
11250 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64  hdrOff ){.    hd
11260 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a  rOff = szJ;.  }.
11270 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65    .  /* Truncate
11280 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61   the database ba
11290 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
112a0 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  al size..  */.  
112b0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
112c0 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  ate(pPager, pPag
112d0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20  er->stmtSize);. 
112e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
112f0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
11300 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  ARED );..  /* Fi
11310 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
11320 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
11330 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
11340 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61  ournal..  */.  a
11350 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
11360 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61 67  tmtInUse && pPag
11370 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
11380 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67  );.  nRec = pPag
11390 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20  er->stmtNRec;.  
113a0 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69  .  /* Copy origi
113b0 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
113c0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
113d0 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
113e0 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
113f0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
11400 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  te that the stat
11410 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d  ement journal om
11420 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72  its checksums fr
11430 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63  om.  ** each rec
11440 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d  ord since power-
11450 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79  failure recovery
11460 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e   is not importan
11470 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20  t to statement. 
11480 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20   ** journals..  
11490 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
114a0 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRec; i++){.    
114b0 69 36 34 20 6f 66 66 73 65 74 20 3d 20 69 2a 28  i64 offset = i*(
114c0 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
114d0 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  ze);.    rc = pa
114e0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
114f0 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
11500 61 67 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73  ager->stfd, offs
11510 65 74 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  et, 0);.    asse
11520 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
11530 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ONE );.    if( r
11540 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
11550 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
11560 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
11570 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70   Now roll some p
11580 61 67 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74  ages back from t
11590 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
115a0 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74  ournal. Pager.st
115b0 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73  mtJSize.  ** was
115c0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
115d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
115e0 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  en this statemen
115f0 74 20 77 61 73 20 73 74 61 72 74 65 64 2c 20 73  t was started, s
11600 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e  o.  ** everythin
11610 67 20 61 66 74 65 72 20 74 68 61 74 20 6e 65 65  g after that nee
11620 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
11630 62 61 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74  back, either int
11640 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
11650 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20  ase, the memory 
11660 63 61 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a  cache, or both..
11670 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20    **.  ** If it 
11680 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
11690 6e 20 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f  n Pager.stmtHdrO
116a0 66 66 20 69 73 20 74 68 65 20 6f 66 66 73 65 74  ff is the offset
116b0 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
116c0 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
116d0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
116e0 72 69 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68  ritten during th
116f0 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  is statement tra
11700 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
11710 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11720 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
11730 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  mtJSize;.  pPage
11740 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70  r->cksumInit = p
11750 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
11760 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65  ;.  while( pPage
11770 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20  r->journalOff < 
11780 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 72 63  hdrOff ){.    rc
11790 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
117a0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
117b0 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  r, pPager->jfd, 
117c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
117d0 66 66 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  ff, 1);.    asse
117e0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
117f0 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ONE );.    if( r
11800 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
11810 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
11820 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68  yback;.  }..  wh
11830 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ile( pPager->jou
11840 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b  rnalOff < szJ ){
11850 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 3b 20  .    u32 nJRec; 
11860 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11870 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63  r of Journal Rec
11880 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20  ords */.    u32 
11890 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20  dummy;.    rc = 
118a0 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
118b0 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52  Pager, szJ, &nJR
118c0 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ec, &dummy);.   
118d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
118e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
118f0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
11900 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74  ONE );.      got
11910 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
11920 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ack;.    }.    i
11930 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20  f( nJRec==0 ){. 
11940 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a       nJRec = (sz
11950 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
11960 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65  nalOff) / (pPage
11970 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a  r->pageSize+8);.
11980 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
11990 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26  nJRec-1; i>=0 &&
119a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
119b0 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b  Off < szJ; i--){
119c0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
119d0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
119e0 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
119f0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
11a00 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b  >journalOff, 1);
11a10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
11a20 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
11a30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
11a40 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
11a50 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
11a60 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ck;.    }.  }.. 
11a70 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11a80 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e  Off = szJ;.  .en
11a90 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a  d_stmt_playback:
11aa0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
11ab0 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67  E_OK) {.    pPag
11ac0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
11ad0 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67   szJ;.    /* pag
11ae0 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
11af0 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a  pPager); */.  }.
11b00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11b10 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
11b20 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
11b30 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
11b40 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
11b50 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
11b60 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
11b70 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
11b80 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
11b90 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31  {.  if( mxPage>1
11ba0 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
11bb0 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65  >mxPage = mxPage
11bc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
11bd0 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
11be0 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  10;.  }.}../*.**
11bf0 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
11c00 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
11c10 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
11c20 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
11c30 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
11c40 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
11c50 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
11c60 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
11c70 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
11c80 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
11c90 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
11ca0 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
11cb0 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
11cc0 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
11cd0 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
11ce0 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
11cf0 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
11d00 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
11d10 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
11d20 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
11d30 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
11d40 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
11d50 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
11d60 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
11d70 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
11d80 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
11d90 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
11da0 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
11db0 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
11dc0 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
11dd0 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
11de0 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
11df0 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
11e00 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
11e10 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
11e20 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
11e30 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
11e40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11e50 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
11e60 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
11e70 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
11e80 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
11e90 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
11ea0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
11eb0 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
11ec0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
11ed0 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
11ee0 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
11ef0 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
11f00 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
11f10 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
11f20 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
11f30 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
11f40 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
11f50 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
11f60 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
11f70 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
11f80 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
11f90 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
11fa0 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
11fb0 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
11fc0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11fd0 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
11fe0 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
11ff0 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
12000 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
12010 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
12020 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
12030 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
12040 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
12050 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
12060 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
12070 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
12080 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
12090 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
120a0 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
120b0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
120c0 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
120d0 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
120e0 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
120f0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
12100 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
12110 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
12120 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
12130 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
12140 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
12150 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20  t full_fsync){. 
12160 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
12170 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  =  level==1 || p
12180 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
12190 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
121a0 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26  ync = level==3 &
121b0 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
121c0 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ile;.  pPager->s
121d0 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 66 75 6c  ync_flags = (ful
121e0 6c 5f 66 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53  l_fsync?SQLITE_S
121f0 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f  YNC_FULL:SQLITE_
12200 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
12210 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
12220 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65  nc ) pPager->nee
12230 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e  dSync = 0;.}.#en
12240 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
12250 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
12260 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
12270 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
12280 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
12290 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
122a0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
122b0 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
122c0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
122d0 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
122e0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
122f0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
12300 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
12310 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
12320 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
12330 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
12340 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a  orary file. .**.
12350 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  ** Write the fil
12360 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
12370 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53  o *fd.  Return S
12380 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
12390 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f  ess or some.** o
123a0 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
123b0 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
123c0 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
123d0 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65  cally delete the
123e0 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69   temporary.** fi
123f0 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  le when it is cl
12400 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osed..*/.static 
12410 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
12420 4f 70 65 6e 74 65 6d 70 28 0a 20 20 73 71 6c 69  Opentemp(.  sqli
12430 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
12440 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
12450 20 66 69 6c 65 20 73 79 73 74 65 6d 20 6c 61 79   file system lay
12460 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  er */.  sqlite3_
12470 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
12480 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
12490 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
124a0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
124b0 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61  name,      /* Na
124c0 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20  me of the file. 
124d0 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
124e0 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
124f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
12500 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
12510 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a  h to the VFS */.
12520 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
12530 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
12540 21 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  !=0 );..#ifdef S
12550 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
12560 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
12570 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
12580 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
12590 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
125a0 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
125b0 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
125c0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
125d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
125e0 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
125f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
12600 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
12610 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
12620 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
12630 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
12640 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69 6c 65 2c  Filename, pFile,
12650 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
12660 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
12670 49 54 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d  ITE_OK || pFile-
12680 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 72  >pMethods );.  r
12690 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
126a0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
126b0 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70  page cache and p
126c0 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
126d0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  the page cache i
126e0 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54  n *ppPager..** T
126f0 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
12700 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78  ched need not ex
12710 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69  ist.  The file i
12720 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74  s not locked unt
12730 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  il.** the first 
12740 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
12750 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 69 73  agerGet() and is
12760 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20   only held open 
12770 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73  until the.** las
12780 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
12790 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
127a0 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a  PagerUnref()..**
127b0 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
127c0 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
127d0 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
127e0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
127f0 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
12800 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
12810 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20   to be cached.  
12820 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  The file will be
12830 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
12840 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69  matically when i
12850 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
12860 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
12870 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
12880 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  en all informati
12890 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
128a0 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65  che..** It is ne
128b0 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64  ver written to d
128c0 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62  isk.  This can b
128d0 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
128e0 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d  ent an.** in-mem
128f0 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  ory database..*/
12900 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
12910 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
12920 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
12930 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
12940 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
12950 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
12960 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
12970 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
12980 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
12990 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
129a0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
129b0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
129c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
129d0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
129e0 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
129f0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
12a00 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
12a10 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
12a20 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ge */.  int flag
12a30 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
12a40 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f   /* flags contro
12a50 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20  lling this file 
12a60 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
12a70 73 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s             /*
12a80 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   flags passed th
12a90 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
12aa0 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
12ab0 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20  ){.  u8 *pPtr;. 
12ac0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
12ad0 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
12ae0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
12af0 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c  i;.  int tempFil
12b00 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d  e = 0;.  int mem
12b10 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  Db = 0;.  int re
12b20 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e  adOnly = 0;.  in
12b30 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  t useJournal = (
12b40 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d  flags & PAGER_OM
12b50 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a  IT_JOURNAL)==0;.
12b60 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b    int noReadlock
12b70 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
12b80 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d  R_NO_READLOCK)!=
12b90 30 3b 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c  0;.  int journal
12ba0 46 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74  FileSize = sqlit
12bb0 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
12bc0 66 73 29 3b 0a 20 20 69 6e 74 20 6e 44 65 66 61  fs);.  int nDefa
12bd0 75 6c 74 50 61 67 65 20 3d 20 53 51 4c 49 54 45  ultPage = SQLITE
12be0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
12bf0 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 74  ZE;.  char *zPat
12c00 68 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 50 61  hname;.  int nPa
12c10 74 68 6e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 54 68  thname;..  /* Th
12c20 65 20 64 65 66 61 75 6c 74 20 72 65 74 75 72 6e  e default return
12c30 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
12c40 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  er */.  *ppPager
12c50 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70   = 0;..  /* Comp
12c60 75 74 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ute the full pat
12c70 68 6e 61 6d 65 20 2a 2f 0a 20 20 6e 50 61 74 68  hname */.  nPath
12c80 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
12c90 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 50 61  athname+1;.  zPa
12ca0 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
12cb0 5f 6d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d  _malloc(nPathnam
12cc0 65 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 6e  e);.  if( zPathn
12cd0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
12ce0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
12cf0 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69  M;.  }.  if( zFi
12d00 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
12d10 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65  ame[0] ){.#ifnde
12d20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
12d30 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73  MORYDB.    if( s
12d40 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
12d50 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29  ":memory:")==0 )
12d60 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20  {.      memDb = 
12d70 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61  1;.      zPathna
12d80 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  me[0] = 0;.    }
12d90 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
12da0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
12db0 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
12dc0 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
12dd0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a  me, nPathname, z
12de0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Pathname);.    }
12df0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
12e00 20 3d 20 73 71 6c 69 74 65 33 4f 73 47 65 74 54   = sqlite3OsGetT
12e10 65 6d 70 6e 61 6d 65 28 70 56 66 73 2c 20 6e 50  empname(pVfs, nP
12e20 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  athname, zPathna
12e30 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  me);.  }.  if( r
12e40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12e50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12e60 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
12e70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
12e80 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 74    nPathname = st
12e90 72 6c 65 6e 28 7a 50 61 74 68 6e 61 6d 65 29 3b  rlen(zPathname);
12ea0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
12eb0 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 70  memory for the p
12ec0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a  ager structure *
12ed0 2f 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c  /.  pPager = sql
12ee0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a  ite3MallocZero(.
12ef0 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 61 67      sizeof(*pPag
12f00 65 72 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  er) +           
12f10 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  /* Pager structu
12f20 72 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61  re */.    journa
12f30 6c 46 69 6c 65 53 69 7a 65 20 2b 20 20 20 20 20  lFileSize +     
12f40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75        /* The jou
12f50 72 6e 61 6c 20 66 69 6c 65 20 73 74 72 75 63 74  rnal file struct
12f60 75 72 65 20 2a 2f 20 0a 20 20 20 20 70 56 66 73  ure */ .    pVfs
12f70 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 20 2b  ->szOsFile * 2 +
12f80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
12f90 62 20 61 6e 64 20 73 74 6d 74 20 6a 6f 75 72 6e  b and stmt journ
12fa0 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20  al files */ .   
12fb0 20 34 2a 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34   4*nPathname + 4
12fc0 30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0            /* 
12fd0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69 72 65  zFilename, zDire
12fe0 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  ctory, zJournal,
12ff0 20 7a 53 74 6d 74 4a 72 6e 6c 20 2a 2f 0a 20 20   zStmtJrnl */.  
13000 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
13010 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
13020 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
13030 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13040 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
13050 70 50 74 72 20 3d 20 28 75 38 20 2a 29 26 70 50  pPtr = (u8 *)&pP
13060 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65  ager[1];.  pPage
13070 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66  r->vfsFlags = vf
13080 73 46 6c 61 67 73 3b 0a 20 20 70 50 61 67 65 72  sFlags;.  pPager
13090 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  ->fd = (sqlite3_
130a0 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73  file*)&pPtr[pVfs
130b0 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20  ->szOsFile*0];. 
130c0 20 70 50 61 67 65 72 2d 3e 73 74 66 64 20 3d 20   pPager->stfd = 
130d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
130e0 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46  pPtr[pVfs->szOsF
130f0 69 6c 65 2a 31 5d 3b 0a 20 20 70 50 61 67 65 72  ile*1];.  pPager
13100 2d 3e 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33  ->jfd = (sqlite3
13110 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66  _file*)&pPtr[pVf
13120 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 5d 3b 0a  s->szOsFile*2];.
13130 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
13140 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50  ame = (char*)&pP
13150 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  tr[pVfs->szOsFil
13160 65 2a 32 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  e*2+journalFileS
13170 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize];.  pPager->
13180 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50  zDirectory = &pP
13190 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
131a0 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20  nPathname+1];.  
131b0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
131c0 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72   = &pPager->zDir
131d0 65 63 74 6f 72 79 5b 6e 50 61 74 68 6e 61 6d 65  ectory[nPathname
131e0 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  +1];.  pPager->z
131f0 53 74 6d 74 4a 72 6e 6c 20 3d 20 26 70 50 61 67  StmtJrnl = &pPag
13200 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
13210 74 68 6e 61 6d 65 2b 31 30 5d 3b 0a 20 20 70 50  thname+10];.  pP
13220 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66  ager->pVfs = pVf
13230 73 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67  s;.  memcpy(pPag
13240 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
13250 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
13260 61 6d 65 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  ame+1);.  sqlite
13270 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
13280 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  );..  /* Open th
13290 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20  e pager file..  
132a0 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
132b0 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
132c0 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a  0] && !memDb ){.
132d0 20 20 20 20 69 66 28 20 6e 50 61 74 68 6e 61 6d      if( nPathnam
132e0 65 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  e>(pVfs->mxPathn
132f0 61 6d 65 20 2d 20 73 69 7a 65 6f 66 28 22 2d 6a  ame - sizeof("-j
13300 6f 75 72 6e 61 6c 22 29 29 20 29 7b 0a 20 20 20  ournal")) ){.   
13310 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
13320 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c  ANTOPEN;.    }el
13330 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 6f  se{.      int fo
13340 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  ut = 0;.      rc
13350 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
13360 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
13370 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
13380 2d 3e 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20  ->fd,.          
13390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
133a0 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 2c  Pager->vfsFlags,
133b0 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 72   &fout);.      r
133c0 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26  eadOnly = (fout&
133d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
133e0 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ONLY);..      /*
133f0 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
13400 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
13410 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72  ened for read/wr
13420 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20  ite access,.    
13430 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65    ** choose a de
13440 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
13450 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20  in case we have 
13460 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20  to create the.  
13470 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
13480 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c  file. The defaul
13490 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74  t page size is t
134a0 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20  he maximum of:. 
134b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
134c0 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46      + SQLITE_DEF
134d0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a  AULT_PAGE_SIZE,.
134e0 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68        **    + Th
134f0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
13500 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
13510 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 20 20  torSize().      
13520 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67  **    + The larg
13530 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68  est page size th
13540 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  at can be writte
13550 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  n atomically..  
13560 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
13570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13580 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  & !readOnly ){. 
13590 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 63 74         int iSect
135a0 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
135b0 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  OsSectorSize(pPa
135c0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
135d0 20 20 69 66 28 20 6e 44 65 66 61 75 6c 74 50 61    if( nDefaultPa
135e0 67 65 3c 69 53 65 63 74 6f 72 53 69 7a 65 20 29  ge<iSectorSize )
135f0 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 44 65 66  {.          nDef
13600 61 75 6c 74 50 61 67 65 20 3d 20 69 53 65 63 74  aultPage = iSect
13610 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  orSize;.        
13620 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
13630 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
13640 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  ITE.        {.  
13650 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20          int iDc 
13660 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
13670 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
13680 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
13690 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
136a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
136b0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
136c0 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
136d0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ));.          as
136e0 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
136f0 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
13700 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  536>>8));.      
13710 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
13720 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
13730 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b  GE_SIZE<=65536);
13740 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
13750 69 3d 6e 44 65 66 61 75 6c 74 50 61 67 65 3b 20  i=nDefaultPage; 
13760 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ii<=SQLITE_MAX_D
13770 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
13780 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20  ; ii=ii*2){.    
13790 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26          if( iDc&
137a0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
137b0 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 20  OMIC|(ii>>8)) ) 
137c0 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20 69  nDefaultPage = i
137d0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  i;.          }. 
137e0 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
137f0 20 20 20 20 20 20 20 20 69 66 28 20 6e 44 65 66          if( nDef
13800 61 75 6c 74 50 61 67 65 3e 53 51 4c 49 54 45 5f  aultPage>SQLITE_
13810 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
13820 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
13830 20 20 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20     nDefaultPage 
13840 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  = SQLITE_MAX_DEF
13850 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
13860 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13870 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
13880 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20  if( !memDb ){.  
13890 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72    /* If a tempor
138a0 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75  ary file is requ
138b0 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74  ested, it is not
138c0 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74   opened immediat
138d0 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ely..    ** In t
138e0 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65  his case we acce
138f0 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  pt the default p
13900 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c  age size and del
13910 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  ay actually.    
13920 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66  ** opening the f
13930 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ile until the fi
13940 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72  rst call to OsWr
13950 69 74 65 28 29 2e 0a 20 20 20 20 2a 2f 20 0a 20  ite()..    */ . 
13960 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
13970 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
13980 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
13990 53 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  SIVE;.  }..  if(
139a0 20 70 50 61 67 65 72 20 26 26 20 72 63 3d 3d 53   pPager && rc==S
139b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
139c0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
139d0 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  e = (char *)sqli
139e0 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 44 65 66 61  te3_malloc(nDefa
139f0 75 6c 74 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20  ultPage);.  }.. 
13a00 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
13a10 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68 65  occured in eithe
13a20 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20  r of the blocks 
13a30 61 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72 65 65  above..  ** Free
13a40 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
13a50 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  ture and close t
13a60 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53 69  he file..  ** Si
13a70 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73  nce the pager is
13a80 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74   not allocated t
13a90 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
13aa0 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79  to set .  ** any
13ab0 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76   Pager.errMask v
13ac0 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  ariables..  */. 
13ad0 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20   if( !pPager || 
13ae0 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  !pPager->pTmpSpa
13af0 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ce ){.    sqlite
13b00 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
13b10 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  >fd);.    sqlite
13b20 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
13b30 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d      return ((rc=
13b40 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49  =SQLITE_OK)?SQLI
13b50 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20  TE_NOMEM:rc);.  
13b60 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 33  }..  PAGERTRACE3
13b70 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
13b80 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50   FILEHANDLEID(pP
13b90 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65  ager->fd), pPage
13ba0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
13bb0 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20   IOTRACE(("OPEN 
13bc0 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72  %p %s\n", pPager
13bd0 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
13be0 61 6d 65 29 29 0a 0a 20 20 2f 2a 20 46 69 6c 6c  ame))..  /* Fill
13bf0 20 69 6e 20 50 61 67 65 72 2e 7a 44 69 72 65 63   in Pager.zDirec
13c00 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63  tory[] */.  memc
13c10 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  py(pPager->zDire
13c20 63 74 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e 7a  ctory, pPager->z
13c30 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
13c40 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28 69 3d  ame+1);.  for(i=
13c50 73 74 72 6c 65 6e 28 70 50 61 67 65 72 2d 3e 7a  strlen(pPager->z
13c60 44 69 72 65 63 74 6f 72 79 29 3b 20 69 3e 30 20  Directory); i>0 
13c70 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  && pPager->zDire
13c80 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b  ctory[i-1]!='/';
13c90 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e   i--){}.  if( i>
13ca0 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  0 ) pPager->zDir
13cb0 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b  ectory[i-1] = 0;
13cc0 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50  ..  /* Fill in P
13cd0 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d 20  ager.zJournal[] 
13ce0 61 6e 64 20 50 61 67 65 72 2e 7a 53 74 6d 74 4a  and Pager.zStmtJ
13cf0 72 6e 6c 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70  rnl[] */.  memcp
13d00 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
13d10 61 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  al, pPager->zFil
13d20 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  ename, nPathname
13d30 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61  );.  memcpy(&pPa
13d40 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
13d50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72  athname], "-jour
13d60 6e 61 6c 22 2c 20 39 29 3b 0a 20 20 6d 65 6d 63  nal", 9);.  memc
13d70 70 79 28 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74  py(pPager->zStmt
13d80 4a 72 6e 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46  Jrnl, pPager->zF
13d90 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
13da0 6d 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70  me);.  memcpy(&p
13db0 50 61 67 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c  Pager->zStmtJrnl
13dc0 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 73  [nPathname], "-s
13dd0 74 6d 74 6a 72 6e 6c 22 2c 20 31 30 29 3b 0a 0a  tmtjrnl", 10);..
13de0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75    /* pPager->jou
13df0 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  rnalOpen = 0; */
13e00 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  .  pPager->useJo
13e10 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e  urnal = useJourn
13e20 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20  al && !memDb;.  
13e30 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
13e40 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20  ck = noReadlock 
13e50 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f  && readOnly;.  /
13e60 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  * pPager->stmtOp
13e70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  en = 0; */.  /* 
13e80 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
13e90 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
13ea0 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
13eb0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
13ec0 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a  Size = memDb-1;.
13ed0 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
13ee0 7a 65 20 3d 20 6e 44 65 66 61 75 6c 74 50 61 67  ze = nDefaultPag
13ef0 65 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  e;.  /* pPager->
13f00 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  stmtSize = 0; */
13f10 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
13f20 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  mtJSize = 0; */.
13f30 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61    /* pPager->nPa
13f40 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ge = 0; */.  pPa
13f50 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
13f60 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  0;.  pPager->mxP
13f70 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  gno = SQLITE_MAX
13f80 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f  _PAGE_COUNT;.  /
13f90 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
13fa0 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
13fb0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
13fc0 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74  ger->state == (t
13fd0 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f  empFile ? PAGER_
13fe0 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45  EXCLUSIVE : PAGE
13ff0 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f  R_UNLOCK) );.  /
14000 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
14010 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  k = 0; */.  pPag
14020 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74  er->tempFile = t
14030 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72  empFile;.  asser
14040 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  t( tempFile==PAG
14050 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
14060 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20  ORMAL .         
14070 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41   || tempFile==PA
14080 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
14090 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
140a0 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
140b0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
140c0 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65  VE==1 );.  pPage
140d0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
140e0 20 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20   = tempFile; .  
140f0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20  pPager->memDb = 
14100 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
14110 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64  >readOnly = read
14120 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Only;.  /* pPage
14130 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
14140 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   */.  pPager->no
14150 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
14160 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a  empFile || !useJ
14170 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72  ournal;.  pPager
14180 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50  ->fullSync = (pP
14190 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31  ager->noSync?0:1
141a0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  );.  pPager->syn
141b0 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  c_flags = SQLITE
141c0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
141d0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
141e0 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  t = 0; */.  /* p
141f0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
14200 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ced = 0; */.  /*
14210 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
14220 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
14230 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f  >nExtra = FORCE_
14240 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61  ALIGNMENT(nExtra
14250 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  );.  assert(pPag
14260 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
14270 7c 7c 6d 65 6d 44 62 7c 7c 74 65 6d 70 46 69 6c  ||memDb||tempFil
14280 65 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62  e);.  if( !memDb
14290 20 29 7b 0a 20 20 20 20 73 65 74 53 65 63 74 6f   ){.    setSecto
142a0 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
142b0 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
142c0 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  pBusyHandler = 0
142d0 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  ; */.  /* memset
142e0 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
142f0 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
14300 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20  ->aHash)); */.  
14310 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
14320 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  r;.#ifdef SQLITE
14330 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
14340 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67  ANAGEMENT.  pPag
14350 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30  er->iInUseMM = 0
14360 3b 0a 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55  ;.  pPager->iInU
14370 73 65 44 42 20 3d 20 30 3b 0a 20 20 69 66 28 20  seDB = 0;.  if( 
14380 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 71  !memDb ){.    sq
14390 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
143a0 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
143b0 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
143c0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d  MUTEX_STATIC_MEM
143d0 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  2);.    sqlite3_
143e0 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
143f0 78 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  x);.    pPager->
14400 70 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 50  pNext = sqlite3P
14410 61 67 65 72 4c 69 73 74 3b 0a 20 20 20 20 69 66  agerList;.    if
14420 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69  ( sqlite3PagerLi
14430 73 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  st ){.      asse
14440 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
14450 4c 69 73 74 2d 3e 70 50 72 65 76 3d 3d 30 20 29  List->pPrev==0 )
14460 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
14470 61 67 65 72 4c 69 73 74 2d 3e 70 50 72 65 76 20  agerList->pPrev 
14480 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 7d 0a  = pPager;.    }.
14490 20 20 20 20 70 50 61 67 65 72 2d 3e 70 50 72 65      pPager->pPre
144a0 76 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  v = 0;.    sqlit
144b0 65 33 50 61 67 65 72 4c 69 73 74 20 3d 20 70 50  e3PagerList = pP
144c0 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  ager;.    sqlite
144d0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
144e0 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  tex);.  }.#endif
144f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14500 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
14510 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  t the busy handl
14520 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  er function..*/.
14530 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
14540 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
14550 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42  Pager *pPager, B
14560 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73  usyHandler *pBus
14570 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61  yHandler){.  pPa
14580 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
14590 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72  r = pBusyHandler
145a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
145b0 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
145c0 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49  r this pager.  I
145d0 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
145e0 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 63 61  destructor is ca
145f0 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  lled.** when the
14600 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
14610 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72 65   on each page re
14620 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65  aches zero.  The
14630 20 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a   destructor can.
14640 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c  ** be used to cl
14650 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69  ean up informati
14660 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61 20  on in the extra 
14670 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64  segment appended
14680 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a   to each page..*
14690 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63  *.** The destruc
146a0 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  tor is not calle
146b0 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 73 71  d as a result sq
146c0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
146d0 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74  ).  .** Destruct
146e0 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c  ors are only cal
146f0 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 61  led by sqlite3Pa
14700 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76  gerUnref()..*/.v
14710 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
14720 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 50 61  SetDestructor(Pa
14730 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
14740 64 20 28 2a 78 44 65 73 63 29 28 44 62 50 61 67  d (*xDesc)(DbPag
14750 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  e*,int)){.  pPag
14760 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
14770 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  = xDesc;.}../*.*
14780 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74  * Set the reinit
14790 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73  ializer for this
147a0 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
147b0 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74  NULL, the reinit
147c0 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61  ializer.** is ca
147d0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f  lled when the co
147e0 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20  ntent of a page 
147f0 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74  in cache is rest
14800 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
14810 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73  inal.** value as
14820 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72   a result of a r
14830 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61  ollback.  The ca
14840 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67  llback gives hig
14850 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a  her-level code.*
14860 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  * an opportunity
14870 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
14880 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f  EXTRA section to
14890 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
148a0 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65  restored.** page
148b0 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73   data..*/.void s
148c0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65  qlite3PagerSetRe
148d0 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50  initer(Pager *pP
148e0 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65  ager, void (*xRe
148f0 69 6e 69 74 29 28 44 62 50 61 67 65 2a 2c 69 6e  init)(DbPage*,in
14900 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  t)){.  pPager->x
14910 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
14920 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  it;.}../*.** Set
14930 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 74   the page size t
14940 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 20 49 66  o *pPageSize. If
14950 20 74 68 65 20 73 75 67 67 65 73 74 20 6e 65 77   the suggest new
14960 20 70 61 67 65 20 73 69 7a 65 20 69 73 0a 2a 2a   page size is.**
14970 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20   inappropriate, 
14980 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74  then an alternat
14990 69 76 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  ive page size is
149a0 20 73 65 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20   set to that.** 
149b0 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74  value before ret
149c0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
149d0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
149e0 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  gesize(Pager *pP
149f0 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67 65  ager, u16 *pPage
14a00 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Size){.  int rc 
14a10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
14a20 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70  16 pageSize = *p
14a30 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
14a40 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20  rt( pageSize==0 
14a50 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31  || (pageSize>=51
14a60 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
14a70 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
14a80 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 70 61  IZE) );.  if( pa
14a90 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69  geSize && pageSi
14aa0 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65  ze!=pPager->page
14ab0 53 69 7a 65 20 0a 20 20 20 26 26 20 21 70 50 61  Size .   && !pPa
14ac0 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50  ger->memDb && pP
14ad0 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 0a 20  ager->nRef==0 . 
14ae0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e   ){.    char *pN
14af0 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ew = (char *)sql
14b00 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 61 67 65  ite3_malloc(page
14b10 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Size);.    if( !
14b20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63  pNew ){.      rc
14b30 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
14b40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14b50 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
14b60 67 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65  ger);.      page
14b70 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
14b80 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
14b90 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
14ba0 7a 65 3b 0a 20 20 20 20 20 20 73 65 74 53 65 63  ze;.      setSec
14bb0 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
14bc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
14bd0 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
14be0 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50  Space);.      pP
14bf0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
14c00 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 61  = pNew;.      pa
14c10 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
14c20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
14c30 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65  PageSize = pPage
14c40 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 72  r->pageSize;.  r
14c50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14c60 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
14c70 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61  t the maximum da
14c80 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
14c90 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  t if mxPage is p
14ca0 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b  ositive. .** Mak
14cb0 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20  e no changes if 
14cc0 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f  mxPage is zero o
14cd0 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64  r negative.  And
14ce0 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68   never reduce th
14cf0 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67  e.** maximum pag
14d00 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68  e count below th
14d10 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
14d20 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
14d30 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  **.** Regardless
14d40 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
14d50 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  rn the current m
14d60 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
14d70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
14d80 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
14d90 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
14da0 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
14db0 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b   if( mxPage>0 ){
14dc0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
14dd0 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  gno = mxPage;.  
14de0 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
14df0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
14e00 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  );.  return pPag
14e10 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f  er->mxPgno;.}../
14e20 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
14e30 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  ng set of routin
14e40 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  es are used to d
14e50 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c  isable the simul
14e60 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f  ated.** I/O erro
14e70 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68  r mechanism.  Th
14e80 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
14e90 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73   used to avoid s
14ea0 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f  imulated.** erro
14eb0 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65  rs in places whe
14ec0 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  re we do not car
14ed0 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a  e about errors..
14ee0 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53  **.** Unless -DS
14ef0 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20  QLITE_TEST=1 is 
14f00 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74  used, these rout
14f10 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d  ines are all no-
14f20 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  ops.** and gener
14f30 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a  ate no code..*/.
14f40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
14f50 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  ST.extern int sq
14f60 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
14f70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69  ending;.extern i
14f80 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
14f90 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20  ror_hit;.static 
14fa0 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76  int saved_cnt;.v
14fb0 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  oid disable_simu
14fc0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
14fd0 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63  void){.  saved_c
14fe0 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  nt = sqlite3_io_
14ff0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
15000 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
15010 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
15020 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69  }.void enable_si
15030 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
15040 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  s(void){.  sqlit
15050 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
15060 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b  ing = saved_cnt;
15070 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
15080 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  e disable_simula
15090 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
150a0 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f  # define enable_
150b0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
150c0 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ors().#endif../*
150d0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
150e0 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
150f0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
15100 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
15110 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
15120 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a  est points to. .
15130 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63  **.** No error c
15140 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e  hecking is done.
15150 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f   The rational fo
15160 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74  r this is that t
15170 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
15180 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65   may be called e
15190 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20  ven if the file 
151a0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f  does not exist o
151b0 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64  r contain a head
151c0 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65  er. In .** these
151d0 20 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73   cases sqlite3Os
151e0 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75  Read() will retu
151f0 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20  rn an error, to 
15200 77 68 69 63 68 20 74 68 65 20 63 6f 72 72 65 63  which the correc
15210 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69  t .** response i
15220 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65  s to zero the me
15230 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20 61 6e  mory at pDest an
15240 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72  d continue.  A r
15250 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a  eal IO error .**
15260 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79   will presumably
15270 20 72 65 63 75 72 20 61 6e 64 20 62 65 20 70 69   recur and be pi
15280 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28 54  cked up later (T
15290 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74  odo: Think about
152a0 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73   this)..*/.int s
152b0 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
152c0 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
152d0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
152e0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
152f0 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
15300 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
15310 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
15320 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 4d 45 4d  N);.  assert(MEM
15330 44 42 7c 7c 70 50 61 67 65 72 2d 3e 66 64 2d 3e  DB||pPager->fd->
15340 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72  pMethods||pPager
15350 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69  ->tempFile);.  i
15360 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  f( pPager->fd->p
15370 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 49  Methods ){.    I
15380 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25  OTRACE(("DBHDR %
15390 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  p 0 %d\n", pPage
153a0 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20  r, N)).    rc = 
153b0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
153c0 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c  ager->fd, pDest,
153d0 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   N, 0);.    if( 
153e0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
153f0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
15400 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15410 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
15420 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15430 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
15440 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
15450 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73  pages in the dis
15460 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  k file associate
15470 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72  d with.** pPager
15480 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
15490 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65  PENDING_BYTE lie
154a0 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69  s on the page di
154b0 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68 65  rectly after the
154c0 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66   end of the.** f
154d0 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64  ile, then consid
154e0 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61 72  er this page par
154f0 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  t of the file to
15500 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  o. For example, 
15510 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59  if.** PENDING_BY
15520 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36 20  TE is byte 4096 
15530 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
15540 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20 74  of page 5) and t
15550 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
15560 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20 62  * file is 4096 b
15570 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75 72  ytes, 5 is retur
15580 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34  ned instead of 4
15590 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
155a0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  PagerPagecount(P
155b0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
155c0 20 69 36 34 20 6e 20 3d 20 30 3b 0a 20 20 69 6e   i64 n = 0;.  in
155d0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
155e0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69  pPager!=0 );.  i
155f0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
15600 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
15610 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
15620 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
15630 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65  ){.    n = pPage
15640 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65  r->dbSize;.  } e
15650 6c 73 65 20 7b 0a 20 20 20 20 61 73 73 65 72 74  lse {.    assert
15660 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
15670 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74  thods||pPager->t
15680 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  empFile);.    if
15690 28 20 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  ( (pPager->fd->p
156a0 4d 65 74 68 6f 64 73 29 0a 20 20 20 20 20 26 26  Methods).     &&
156b0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
156c0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
156d0 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54  >fd, &n))!=SQLIT
156e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
156f0 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
15700 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
15710 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
15720 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d     pPager->nRef-
15730 2d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  -;.      return 
15740 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
15750 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72   n>0 && n<pPager
15760 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
15770 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d      n = 1;.    }
15780 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d  else{.      n /=
15790 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
157a0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
157b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
157c0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
157d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
157e0 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a  Size = n;.    }.
157f0 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45    }.  if( n==(PE
15800 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65  NDING_BYTE/pPage
15810 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a  r->pageSize) ){.
15820 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69      n++;.  }.  i
15830 66 28 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50  f( n>pPager->mxP
15840 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
15850 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20  r->mxPgno = n;. 
15860 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
15870 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
15880 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
15890 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67  /*.** Clear a Pg
158a0 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f  History block.*/
158b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65  .static void cle
158c0 61 72 48 69 73 74 6f 72 79 28 50 67 48 69 73 74  arHistory(PgHist
158d0 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73  ory *pHist){.  s
158e0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69 73  qlite3_free(pHis
158f0 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c  t->pOrig);.  sql
15900 69 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d  ite3_free(pHist-
15910 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74  >pStmt);.  pHist
15920 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70  ->pOrig = 0;.  p
15930 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
15940 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
15950 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 78 29   clearHistory(x)
15960 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
15970 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
15980 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
15990 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
159a0 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  er*);../*.** Unl
159b0 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27  ink pPg from it'
159c0 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c  s hash chain. Al
159d0 73 6f 20 73 65 74 20 74 68 65 20 70 61 67 65 20  so set the page 
159e0 6e 75 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69  number to 0 to i
159f0 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20  ndicate.** that 
15a00 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
15a10 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68  part of any hash
15a20 20 63 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20   chain. This is 
15a30 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65  required because
15a40 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50   the.** sqlite3P
15a50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 20 72  agerMovepage() r
15a60 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65 61 76 65  outine can leave
15a70 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a   a page in the .
15a80 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f 70 50 72  ** pNextFree/pPr
15a90 65 76 46 72 65 65 20 6c 69 73 74 20 74 68 61 74  evFree list that
15aa0 20 69 73 20 6e 6f 74 20 61 20 70 61 72 74 20 6f   is not a part o
15ab0 66 20 61 6e 79 20 68 61 73 68 2d 63 68 61 69 6e  f any hash-chain
15ac0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15ad0 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
15ae0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
15af0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
15b00 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20  f( pPg->pgno==0 
15b10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15b20 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30  Pg->pNextHash==0
15b30 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61   && pPg->pPrevHa
15b40 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  sh==0 );.    ret
15b50 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
15b60 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
15b70 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
15b80 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
15b90 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b   pPg->pPrevHash;
15ba0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
15bb0 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20  pPrevHash ){.   
15bc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
15bd0 3e 61 48 61 73 68 5b 70 50 67 2d 3e 70 67 6e 6f  >aHash[pPg->pgno
15be0 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
15bf0 68 2d 31 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20  h-1)]!=pPg );.  
15c00 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
15c10 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
15c20 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
15c30 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68  }else{.    int h
15c40 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28   = pPg->pgno & (
15c50 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
15c60 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
15c70 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e  ash[h] = pPg->pN
15c80 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69  extHash;.  }.  i
15c90 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
15ca0 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48  clearHistory(PGH
15cb0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
15cc0 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20  pPager));.  }.  
15cd0 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20  pPg->pgno = 0;. 
15ce0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
15cf0 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
15d00 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   = 0;.}../*.** U
15d10 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66 72 6f  nlink a page fro
15d20 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20  m the free list 
15d30 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c  (the list of all
15d40 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52 65   pages where nRe
15d50 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f  f==0).** and fro
15d60 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c 6c 69  m its hash colli
15d70 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73  sion chain..*/.s
15d80 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e  tatic void unlin
15d90 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
15da0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
15db0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
15dc0 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66  ;..  /* Unlink f
15dd0 72 6f 6d 20 66 72 65 65 20 70 61 67 65 20 6c 69  rom free page li
15de0 73 74 20 2a 2f 0a 20 20 6c 72 75 4c 69 73 74 52  st */.  lruListR
15df0 65 6d 6f 76 65 28 70 50 67 29 3b 0a 0a 20 20 2f  emove(pPg);..  /
15e00 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68  * Unlink from th
15e10 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c  e pgno hash tabl
15e20 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73  e */.  unlinkHas
15e30 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
15e40 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Pg);.}../*.** Th
15e50 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
15e60 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  ed to truncate t
15e70 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 61 20  he cache when a 
15e80 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20 74  database.** is t
15e90 72 75 6e 63 61 74 65 64 2e 20 20 44 72 6f 70 20  runcated.  Drop 
15ea0 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 61  from the cache a
15eb0 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20 70  ll pages whose p
15ec0 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72 67 65 72  gno is.** larger
15ed0 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
15ee0 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65  Size and is unre
15ef0 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  ferenced..**.** 
15f00 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73  Referenced pages
15f10 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61   larger than pPa
15f20 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20  ger->dbSize are 
15f30 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 63  zeroed..**.** Ac
15f40 74 75 61 6c 6c 79 2c 20 61 74 20 74 68 65 20 70  tually, at the p
15f50 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74 69 6e  oint this routin
15f60 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  e is called, it 
15f70 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 6e 20 65  would be.** an e
15f80 72 72 6f 72 20 74 6f 20 68 61 76 65 20 61 20 72  rror to have a r
15f90 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 2e 20  eferenced page. 
15fa0 20 42 75 74 20 72 61 74 68 65 72 20 74 68 61 6e   But rather than
15fb0 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68 61 74 20   delete.** that 
15fc0 70 61 67 65 20 61 6e 64 20 67 75 61 72 61 6e 74  page and guarant
15fd0 65 65 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  ee a subsequent 
15fe0 73 65 67 66 61 75 6c 74 2c 20 69 74 20 73 65 65  segfault, it see
15ff0 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20 74 6f 20  ms better.** to 
16000 7a 65 72 6f 20 69 74 20 61 6e 64 20 68 6f 70 65  zero it and hope
16010 20 74 68 61 74 20 77 65 20 65 72 72 6f 72 20 6f   that we error o
16020 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f 0a 73 74  ut sanely..*/.st
16030 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
16040 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50  truncate_cache(P
16050 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
16060 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50   PgHdr *pPg;.  P
16070 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69  gHdr **ppPg;.  i
16080 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67  nt dbSize = pPag
16090 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70  er->dbSize;..  p
160a0 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70  pPg = &pPager->p
160b0 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  All;.  while( (p
160c0 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29  Pg = *ppPg)!=0 )
160d0 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  {.    if( pPg->p
160e0 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20  gno<=dbSize ){. 
160f0 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67       ppPg = &pPg
16100 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
16110 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e  }else if( pPg->n
16120 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d  Ref>0 ){.      m
16130 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
16140 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61  ATA(pPg), 0, pPa
16150 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
16160 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50        ppPg = &pP
16170 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
16180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
16190 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  pPg = pPg->pNext
161a0 41 6c 6c 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  All;.      IOTRA
161b0 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20 25  CE(("PGFREE %p %
161c0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
161d0 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  g->pgno));.     
161e0 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
161f0 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65  te3_pager_pgfree
16200 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 75  _count);.      u
16210 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a  nlinkPage(pPg);.
16220 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28        makeClean(
16230 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pPg);.      sqli
16240 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a 20  te3_free(pPg);. 
16250 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61       pPager->nPa
16260 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ge--;.    }.  }.
16270 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
16280 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e  obtain a lock on
16290 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65   a file.  Invoke
162a0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
162b0 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a  ck if the lock.*
162c0 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  * is currently n
162d0 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52  ot available.  R
162e0 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20  epeat until the 
162f0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
16300 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f  turns.** false o
16310 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b  r until the lock
16320 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
16330 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
16340 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
16350 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
16360 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
16370 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a  in.** the lock..
16380 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
16390 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
163a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
163b0 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
163c0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
163d0 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65  he OS lock value
163e0 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  s must be the sa
163f0 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20  me as the Pager 
16400 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20  lock values */. 
16410 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53   assert( PAGER_S
16420 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f  HARED==SHARED_LO
16430 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
16440 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d  PAGER_RESERVED==
16450 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
16460 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
16470 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c  _EXCLUSIVE==EXCL
16480 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  USIVE_LOCK );.. 
16490 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
164a0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c  is currently unl
164b0 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73  ocked then the s
164c0 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e  ize must be unkn
164d0 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  own */.  assert(
164e0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
164f0 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
16500 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30  pPager->dbSize<0
16510 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20   || MEMDB );..  
16520 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
16530 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
16540 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
16550 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
16560 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  do {.      rc = 
16570 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
16580 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79  ager->fd, lockty
16590 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  pe);.    }while(
165a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
165b0 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b   && sqlite3Invok
165c0 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61  eBusyHandler(pPa
165d0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
165e0 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  r) );.    if( rc
165f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16600 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
16610 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  te = locktype;. 
16620 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
16630 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
16640 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29  ager, locktype))
16650 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
16660 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16670 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   Truncate the fi
16680 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  le to the number
16690 20 6f 66 20 70 61 67 65 73 20 73 70 65 63 69 66   of pages specif
166a0 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ied..*/.int sqli
166b0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
166c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
166d0 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
166e0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
166f0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
16700 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
16710 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c 69 74  MEMDB );.  sqlit
16720 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
16730 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
16740 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
16750 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
16760 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
16770 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
16780 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e    if( nPage>=(un
16790 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64  signed)pPager->d
167a0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
167b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
167c0 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29   }.  if( MEMDB )
167d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
167e0 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
167f0 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
16800 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
16810 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16820 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 61 67 65  E_OK;.  }.  page
16830 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
16840 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
16850 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61  al(pPager);.  pa
16860 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
16870 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
16880 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
16890 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
168a0 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69  * Get an exclusi
168b0 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
168c0 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
168d0 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20  runcating. */.  
168e0 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
168f0 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  r);.  rc = pager
16900 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
16910 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
16920 4c 4f 43 4b 29 3b 0a 20 20 70 61 67 65 72 4c 65  LOCK);.  pagerLe
16930 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ave(pPager);.  i
16940 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16950 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
16960 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70  c;.  }..  rc = p
16970 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
16980 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20  ager, nPage);.  
16990 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
169a0 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
169b0 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
169c0 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
169d0 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
169e0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
169f0 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
16a00 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
16a10 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
16a20 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
16a30 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
16a40 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
16a50 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
16a60 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
16a70 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
16a80 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
16a90 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
16aa0 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
16ab0 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
16ac0 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
16ad0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
16ae0 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
16af0 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
16b00 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
16b10 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
16b20 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  on always succee
16b30 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  ds. If a transac
16b40 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
16b50 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20  n attempt.** is 
16b60 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  made to roll it 
16b70 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f  back. If an erro
16b80 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
16b90 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a  the rollback .**
16ba0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d   a hot journal m
16bb0 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ay be left in th
16bc0 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74  e filesystem but
16bd0 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74   no error is ret
16be0 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  urned.** to the 
16bf0 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  caller..*/.int s
16c00 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
16c10 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
16c20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
16c30 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
16c40 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 4d  AGEMENT.  if( !M
16c50 45 4d 44 42 20 29 7b 0a 20 20 20 20 73 71 6c 69  EMDB ){.    sqli
16c60 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
16c70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
16c80 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
16c90 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29  TEX_STATIC_MEM2)
16ca0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
16cb0 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29  tex_enter(mutex)
16cc0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
16cd0 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
16ce0 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 2d 3e   pPager->pPrev->
16cf0 70 4e 65 78 74 20 3d 20 70 50 61 67 65 72 2d 3e  pNext = pPager->
16d00 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
16d10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
16d20 61 67 65 72 4c 69 73 74 20 3d 20 70 50 61 67 65  agerList = pPage
16d30 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
16d40 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
16d50 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  pNext ){.      p
16d60 50 61 67 65 72 2d 3e 70 4e 65 78 74 2d 3e 70 50  Pager->pNext->pP
16d70 72 65 76 20 3d 20 70 50 61 67 65 72 2d 3e 70 50  rev = pPager->pP
16d80 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  rev;.    }.    s
16d90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
16da0 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23  ve(mutex);.  }.#
16db0 65 6e 64 69 66 0a 0a 20 20 64 69 73 61 62 6c 65  endif..  disable
16dc0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
16dd0 72 6f 72 73 28 29 3b 0a 20 20 70 50 61 67 65 72  rors();.  pPager
16de0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
16df0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
16e00 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61  veMode = 0;.  pa
16e10 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
16e20 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  );.  pagerUnlock
16e30 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
16e40 65 72 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69  er);.  enable_si
16e50 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
16e60 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  s();.  PAGERTRAC
16e70 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E2("CLOSE %d\n",
16e80 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
16e90 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43  );.  IOTRACE(("C
16ea0 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOSE %p\n", pPag
16eb0 65 72 29 29 0a 20 20 61 73 73 65 72 74 28 20 70  er)).  assert( p
16ec0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c  Pager->errCode |
16ed0 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | (pPager->journ
16ee0 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50 61  alOpen==0 && pPa
16ef0 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30  ger->stmtOpen==0
16f00 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
16f10 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
16f20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
16f30 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
16f40 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
16f50 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  _free(pPager->aI
16f60 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  nJournal);.  if(
16f70 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
16f80 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
16f90 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
16fa0 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  stfd);.  }.  sql
16fb0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
16fc0 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65  er->fd);.  /* Te
16fd0 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74  mp files are aut
16fe0 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
16ff0 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a  ed by the OS.  *
17000 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65  * if( pPager->te
17010 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20  mpFile ){.  **  
17020 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
17030 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
17040 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f  me);.  ** }.  */
17050 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
17060 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b  (pPager->aHash);
17070 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
17080 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
17090 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
170a0 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ee(pPager);.  re
170b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
170c0 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
170d0 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  NDEBUG) || defin
170e0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
170f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
17100 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
17110 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
17120 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71  data..*/.Pgno sq
17130 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
17140 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b  mber(DbPage *p){
17150 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e  .  return p->pgn
17160 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  o;.}.#endif../*.
17170 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28  ** The page_ref(
17180 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65  ) function incre
17190 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65  ments the refere
171a0 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
171b0 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20  page..** If the 
171c0 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c  page is currentl
171d0 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  y on the freelis
171e0 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65  t (the reference
171f0 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20   count is zero) 
17200 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69  then.** remove i
17210 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  t from the freel
17220 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e  ist..**.** For n
17230 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c  on-test systems,
17240 20 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61   page_ref() is a
17250 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c   macro that call
17260 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a  s _page_ref().**
17270 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72   online of the r
17280 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
17290 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73  s zero.  For tes
172a0 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f  t systems, page_
172b0 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65  ref().** is a re
172c0 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74  al function so t
172d0 68 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62  hat we can set b
172e0 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74  reakpoints and t
172f0 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  race it..*/.stat
17300 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65  ic void _page_re
17310 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  f(PgHdr *pPg){. 
17320 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
17330 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
17340 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c  page is currentl
17350 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  y on the freelis
17360 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a  t.  Remove it. *
17370 2f 0a 20 20 20 20 6c 72 75 4c 69 73 74 52 65 6d  /.    lruListRem
17380 6f 76 65 28 70 50 67 29 3b 0a 20 20 20 20 70 50  ove(pPg);.    pP
17390 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b  g->pPager->nRef+
173a0 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52  +;.  }.  pPg->nR
173b0 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28  ef++;.  REFINFO(
173c0 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53  pPg);.}.#ifdef S
173d0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 74  QLITE_DEBUG.  st
173e0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72  atic void page_r
173f0 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ef(PgHdr *pPg){.
17400 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65      if( pPg->nRe
17410 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f 70  f==0 ){.      _p
17420 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
17430 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
17440 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Pg->nRef++;.    
17450 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
17460 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
17470 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72 65  # define page_re
17480 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52 65  f(P)   ((P)->nRe
17490 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28 50  f==0?_page_ref(P
174a0 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65  ):(void)(P)->nRe
174b0 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  f++).#endif../*.
174c0 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
174d0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
174e0 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68   for a page.  Th
174f0 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20  e input pointer 
17500 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  is.** a referenc
17510 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 61  e to the page da
17520 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ta..*/.int sqlit
17530 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67  e3PagerRef(DbPag
17540 65 20 2a 70 50 67 29 7b 0a 20 20 70 61 67 65 72  e *pPg){.  pager
17550 45 6e 74 65 72 28 70 50 67 2d 3e 70 50 61 67 65  Enter(pPg->pPage
17560 72 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70  r);.  page_ref(p
17570 50 67 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  Pg);.  pagerLeav
17580 65 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pPg->pPager);.
17590 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
175a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
175b0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  c the journal.  
175c0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
175d0 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  make sure all th
175e0 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  e pages that hav
175f0 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65  e.** been writte
17600 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
17610 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72   have actually r
17620 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61  eached the surfa
17630 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73  ce of the.** dis
17640 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61  k.  It is not sa
17650 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  fe to modify the
17660 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
17670 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66  se file until af
17680 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ter.** the journ
17690 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  al has been sync
176a0 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67  ed.  If the orig
176b0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  inal database is
176c0 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65   modified before
176d0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
176e0 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20  is synced and a 
176f0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
17700 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63  curs, the unsync
17710 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61  ed journal.** da
17720 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74  ta would be lost
17730 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65   and we would be
17740 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c   unable to compl
17750 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74  etely rollback t
17760 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
17770 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73  hanges.  Databas
17780 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75  e corruption wou
17790 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a  ld occur..** .**
177a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
177b0 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20 6e  so updates the n
177c0 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65  Rec field in the
177d0 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a   header of the j
177e0 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20  ournal..** (See 
177f0 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20  comments on the 
17800 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
17810 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64   routine for add
17820 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
17830 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20  ion.).** If the 
17840 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c  sync mode is FUL
17850 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c  L, two syncs wil
17860 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20  l occur.  First 
17870 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61  the whole journa
17880 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20  l.** is synced, 
17890 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
178a0 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20  eld is updated, 
178b0 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79  then a second sy
178c0 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
178d0 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64   For temporary d
178e0 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20  atabases, we do 
178f0 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20 61  not care if we a
17900 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  re able to rollb
17910 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70  ack.** after a p
17920 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f  ower failure, so
17930 20 6e 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e   no sync occurs.
17940 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4f  .**.** If the IO
17950 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 66  CAP_SEQUENTIAL f
17960 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 74  lag is set for t
17970 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
17980 64 69 61 20 6f 6e 20 77 68 69 63 68 0a 2a 2a 20  dia on which.** 
17990 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
179a0 73 74 6f 72 65 64 2c 20 74 68 65 6e 20 4f 73 53  stored, then OsS
179b0 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
179c0 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  alled on the jou
179d0 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49 6e  rnal.** file. In
179e0 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 74   this case all t
179f0 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20  hat is required 
17a00 69 73 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  is to update the
17a10 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 0a 2a   nRec field in.*
17a20 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * the journal he
17a30 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ader..**.** This
17a40 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
17a50 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65  the needSync fie
17a60 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  ld of every page
17a70 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e   current held in
17a80 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  .** memory..*/.s
17a90 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
17aa0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
17ab0 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
17ac0 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
17ad0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a  QLITE_OK;...  /*
17ae0 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
17af0 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69  l before modifyi
17b00 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ng the main data
17b10 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d  base.  ** (assum
17b20 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a  ing there is a j
17b30 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65  ournal and it ne
17b40 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eds to be synced
17b50 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  .).  */.  if( pP
17b60 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
17b70 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
17b80 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
17b90 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
17ba0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
17bb0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
17bc0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
17bd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
17be0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
17bf0 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74  .      /* assert
17c00 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
17c10 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d  c ); // noSync m
17c20 69 67 68 74 20 62 65 20 73 65 74 20 69 66 20 73  ight be set if s
17c30 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20  ynchronous.     
17c40 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f   ** was turned o
17c50 66 66 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ff after the tra
17c60 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61  nsaction was sta
17c70 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36  rted.  Ticket #6
17c80 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  15 */.#ifndef ND
17c90 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20  EBUG.      {.   
17ca0 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
17cb0 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52  e the pPager->nR
17cc0 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72  ec counter we ar
17cd0 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73  e keeping agrees
17ce0 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68  .        ** with
17cf0 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74   the nRec comput
17d00 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ed from the size
17d10 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
17d20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
17d30 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a  .        i64 jSz
17d40 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
17d50 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
17d60 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
17d70 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Sz);.        if(
17d80 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
17d90 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rc;.        asse
17da0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
17db0 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20  nalOff==jSz );. 
17dc0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
17dd0 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
17de0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
17df0 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
17e00 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
17e10 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
17e20 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
17e30 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
17e40 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
17e50 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
17e60 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
17e70 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
17e80 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
17e90 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
17ea0 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
17eb0 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
17ec0 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
17ed0 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
17ee0 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
17ef0 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
17f00 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
17f10 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
17f20 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66   not required if
17f30 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
17f40 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74  media supports t
17f50 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41  he.        ** SA
17f60 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
17f70 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74  ty. Because in t
17f80 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
17f90 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20  ot possible .   
17fa0 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62       ** for garb
17fb0 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61  age data to be a
17fc0 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66  ppended to the f
17fd0 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69  ile, the nRec fi
17fe0 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  eld.        ** i
17ff0 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
18000 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e   0xFFFFFFFF when
18010 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
18020 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20  der is written. 
18030 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65         ** and ne
18040 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
18050 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20  updated..       
18060 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
18070 6a 72 6e 6c 4f 66 66 3b 0a 20 20 20 20 20 20 20  jrnlOff;.       
18080 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
18090 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63  lSync && 0==(iDc
180a0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
180b0 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
180c0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
180d0 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E2("SYNC journal
180e0 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
180f0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
18100 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
18110 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
18120 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20  ager)).         
18130 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
18140 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
18150 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
18160 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ags);.          
18170 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
18180 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
18190 0a 0a 20 20 20 20 20 20 20 20 6a 72 6e 6c 4f 66  ..        jrnlOf
181a0 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
181b0 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28  nalHdr + sizeof(
181c0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a  aJournalMagic);.
181d0 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
181e0 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
181f0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6a 72  d\n", pPager, jr
18200 6e 6c 4f 66 66 2c 20 34 29 29 3b 0a 20 20 20 20  nlOff, 4));.    
18210 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
18220 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
18230 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 50 61 67 65  , jrnlOff, pPage
18240 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20  r->nRec);.      
18250 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
18260 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
18270 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
18280 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
18290 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
182a0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
182b0 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
182c0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
182d0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
182e0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
182f0 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
18300 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ).        rc = s
18310 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
18320 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
18330 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20  ->sync_flags| . 
18340 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
18350 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51  ->sync_flags==SQ
18360 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53  LITE_SYNC_FULL?S
18370 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
18380 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29  NLY:0).        )
18390 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
183a0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
183b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
183c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
183d0 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  arted = 1;.    }
183e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
183f0 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20  dSync = 0;..    
18400 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65 65  /* Erase the nee
18410 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20  dSync flag from 
18420 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20  every page..    
18430 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  */.    for(pPg=p
18440 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
18450 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
18460 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  All){.      pPg-
18470 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
18480 20 20 20 7d 0a 20 20 20 20 6c 72 75 4c 69 73 74     }.    lruList
18490 53 65 74 46 69 72 73 74 53 79 6e 63 65 64 28 70  SetFirstSynced(p
184a0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 23 69 66  Pager);.  }..#if
184b0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
184c0 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65   If the Pager.ne
184d0 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63  edSync flag is c
184e0 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20 50 67  lear then the Pg
184f0 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a  Hdr.needSync.  *
18500 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f  * flag must also
18510 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c   be clear for al
18520 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69 66 79  l pages.  Verify
18530 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20   that this.  ** 
18540 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72 75  invariant is tru
18550 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a  e..  */.  else{.
18560 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
18570 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
18580 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
18590 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
185a0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
185b0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  0 );.    }.    a
185c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6c  ssert( pPager->l
185d0 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  ru.pFirstSynced=
185e0 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69  =pPager->lru.pFi
185f0 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rst );.  }.#endi
18600 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
18610 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74  }../*.** Merge t
18620 77 6f 20 6c 69 73 74 73 20 6f 66 20 70 61 67 65  wo lists of page
18630 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70  s connected by p
18640 44 69 72 74 79 20 61 6e 64 20 69 6e 20 70 67 6e  Dirty and in pgn
18650 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e  o order..** Do n
18660 6f 74 20 62 6f 74 68 20 66 69 78 69 6e 67 20 74  ot both fixing t
18670 68 65 20 70 50 72 65 76 44 69 72 74 79 20 70 6f  he pPrevDirty po
18680 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  inters..*/.stati
18690 63 20 50 67 48 64 72 20 2a 6d 65 72 67 65 5f 70  c PgHdr *merge_p
186a0 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
186b0 41 2c 20 50 67 48 64 72 20 2a 70 42 29 7b 0a 20  A, PgHdr *pB){. 
186c0 20 50 67 48 64 72 20 72 65 73 75 6c 74 2c 20 2a   PgHdr result, *
186d0 70 54 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d  pTail;.  pTail =
186e0 20 26 72 65 73 75 6c 74 3b 0a 20 20 77 68 69 6c   &result;.  whil
186f0 65 28 20 70 41 20 26 26 20 70 42 20 29 7b 0a 20  e( pA && pB ){. 
18700 20 20 20 69 66 28 20 70 41 2d 3e 70 67 6e 6f 3c     if( pA->pgno<
18710 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  pB->pgno ){.    
18720 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
18730 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 54 61 69  = pA;.      pTai
18740 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 41  l = pA;.      pA
18750 20 3d 20 70 41 2d 3e 70 44 69 72 74 79 3b 0a 20   = pA->pDirty;. 
18760 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18770 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
18780 70 42 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20  pB;.      pTail 
18790 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 42 20 3d  = pB;.      pB =
187a0 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   pB->pDirty;.   
187b0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 20   }.  }.  if( pA 
187c0 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  ){.    pTail->pD
187d0 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 7d 65 6c  irty = pA;.  }el
187e0 73 65 20 69 66 28 20 70 42 20 29 7b 0a 20 20 20  se if( pB ){.   
187f0 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
18800 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   pB;.  }else{.  
18810 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
18820 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
18830 6e 20 72 65 73 75 6c 74 2e 70 44 69 72 74 79 3b  n result.pDirty;
18840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74  .}../*.** Sort t
18850 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  he list of pages
18860 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
18870 64 65 72 20 62 79 20 70 67 6e 6f 2e 20 20 50 61  der by pgno.  Pa
18880 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65  ges are.** conne
18890 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20 70  cted by pDirty p
188a0 6f 69 6e 74 65 72 73 2e 20 20 54 68 65 20 70 50  ointers.  The pP
188b0 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72  revDirty pointer
188c0 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72 75 70 74  s are.** corrupt
188d0 65 64 20 62 79 20 74 68 69 73 20 73 6f 72 74 2e  ed by this sort.
188e0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f  .*/.#define N_SO
188f0 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 20  RT_BUCKET_ALLOC 
18900 32 35 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52  25.#define N_SOR
18910 54 5f 42 55 43 4b 45 54 20 20 20 20 20 20 20 32  T_BUCKET       2
18920 35 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  5.#ifdef SQLITE_
18930 54 45 53 54 0a 20 20 69 6e 74 20 73 71 6c 69 74  TEST.  int sqlit
18940 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
18950 62 75 63 6b 65 74 20 3d 20 30 3b 0a 20 20 23 75  bucket = 0;.  #u
18960 6e 64 65 66 20 4e 5f 53 4f 52 54 5f 42 55 43 4b  ndef N_SORT_BUCK
18970 45 54 0a 20 20 23 64 65 66 69 6e 65 20 4e 5f 53  ET.  #define N_S
18980 4f 52 54 5f 42 55 43 4b 45 54 20 5c 0a 20 20 20  ORT_BUCKET \.   
18990 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e  (sqlite3_pager_n
189a0 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3f 73 71 6c  _sort_bucket?sql
189b0 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72  ite3_pager_n_sor
189c0 74 5f 62 75 63 6b 65 74 3a 4e 5f 53 4f 52 54 5f  t_bucket:N_SORT_
189d0 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 29 0a 23 65  BUCKET_ALLOC).#e
189e0 6e 64 69 66 0a 73 74 61 74 69 63 20 50 67 48 64  ndif.static PgHd
189f0 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c 69 73 74  r *sort_pagelist
18a00 28 50 67 48 64 72 20 2a 70 49 6e 29 7b 0a 20 20  (PgHdr *pIn){.  
18a10 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f 52 54 5f  PgHdr *a[N_SORT_
18a20 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 5d 2c 20 2a  BUCKET_ALLOC], *
18a30 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65  p;.  int i;.  me
18a40 6d 73 65 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f  mset(a, 0, sizeo
18a50 66 28 61 29 29 3b 0a 20 20 77 68 69 6c 65 28 20  f(a));.  while( 
18a60 70 49 6e 20 29 7b 0a 20 20 20 20 70 20 3d 20 70  pIn ){.    p = p
18a70 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 2d  In;.    pIn = p-
18a80 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e  >pDirty;.    p->
18a90 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
18aa0 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52  for(i=0; i<N_SOR
18ab0 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69 2b 2b 29  T_BUCKET-1; i++)
18ac0 7b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 69 5d  {.      if( a[i]
18ad0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
18ae0 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  [i] = p;.       
18af0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
18b00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d  lse{.        p =
18b10 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28   merge_pagelist(
18b20 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20  a[i], p);.      
18b30 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20    a[i] = 0;.    
18b40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
18b50 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b  ( i==N_SORT_BUCK
18b60 45 54 2d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ET-1 ){.      /*
18b70 20 43 6f 76 65 72 61 67 65 3a 20 54 6f 20 67 65   Coverage: To ge
18b80 74 20 68 65 72 65 2c 20 74 68 65 72 65 20 6e 65  t here, there ne
18b90 65 64 20 74 6f 20 62 65 20 32 5e 28 4e 5f 53 4f  ed to be 2^(N_SO
18ba0 52 54 5f 42 55 43 4b 45 54 29 20 0a 20 20 20 20  RT_BUCKET) .    
18bb0 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 69 6e    ** elements in
18bc0 20 74 68 65 20 69 6e 70 75 74 20 6c 69 73 74 2e   the input list.
18bd0 20 54 68 69 73 20 69 73 20 70 6f 73 73 69 62 6c   This is possibl
18be0 65 2c 20 62 75 74 20 69 6d 70 72 61 63 74 69 63  e, but impractic
18bf0 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 20 54 65 73  al..      ** Tes
18c00 74 69 6e 67 20 74 68 69 73 20 6c 69 6e 65 20 69  ting this line i
18c10 73 20 74 68 65 20 70 6f 69 6e 74 20 6f 66 20 67  s the point of g
18c20 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 0a 20  lobal variable. 
18c30 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f       ** sqlite3_
18c40 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63  pager_n_sort_buc
18c50 6b 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ket..      */.  
18c60 20 20 20 20 61 5b 69 5d 20 3d 20 6d 65 72 67 65      a[i] = merge
18c70 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20  _pagelist(a[i], 
18c80 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  p);.    }.  }.  
18c90 70 20 3d 20 61 5b 30 5d 3b 0a 20 20 66 6f 72 28  p = a[0];.  for(
18ca0 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55  i=1; i<N_SORT_BU
18cb0 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  CKET; i++){.    
18cc0 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69  p = merge_pageli
18cd0 73 74 28 70 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d  st(p, a[i]);.  }
18ce0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
18cf0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69  /*.** Given a li
18d00 73 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e  st of pages (con
18d10 6e 65 63 74 65 64 20 62 79 20 74 68 65 20 50 67  nected by the Pg
18d20 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
18d30 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65  er) write.** eve
18d40 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  ry one of those 
18d50 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65  pages out to the
18d60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
18d70 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c  nd mark them all
18d80 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f  .** as clean..*/
18d90 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
18da0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
18db0 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a  (PgHdr *pList){.
18dc0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
18dd0 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 69  .  PgHdr *p;.  i
18de0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c  nt rc;..  if( pL
18df0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
18e00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
18e10 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61  ger = pList->pPa
18e20 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ger;..  /* At th
18e30 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d  is point there m
18e40 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52  ay be either a R
18e50 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
18e60 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
18e70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
18e80 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
18e90 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c   already an EXCL
18ea0 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20  USIVE lock, the 
18eb0 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63  following.  ** c
18ec0 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f  alls to sqlite3O
18ed0 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f  sLock() are no-o
18ee0 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  ps..  **.  ** Mo
18ef0 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72  ving the lock fr
18f00 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20 45  om RESERVED to E
18f10 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c  XCLUSIVE actuall
18f20 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67  y involves going
18f30 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e  .  ** through an
18f40 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
18f50 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41  ate PENDING.   A
18f60 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72   PENDING lock pr
18f70 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20  events new.  ** 
18f80 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74  readers from att
18f90 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  aching to the da
18fa0 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75 6e  tabase but is un
18fb0 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75  sufficient for u
18fc0 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e  s to.  ** write.
18fd0 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61 20    The idea of a 
18fe0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
18ff0 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72  to prevent new r
19000 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a  eaders from.  **
19010 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65   coming in while
19020 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78 69   we wait for exi
19030 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f  sting readers to
19040 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a   clear..  **.  *
19050 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  * While the page
19060 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53 45  r is in the RESE
19070 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 20  RVED state, the 
19080 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
19090 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75  e file.  ** is u
190a0 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20  nchanged and we 
190b0 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74  can rollback wit
190c0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70  hout having to p
190d0 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a  layback the.  **
190e0 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68   journal into th
190f0 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
19100 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20  ase file.  Once 
19110 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f  we transition to
19120 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c  .  ** EXCLUSIVE,
19130 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61   it means the da
19140 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
19150 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64  been changed and
19160 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   any rollback.  
19170 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  ** will require 
19180 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  a journal playba
19190 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ck..  */.  rc = 
191a0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
191b0 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
191c0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  SIVE_LOCK);.  if
191d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
191e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
191f0 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d  ;.  }..  pList =
19200 20 73 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 70   sort_pagelist(p
19210 4c 69 73 74 29 3b 0a 20 20 66 6f 72 28 70 3d 70  List);.  for(p=p
19220 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44  List; p; p=p->pD
19230 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72  irty){.    asser
19240 74 28 20 70 2d 3e 64 69 72 74 79 20 29 3b 0a 20  t( p->dirty );. 
19250 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b     p->dirty = 0;
19260 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 4c  .  }.  while( pL
19270 69 73 74 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 49  ist ){..    /* I
19280 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 6e  f the file has n
19290 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
192a0 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
192b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
192c0 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
192d0 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  s ){.      asser
192e0 74 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  t(pPager->tempFi
192f0 6c 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  le);.      rc = 
19300 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
19310 74 65 6d 70 28 70 50 61 67 65 72 2d 3e 70 56 66  temp(pPager->pVf
19320 73 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  s, pPager->fd, p
19330 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
19340 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19360 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61    pPager->vfsFla
19370 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  gs);.      if( r
19380 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
19390 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
193a0 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20  there are dirty 
193b0 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
193c0 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67  e cache with pag
193d0 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
193e0 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61  r.    ** than Pa
193f0 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73  ger.dbSize, this
19400 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61   means sqlite3Pa
19410 67 65 72 54 72 75 6e 63 61 74 65 28 29 20 77 61  gerTruncate() wa
19420 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20  s called to.    
19430 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
19440 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d   smaller (presum
19450 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63  ably by auto-vac
19460 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f  uum code). Do no
19470 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61  t write.    ** a
19480 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f  ny such pages to
19490 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
194a0 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  /.    if( pList-
194b0 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64  >pgno<=pPager->d
194c0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  bSize ){.      i
194d0 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 4c 69  64 offset = (pLi
194e0 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34  st->pgno-1)*(i64
194f0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
19500 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  e;.      char *p
19510 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28 70 50  Data = CODEC2(pP
19520 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
19530 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73  ATA(pList), pLis
19540 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20  t->pgno, 6);.   
19550 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22     PAGERTRACE4("
19560 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
19570 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
19580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19590 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
195a0 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c  r), pList->pgno,
195b0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
195c0 70 4c 69 73 74 29 29 3b 0a 20 20 20 20 20 20 49  pList));.      I
195d0 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25  OTRACE(("PGOUT %
195e0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
195f0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a   pList->pgno));.
19600 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19610 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
19620 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
19630 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
19640 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 50 41  ffset);.      PA
19650 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
19660 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
19670 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47  ount);.      PAG
19680 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
19690 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 69  nWrite);.      i
196a0 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d  f( pList->pgno==
196b0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 ){.        mem
196c0 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
196d0 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b  ileVers, &pData[
196e0 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  24], sizeof(pPag
196f0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
19700 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19710 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
19720 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 50     else{.      P
19730 41 47 45 52 54 52 41 43 45 33 28 22 4e 4f 53 54  AGERTRACE3("NOST
19740 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
19750 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
19760 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  r), pList->pgno)
19770 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
19780 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
19790 72 6e 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51  rn rc;.#ifdef SQ
197a0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
197b0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
197c0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
197d0 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
197e0 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
197f0 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
19800 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
19810 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
19820 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64   Collect every d
19830 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61  irty page into a
19840 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a   dirty list and.
19850 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** return a poin
19860 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
19870 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41  of that list.  A
19880 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ll pages are.** 
19890 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69  collected even i
198a0 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c  f they are still
198b0 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
198c0 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
198d0 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
198e0 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ges(Pager *pPage
198f0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
19900 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a  ger->pDirty;.}..
19910 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
19920 45 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  E if there is a 
19930 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74  hot journal on t
19940 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
19950 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** A hot journal
19960 20 69 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65   is one that nee
19970 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
19980 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
19990 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
199a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
199b0 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20  file is 0 but a 
199c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
199d0 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20  exists, that is 
199e0 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20  probably an old 
199f0 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65  journal left ove
19a00 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a  r from a prior.*
19a10 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  * database with 
19a20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
19a30 4a 75 73 74 20 64 65 6c 65 74 65 20 74 68 65 20  Just delete the 
19a40 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
19a50 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75  ic int hasHotJou
19a60 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
19a70 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
19a80 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
19a90 72 2d 3e 70 56 66 73 3b 0a 20 20 69 66 28 20 21  r->pVfs;.  if( !
19aa0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
19ab0 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  al ) return 0;. 
19ac0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64   if( !pPager->fd
19ad0 2d 3e 70 4d 65 74 68 6f 64 73 20 29 20 72 65 74  ->pMethods ) ret
19ae0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
19af0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
19b00 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
19b10 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
19b20 45 53 53 5f 45 58 49 53 54 53 29 20 29 7b 0a 20  ESS_EXISTS) ){. 
19b30 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
19b40 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73  .  if( sqlite3Os
19b50 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
19b60 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  k(pPager->fd) ){
19b70 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
19b80 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
19b90 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
19ba0 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20  Pager)==0 ){.   
19bb0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
19bc0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
19bd0 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
19be0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
19bf0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
19c00 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
19c10 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ry to find a pag
19c20 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  e in the cache t
19c30 68 61 74 20 63 61 6e 20 62 65 20 72 65 63 79 63  hat can be recyc
19c40 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  led. .**.** This
19c50 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74   routine may ret
19c60 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
19c70 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72  , SQLITE_FULL or
19c80 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a   SQLITE_OK. It .
19c90 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20  ** does not set 
19ca0 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43  the pPager->errC
19cb0 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ode variable..*/
19cc0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
19cd0 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72 20  r_recycle(Pager 
19ce0 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
19cf0 2a 70 70 50 67 29 7b 0a 20 20 50 67 48 64 72 20  *ppPg){.  PgHdr 
19d00 2a 70 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d 20  *pPg;.  *ppPg = 
19d10 30 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69  0;..  /* It is i
19d20 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 74  llegal to call t
19d30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 6e 6c  his function unl
19d40 65 73 73 20 74 68 65 20 70 61 67 65 72 20 6f 62  ess the pager ob
19d50 6a 65 63 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  ject.  ** pointe
19d60 64 20 74 6f 20 62 79 20 70 50 61 67 65 72 20 68  d to by pPager h
19d70 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  as at least one 
19d80 66 72 65 65 20 70 61 67 65 20 28 70 61 67 65 20  free page (page 
19d90 77 69 74 68 20 6e 52 65 66 3d 3d 30 29 2e 0a 20  with nRef==0).. 
19da0 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 21 4d   */ .  assert(!M
19db0 45 4d 44 42 29 3b 0a 20 20 61 73 73 65 72 74 28  EMDB);.  assert(
19dc0 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
19dd0 73 74 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  st);..  /* Find 
19de0 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c  a page to recycl
19df0 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74  e.  Try to locat
19e00 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f  e a page that do
19e10 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75  es not.  ** requ
19e20 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20  ire us to do an 
19e30 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a  fsync() on the j
19e40 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70  ournal..  */.  p
19e50 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72 75  Pg = pPager->lru
19e60 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a  .pFirstSynced;..
19e70 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64    /* If we could
19e80 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65   not find a page
19e90 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
19ea0 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28  equire an fsync(
19eb0 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f  ).  ** on the jo
19ec0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
19ed0 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61  fsync the journa
19ee0 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  l file.  This is
19ef0 20 61 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f   a.  ** very slo
19f00 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20  w operation, so 
19f10 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20  we work hard to 
19f20 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73  avoid it.  But s
19f30 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74  ometimes.  ** it
19f40 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64   can't be helped
19f50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
19f60 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6c  ==0 && pPager->l
19f70 72 75 2e 70 46 69 72 73 74 29 7b 0a 20 20 20 20  ru.pFirst){.    
19f80 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
19f90 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
19fa0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
19fb0 3e 66 64 29 3b 0a 20 20 20 20 69 6e 74 20 72 63  >fd);.    int rc
19fc0 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
19fd0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
19fe0 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  rc!=0 ){.      r
19ff0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1a000 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1a010 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28  fullSync && 0==(
1a020 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
1a030 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
1a040 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20  .      /* If in 
1a050 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
1a060 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72  write a new jour
1a070 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20  nal header into 
1a080 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  the.      ** jou
1a090 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
1a0a0 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64  is done to avoid
1a0b0 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20   ever modifying 
1a0c0 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  a journal.      
1a0d0 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20 69  ** header that i
1a0e0 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
1a0f0 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61  e rollback of pa
1a100 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20 20  ges that have.  
1a110 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62      ** already b
1a120 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1a130 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 20  he database (in 
1a140 63 61 73 65 20 74 68 65 20 68 65 61 64 65 72 20  case the header 
1a150 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 73  is.      ** tras
1a160 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65  hed when the nRe
1a170 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
1a180 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ed)..      */.  
1a190 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
1a1a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
1a1b0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1a1c0 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20  nalOff > 0 );.  
1a1d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1a1e0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30  er->doNotSync==0
1a1f0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   );.      rc = w
1a200 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
1a210 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
1a220 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
1a230 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1a240 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1a250 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72  pPg = pPager->lr
1a260 75 2e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 20  u.pFirst;.  }.. 
1a270 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
1a280 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57  ef==0 );..  /* W
1a290 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74 6f  rite the page to
1a2a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a2b0 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72 74  le if it is dirt
1a2c0 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  y..  */.  if( pP
1a2d0 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
1a2e0 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65  int rc;.    asse
1a2f0 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
1a300 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b 65  c==0 );.    make
1a310 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
1a320 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
1a330 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
1a340 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  = 0;.    rc = pa
1a350 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
1a360 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 70  st( pPg );.    p
1a370 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
1a380 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1a3a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1a3b0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
1a3c0 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20  ->dirty==0 );.. 
1a3d0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
1a3e0 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67  we are recycling
1a3f0 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   is marked as al
1a400 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68  waysRollback, th
1a410 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20  en.  ** set the 
1a420 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c  global alwaysRol
1a430 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73  lback flag, thus
1a440 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20   disabling the. 
1a450 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
1a460 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 6f  DontRollback() o
1a470 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
1a480 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73  the rest of this
1a490 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
1a4a0 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61  ** It is necessa
1a4b0 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ry to do this be
1a4c0 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d  cause the page m
1a4d0 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c  arked alwaysRoll
1a4e0 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20  back.  ** might 
1a4f0 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61  be reloaded at a
1a500 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20   later time but 
1a510 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  at that point we
1a520 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a   won't remember.
1a530 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73    ** that is was
1a540 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
1a550 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65  llback.  This me
1a560 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ans that all pag
1a570 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  es must.  ** be 
1a580 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
1a590 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65  Rollback from he
1a5a0 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a  re on out..  */.
1a5b0 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
1a5c0 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  sRollback ){.   
1a5d0 20 49 4f 54 52 41 43 45 28 28 22 41 4c 57 41 59   IOTRACE(("ALWAY
1a5e0 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e 22  S_ROLLBACK %p\n"
1a5f0 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 70  , pPager)).    p
1a600 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
1a610 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a  lback = 1;.  }..
1a620 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20    /* Unlink the 
1a630 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68  old page from th
1a640 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20  e free list and 
1a650 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20  the hash table. 
1a660 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65   */.  unlinkPage
1a670 28 70 50 67 29 3b 0a 20 20 61 73 73 65 72 74 28  (pPg);.  assert(
1a680 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b   pPg->pgno==0 );
1a690 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b  ..  *ppPg = pPg;
1a6a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a6b0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
1a6c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
1a6d0 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 2f  ORY_MANAGEMENT./
1a6e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1a6f0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1a700 66 72 65 65 20 73 75 70 65 72 66 6c 75 6f 75 73  free superfluous
1a710 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
1a720 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a  ocated memory.**
1a730 20 68 65 6c 64 20 62 79 20 74 68 65 20 70 61 67   held by the pag
1a740 65 72 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72  er system. Memor
1a750 79 20 69 6e 20 75 73 65 20 62 79 20 61 6e 79 20  y in use by any 
1a760 53 51 4c 69 74 65 20 70 61 67 65 72 20 61 6c 6c  SQLite pager all
1a770 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  ocated.** by the
1a780 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
1a790 6d 61 79 20 62 65 20 73 71 6c 69 74 65 33 5f 66  may be sqlite3_f
1a7a0 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e  ree()ed..**.** n
1a7b0 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Req is the numbe
1a7c0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65  r of bytes of me
1a7d0 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e 20 4f  mory required. O
1a7e0 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20 68 61  nce this much ha
1a7f0 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61 73  s.** been releas
1a800 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ed, the function
1a810 20 72 65 74 75 72 6e 73 2e 20 54 68 65 20 72 65   returns. The re
1a820 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
1a830 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a  e total number .
1a840 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  ** of bytes of m
1a850 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a  emory released..
1a860 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1a870 67 65 72 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79  gerReleaseMemory
1a880 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20 20 69 6e  (int nReq){.  in
1a890 74 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30 3b  t nReleased = 0;
1a8a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
1a8b0 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c  es of memory rel
1a8c0 65 61 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  eased so far */.
1a8d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
1a8e0 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 20 2f 2a  *mutex;       /*
1a8f0 20 54 68 65 20 4d 45 4d 32 20 6d 75 74 65 78 20   The MEM2 mutex 
1a900 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  */.  Pager *pPag
1a910 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
1a920 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1a930 6f 76 65 72 20 70 61 67 65 72 73 20 2a 2f 0a 20  over pagers */. 
1a940 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a950 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 41 63 71 75 69  _OK;..  /* Acqui
1a960 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 2d 6d 61  re the memory-ma
1a970 6e 61 67 65 6d 65 6e 74 20 6d 75 74 65 78 0a 20  nagement mutex. 
1a980 20 2a 2f 0a 20 20 6d 75 74 65 78 20 3d 20 73 71   */.  mutex = sq
1a990 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
1a9a0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1a9b0 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 73  TATIC_MEM2);.  s
1a9c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1a9d0 65 72 28 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  er(mutex);..  /*
1a9e0 20 53 69 67 6e 61 6c 20 61 6c 6c 20 64 61 74 61   Signal all data
1a9f0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
1aa00 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 6d 61 6e   that memory man
1aa10 61 67 65 6d 65 6e 74 20 77 61 6e 74 73 0a 20 20  agement wants.  
1aa20 2a 2a 20 74 6f 20 68 61 76 65 20 61 63 63 65 73  ** to have acces
1aa30 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 73 2e  s to the pagers.
1aa40 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 67  .  */.  for(pPag
1aa50 65 72 3d 73 71 6c 69 74 65 33 50 61 67 65 72 4c  er=sqlite3PagerL
1aa60 69 73 74 3b 20 70 50 61 67 65 72 3b 20 70 50 61  ist; pPager; pPa
1aa70 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78  ger=pPager->pNex
1aa80 74 29 7b 0a 20 20 20 20 20 70 50 61 67 65 72 2d  t){.     pPager-
1aa90 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 31 3b 0a 20  >iInUseMM = 1;. 
1aaa0 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   }..  while( rc=
1aab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6e  =SQLITE_OK && (n
1aac0 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73  Req<0 || nReleas
1aad0 65 64 3c 6e 52 65 71 29 20 29 7b 0a 20 20 20 20  ed<nReq) ){.    
1aae0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
1aaf0 50 67 48 64 72 20 2a 70 52 65 63 79 63 6c 65 64  PgHdr *pRecycled
1ab00 3b 0a 20 0a 20 20 20 20 2f 2a 20 54 72 79 20 74  ;. .    /* Try t
1ab10 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 6f  o find a page to
1ab20 20 72 65 63 79 63 6c 65 20 74 68 61 74 20 64 6f   recycle that do
1ab30 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
1ab40 20 73 79 6e 63 28 29 2e 20 49 66 0a 20 20 20 20   sync(). If.    
1ab50 2a 2a 20 74 68 69 73 20 69 73 20 6e 6f 74 20 70  ** this is not p
1ab60 6f 73 73 69 62 6c 65 2c 20 66 69 6e 64 20 6f 6e  ossible, find on
1ab70 65 20 74 68 61 74 20 64 6f 65 73 20 72 65 71 75  e that does requ
1ab80 69 72 65 20 61 20 73 79 6e 63 28 29 2e 0a 20 20  ire a sync()..  
1ab90 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
1aba0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
1abb0 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
1abc0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
1abd0 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20  ATIC_LRU));.    
1abe0 70 50 67 20 3d 20 73 71 6c 69 74 65 33 4c 72 75  pPg = sqlite3Lru
1abf0 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53  PageList.pFirstS
1ac00 79 6e 63 65 64 3b 0a 20 20 20 20 77 68 69 6c 65  ynced;.    while
1ac10 28 20 70 50 67 20 26 26 20 28 70 50 67 2d 3e 6e  ( pPg && (pPg->n
1ac20 65 65 64 53 79 6e 63 20 7c 7c 20 70 50 67 2d 3e  eedSync || pPg->
1ac30 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 44 42  pPager->iInUseDB
1ac40 29 20 29 7b 0a 20 20 20 20 20 20 70 50 67 20 3d  ) ){.      pPg =
1ac50 20 70 50 67 2d 3e 67 66 72 65 65 2e 70 4e 65 78   pPg->gfree.pNex
1ac60 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
1ac70 20 21 70 50 67 20 29 7b 0a 20 20 20 20 20 20 70   !pPg ){.      p
1ac80 50 67 20 3d 20 73 71 6c 69 74 65 33 4c 72 75 50  Pg = sqlite3LruP
1ac90 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 3b 0a  ageList.pFirst;.
1aca0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 50 67        while( pPg
1acb0 20 26 26 20 70 50 67 2d 3e 70 50 61 67 65 72 2d   && pPg->pPager-
1acc0 3e 69 49 6e 55 73 65 44 42 20 29 7b 0a 20 20 20  >iInUseDB ){.   
1acd0 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e       pPg = pPg->
1ace0 67 66 72 65 65 2e 70 4e 65 78 74 3b 0a 20 20 20  gfree.pNext;.   
1acf0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
1ad00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1ad10 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ve(sqlite3_mutex
1ad20 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
1ad30 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29  TEX_STATIC_LRU))
1ad40 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 67  ;..    /* If pPg
1ad50 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 62 6c  ==0, then the bl
1ad60 6f 63 6b 20 61 62 6f 76 65 20 68 61 73 20 66 61  ock above has fa
1ad70 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 61 20 70  iled to find a p
1ad80 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65  age to.    ** re
1ad90 63 79 63 6c 65 2e 20 49 6e 20 74 68 69 73 20 63  cycle. In this c
1ada0 61 73 65 20 72 65 74 75 72 6e 20 65 61 72 6c 79  ase return early
1adb0 20 2d 20 6e 6f 20 66 75 72 74 68 65 72 20 6d 65   - no further me
1adc0 6d 6f 72 79 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  mory will.    **
1add0 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
1ade0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
1adf0 67 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  g ) break;..    
1ae00 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1ae10 61 67 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  ager;.    assert
1ae20 28 21 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  (!pPg->needSync 
1ae30 7c 7c 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e  || pPg==pPager->
1ae40 6c 72 75 2e 70 46 69 72 73 74 29 3b 0a 20 20 20  lru.pFirst);.   
1ae50 20 61 73 73 65 72 74 28 70 50 67 2d 3e 6e 65 65   assert(pPg->nee
1ae60 64 53 79 6e 63 20 7c 7c 20 70 50 67 3d 3d 70 50  dSync || pPg==pP
1ae70 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
1ae80 53 79 6e 63 65 64 29 3b 0a 20 20 0a 20 20 20 20  Synced);.  .    
1ae90 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63  rc = pager_recyc
1aea0 6c 65 28 70 50 61 67 65 72 2c 20 26 70 52 65 63  le(pPager, &pRec
1aeb0 79 63 6c 65 64 29 3b 0a 20 20 20 20 61 73 73 65  ycled);.    asse
1aec0 72 74 28 70 52 65 63 79 63 6c 65 64 3d 3d 70 50  rt(pRecycled==pP
1aed0 67 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f  g || rc!=SQLITE_
1aee0 4f 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  OK);.    if( rc=
1aef0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1af00 20 20 20 20 2f 2a 20 57 65 27 76 65 20 66 6f 75      /* We've fou
1af10 6e 64 20 61 20 70 61 67 65 20 74 6f 20 66 72 65  nd a page to fre
1af20 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
1af30 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65   the page has be
1af40 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 6d  en .      ** rem
1af50 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  oved from the pa
1af60 67 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 66  ge hash-table, f
1af70 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e  ree-list and syn
1af80 63 65 64 2d 6c 69 73 74 20 0a 20 20 20 20 20 20  ced-list .      
1af90 2a 2a 20 28 70 46 69 72 73 74 53 79 6e 63 65 64  ** (pFirstSynced
1afa0 29 2e 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69  ). It is still i
1afb0 6e 20 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20  n the all pages 
1afc0 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20  (pAll) list. .  
1afd0 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74      ** Remove it
1afe0 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20   from this list 
1aff0 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a  before freeing..
1b000 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1b010 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68  * Todo: Check th
1b020 65 20 50 61 67 65 72 2e 70 53 74 6d 74 20 6c 69  e Pager.pStmt li
1b030 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  st to make sure 
1b040 74 68 69 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a  this is Ok. It .
1b050 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c        ** probabl
1b060 79 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20 20  y is though..   
1b070 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 48 64     */.      PgHd
1b080 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 61  r *pTmp;.      a
1b090 73 73 65 72 74 28 20 70 50 67 20 29 3b 0a 20 20  ssert( pPg );.  
1b0a0 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61      if( pPg==pPa
1b0b0 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20  ger->pAll ){.   
1b0c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41        pPager->pA
1b0d0 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  ll = pPg->pNextA
1b0e0 6c 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ll;.      }else{
1b0f0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 70 54  .        for( pT
1b100 6d 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  mp=pPager->pAll;
1b110 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21   pTmp->pNextAll!
1b120 3d 70 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d  =pPg; pTmp=pTmp-
1b130 3e 70 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20  >pNextAll ){}.  
1b140 20 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78        pTmp->pNex
1b150 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78  tAll = pPg->pNex
1b160 74 41 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tAll;.      }.  
1b170 20 20 20 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d      nReleased +=
1b180 20 28 0a 20 20 20 20 20 20 20 20 20 20 73 69 7a   (.          siz
1b190 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67  eof(*pPg) + pPag
1b1a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20  er->pageSize.   
1b1b0 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
1b1c0 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  u32) + pPager->n
1b1d0 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20  Extra.          
1b1e0 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50  + MEMDB*sizeof(P
1b1f0 67 48 69 73 74 6f 72 79 29 20 0a 20 20 20 20 20  gHistory) .     
1b200 20 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43   );.      IOTRAC
1b210 45 28 28 22 50 47 46 52 45 45 20 25 70 20 25 64  E(("PGFREE %p %d
1b220 20 2a 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70   *\n", pPager, p
1b230 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
1b240 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
1b250 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65  ite3_pager_pgfre
1b260 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  e_count);.      
1b270 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67  sqlite3_free(pPg
1b280 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
1b290 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 65  >nPage--;.    }e
1b2a0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
1b2b0 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77   error occured w
1b2c0 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
1b2d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b2e0 6c 65 20 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20  le or .      ** 
1b2f0 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72  journal in pager
1b300 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20  _recycle(). The 
1b310 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74  error is not ret
1b320 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20  urned to the .  
1b330 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 6f 66      ** caller of
1b340 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
1b350 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74 68 65  Instead, set the
1b360 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76   Pager.errCode v
1b370 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a  ariable..      *
1b380 2a 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c  * The error will
1b390 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20   be returned to 
1b3a0 74 68 65 20 75 73 65 72 20 28 6f 72 20 75 73 65  the user (or use
1b3b0 72 73 2c 20 69 6e 20 74 68 65 20 63 61 73 65 20  rs, in the case 
1b3c0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73  .      ** of a s
1b3d0 68 61 72 65 64 20 70 61 67 65 72 20 63 61 63 68  hared pager cach
1b3e0 65 29 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e) of the pager 
1b3f0 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 65 72  for which the er
1b400 72 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20 20 20  ror occured..   
1b410 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
1b420 72 74 28 0a 20 20 20 20 20 20 20 20 20 20 28 72  rt(.          (r
1b430 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
1b440 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 20 20 20  IOERR ||.       
1b450 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55     rc==SQLITE_FU
1b460 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  LL ||.          
1b470 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 0a  rc==SQLITE_BUSY.
1b480 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
1b490 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1b4a0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
1b4b0 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20 70 61  RVED );.      pa
1b4c0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
1b4d0 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , rc);.    }.  }
1b4e0 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65  ..  /* Clear the
1b4f0 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65   memory manageme
1b500 6e 74 20 66 6c 61 67 73 20 61 6e 64 20 72 65 6c  nt flags and rel
1b510 65 61 73 65 20 74 68 65 20 6d 75 74 65 78 0a 20  ease the mutex. 
1b520 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 67 65 72   */.  for(pPager
1b530 3d 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73  =sqlite3PagerLis
1b540 74 3b 20 70 50 61 67 65 72 3b 20 70 50 61 67 65  t; pPager; pPage
1b550 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 29  r=pPager->pNext)
1b560 7b 0a 20 20 20 20 20 70 50 61 67 65 72 2d 3e 69  {.     pPager->i
1b570 49 6e 55 73 65 4d 4d 20 3d 20 30 3b 0a 20 20 7d  InUseMM = 0;.  }
1b580 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1b590 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 0a  _leave(mutex);..
1b5a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
1b5b0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1b5c0 72 65 6c 65 61 73 65 64 0a 20 20 2a 2f 0a 20 20  released.  */.  
1b5d0 72 65 74 75 72 6e 20 6e 52 65 6c 65 61 73 65 64  return nReleased
1b5e0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
1b5f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
1b600 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 2a 2f  RY_MANAGEMENT */
1b610 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
1b620 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
1b630 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20   pPg out of the 
1b640 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1b650 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
1b660 64 44 62 50 61 67 65 28 50 61 67 65 72 20 2a 70  dDbPage(Pager *p
1b670 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
1b680 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  g, Pgno pgno){. 
1b690 20 69 6e 74 20 72 63 3b 0a 20 20 69 36 34 20 6f   int rc;.  i64 o
1b6a0 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28  ffset;.  assert(
1b6b0 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 61   MEMDB==0 );.  a
1b6c0 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64  ssert(pPager->fd
1b6d0 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67  ->pMethods||pPag
1b6e0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
1b6f0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64   if( !pPager->fd
1b700 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
1b710 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b720 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
1b730 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d  ;.  }.  offset =
1b740 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
1b750 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1b760 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
1b770 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
1b780 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
1b790 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
1b7a0 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b  geSize, offset);
1b7b0 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
1b7c0 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
1b7d0 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  db_count);.  PAG
1b7e0 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1b7f0 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43  nRead);.  IOTRAC
1b800 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e  E(("PGIN %p %d\n
1b810 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
1b820 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  );.  if( pgno==1
1b830 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   ){.    memcpy(&
1b840 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1b850 72 73 2c 20 26 28 28 75 38 2a 29 50 47 48 44 52  rs, &((u8*)PGHDR
1b860 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 5b 32  _TO_DATA(pPg))[2
1b870 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  4],.            
1b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8a0 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d    sizeof(pPager-
1b8b0 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1b8c0 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67   }.  CODEC1(pPag
1b8d0 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  er, PGHDR_TO_DAT
1b8e0 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e  A(pPg), pPg->pgn
1b8f0 6f 2c 20 33 29 3b 0a 20 20 50 41 47 45 52 54 52  o, 3);.  PAGERTR
1b900 41 43 45 34 28 22 46 45 54 43 48 20 25 64 20 70  ACE4("FETCH %d p
1b910 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
1b920 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
1b930 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
1b940 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
1b950 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1b960 70 50 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  pPg));.  return 
1b970 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
1b980 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1b990 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20  alled to obtain 
1b9a0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
1b9b0 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 0a  required before.
1b9c0 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20 72  ** data may be r
1b9d0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ead from the pag
1b9e0 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65  er cache. If the
1b9f0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 68 61 73   shared lock has
1ba00 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
1ba10 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 69 73 20   obtained, this 
1ba20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1ba30 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64  -op..**.** Immed
1ba40 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74  iately after obt
1ba50 61 69 6e 69 6e 67 20 74 68 65 20 73 68 61 72 65  aining the share
1ba60 64 20 6c 6f 63 6b 20 28 69 66 20 72 65 71 75 69  d lock (if requi
1ba70 72 65 64 29 2c 20 74 68 69 73 20 66 75 6e 63 74  red), this funct
1ba80 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f  ion.** checks fo
1ba90 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
1baa0 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73 20  file. If one is 
1bab0 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65  found, an emerge
1bac0 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  ncy rollback.** 
1bad0 69 73 20 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d  is performed imm
1bae0 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ediately..*/.sta
1baf0 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 68 61  tic int pagerSha
1bb00 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
1bb10 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1bb20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1bb30 69 6e 74 20 69 73 48 6f 74 20 3d 20 30 3b 0a 0a  int isHot = 0;..
1bb40 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
1bb50 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20  abase is opened 
1bb60 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63  for exclusive ac
1bb70 63 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74  cess, has no out
1bb80 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70  standing .  ** p
1bb90 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 61  age references a
1bba0 6e 64 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  nd is in an erro
1bbb0 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73 20  r-state, now is 
1bbc0 74 68 65 20 63 68 61 6e 63 65 20 74 6f 20 63 6c  the chance to cl
1bbd0 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72  ear.  ** the err
1bbe0 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20  or. Discard the 
1bbf0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1bc00 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
1bc10 74 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f  treat any.  ** o
1bc20 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
1bc30 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
1bc40 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d  l..  */.  if( !M
1bc50 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
1bc60 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
1bc70 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
1bc80 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
1bc90 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ode ){.    if( p
1bca0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1bcb0 65 6e 20 29 7b 0a 20 20 20 20 20 20 69 73 48 6f  en ){.      isHo
1bcc0 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 1;.    }.   
1bcd0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1bce0 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
1bcf0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49  ->errCode = SQLI
1bd00 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
1bd10 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
1bd20 20 73 74 69 6c 6c 20 69 6e 20 61 6e 20 65 72 72   still in an err
1bd30 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74  or state, do not
1bd40 20 70 72 6f 63 65 65 64 2e 20 54 68 65 20 65 72   proceed. The er
1bd50 72 6f 72 20 0a 20 20 2a 2a 20 73 74 61 74 65 20  ror .  ** state 
1bd60 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20  will be cleared 
1bd70 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  at some point in
1bd80 20 74 68 65 20 66 75 74 75 72 65 20 77 68 65 6e   the future when
1bd90 20 61 6c 6c 20 70 61 67 65 20 0a 20 20 2a 2a 20   all page .  ** 
1bda0 72 65 66 65 72 65 6e 63 65 73 20 61 72 65 20 64  references are d
1bdb0 72 6f 70 70 65 64 20 61 6e 64 20 74 68 65 20 63  ropped and the c
1bdc0 61 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63  ache can be disc
1bdd0 61 72 64 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  arded..  */.  if
1bde0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1bdf0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
1be00 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
1be10 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  L ){.    return 
1be20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1be30 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
1be40 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
1be50 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73 48 6f 74  _UNLOCK || isHot
1be60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1be70 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
1be80 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 66  er->pVfs;.    if
1be90 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
1bea0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1beb0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20  ->nRef==0 );.   
1bec0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1bed0 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20  noReadlock ){.  
1bee0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1bef0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
1bf00 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
1bf10 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
1bf20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1bf30 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1bf40 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
1bf50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
1bf60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
1bf70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1bf80 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  te>=SHARED_LOCK 
1bf90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  );.      }.  .  
1bfa0 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72      /* If a jour
1bfb0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
1bfc0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
1bfd0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
1bfe0 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  n the.      ** d
1bff0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
1c000 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65  en it either nee
1c010 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
1c020 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e  back or deleted.
1c030 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1c040 69 66 28 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  if( hasHotJourna
1c050 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 69 73 48  l(pPager) || isH
1c060 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ot ){.        /*
1c070 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
1c080 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
1c090 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
1c0a0 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
1c0b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  .        ** impo
1c0c0 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
1c0d0 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
1c0e0 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
1c0f0 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
1c100 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
1c110 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
1c120 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
1c130 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
1c140 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  he.        ** da
1c150 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74  tabase file, det
1c160 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44  ect the RESERVED
1c170 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c   lock, and concl
1c180 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ude that the.   
1c190 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
1c1a0 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
1c1b0 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
1c1c0 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
1c1d0 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20  ling it .       
1c1e0 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20   ** back..      
1c1f0 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a    ** .        **
1c200 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74   Because the int
1c210 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56  ermediate RESERV
1c220 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  ED lock is not r
1c230 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20  equested, the.  
1c240 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
1c250 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74  process will get
1c260 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69   to this point i
1c270 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66  n the code and f
1c280 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  ail to.        *
1c290 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77  * obtain it's ow
1c2a0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1c2b0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1c2c0 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
1c2d0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
1c2e0 61 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c  ager->state<EXCL
1c2f0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
1c300 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1c310 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
1c320 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45  r->fd, EXCLUSIVE
1c330 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
1c340 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c350 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1c360 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
1c370 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1c380 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65       return page
1c390 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
1c3a0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rc);.          }
1c3b0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1c3c0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
1c3d0 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
1c3e0 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 20 20      }. .        
1c3f0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
1c400 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20  nal for reading 
1c410 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51  only.  Return SQ
1c420 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20  LITE_BUSY if.   
1c430 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75       ** we are u
1c440 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  nable to open th
1c450 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
1c460 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1c470 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e      ** The journ
1c480 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
1c490 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
1c4a0 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a  ed itself.  The.
1c4b0 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
1c4c0 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
1c4d0 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65   open unless the
1c4e0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
1c4f0 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20  ile holds.      
1c500 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63    ** a write loc
1c510 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  k, so there is n
1c520 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20  ever any chance 
1c530 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20  of two or more. 
1c540 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
1c550 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  ses opening the 
1c560 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73  journal at the s
1c570 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ame time..      
1c580 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1c590 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
1c5a0 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
1c5b0 61 63 63 65 73 73 2e 20 54 68 69 73 20 69 73 20  access. This is 
1c5c0 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20  because in .    
1c5d0 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65      ** exclusive
1c5e0 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65  -access mode the
1c5f0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1c600 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70   will be kept op
1c610 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  en and.        *
1c620 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20  * possibly used 
1c630 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
1c640 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73  n later on. On s
1c650 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65  ome systems, the
1c660 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 73 54 72  .        ** OsTr
1c670 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73  uncate() call us
1c680 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ed in exclusive-
1c690 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f  access mode also
1c6a0 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
1c6b0 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74    ** a read/writ
1c6c0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20  e file handle.. 
1c6d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1c6e0 20 20 69 66 28 20 21 69 73 48 6f 74 20 29 7b 0a    if( !isHot ){.
1c6f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1c700 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
1c710 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1c720 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
1c730 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1c740 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
1c750 45 58 49 53 54 53 29 20 29 7b 0a 20 20 20 20 20  EXISTS) ){.     
1c760 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20         int fout 
1c770 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
1c780 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f   int f = SQLITE_
1c790 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
1c7a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1c7b0 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
1c7c0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
1c7d0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1c7e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
1c7f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
1c800 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
1c810 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
1c820 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b  >jfd, f, &fout);
1c830 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
1c840 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
1c850 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66  OK || pPager->jf
1c860 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20  d->pMethods );. 
1c870 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66             if( f
1c880 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  out&SQLITE_OPEN_
1c890 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  READONLY ){.    
1c8a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1c8b0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
1c8c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1c8d0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
1c8e0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
1c8f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1c900 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c910 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c920 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1c930 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
1c940 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1c950 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d 53    return ((rc==S
1c960 51 4c 49 54 45 5f 4e 4f 4d 45 4d 7c 7c 72 63 3d  QLITE_NOMEM||rc=
1c970 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
1c980 4d 45 4d 29 3f 72 63 3a 53 51 4c 49 54 45 5f 42  MEM)?rc:SQLITE_B
1c990 55 53 59 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  USY);.        }.
1c9a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1c9b0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
1c9c0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1c9d0 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
1c9e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
1c9f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1ca00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
1ca10 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
1ca20 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
1ca30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
1ca40 20 30 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a   0;. .        /*
1ca50 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
1ca60 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
1ca70 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
1ca80 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
1ca90 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72     ** lock and r
1caa0 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
1cab0 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20  d lock..        
1cac0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
1cad0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
1cae0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
1caf0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1cb00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1cb10 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
1cb20 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
1cb30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1cb40 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
1cb50 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1cb60 53 48 41 52 45 44 20 7c 7c 20 0a 20 20 20 20 20  SHARED || .     
1cb70 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
1cb80 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
1cb90 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50   pPager->state>P
1cba0 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
1cbb0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
1cbc0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
1cbd0 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20  r->pAll ){.     
1cbe0 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
1cbf0 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62  -lock has just b
1cc00 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20  een acquired on 
1cc10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1cc20 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  e.        ** and
1cc30 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61   there are alrea
1cc40 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  dy pages in the 
1cc50 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72  cache (from a pr
1cc60 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 2a  evious.        *
1cc70 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  * read or write 
1cc80 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43  transaction).  C
1cc90 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
1cca0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
1ccb0 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20      ** has been 
1ccc0 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68  modified.  If th
1ccd0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63  e database has c
1cce0 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68  hanged, flush th
1ccf0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 63  e.        ** cac
1cd00 68 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  he..        **. 
1cd10 20 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61         ** Databa
1cd20 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65  se changes is de
1cd30 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e  tected by lookin
1cd40 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65  g at 15 bytes be
1cd50 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20 20  ginning.        
1cd60 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20  ** at offset 24 
1cd70 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
1cd80 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74  The first 4 of t
1cd90 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72  hese 16 bytes ar
1cda0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 33  e.        ** a 3
1cdb0 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68  2-bit counter th
1cdc0 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  at is incremente
1cdd0 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e  d with each chan
1cde0 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  ge.  The.       
1cdf0 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20   ** other bytes 
1ce00 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20  change randomly 
1ce10 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63  with each file c
1ce20 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20  hange when.     
1ce30 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73     ** a codec is
1ce40 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 20   in use..       
1ce50 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   ** .        ** 
1ce60 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73  There is a vanis
1ce70 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61  hingly small cha
1ce80 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67  nce that a chang
1ce90 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20  e will not be . 
1cea0 20 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74         ** detect
1ceb0 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20  ed.  The chance 
1cec0 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64  of an undetected
1ced0 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d   change is so sm
1cee0 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 20  all that.       
1cef0 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65   ** it can be ne
1cf00 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 20  glected..       
1cf10 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
1cf20 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65   dbFileVers[size
1cf30 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
1cf40 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 20  eVers)];.       
1cf50 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1cf60 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
1cf70 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1cf80 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
1cf90 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1cfa0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1cfb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1cfc0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1cfd0 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  >dbSize>0 ){.   
1cfe0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1cff0 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22  "CKVERS %p %d\n"
1d000 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66  , pPager, sizeof
1d010 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a  (dbFileVers)));.
1d020 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1d030 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
1d040 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65  ger->fd, &dbFile
1d050 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
1d060 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20  ileVers), 24);. 
1d070 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1d080 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d090 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1d0a0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   rc;.          }
1d0b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1d0c0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
1d0d0 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20  (dbFileVers, 0, 
1d0e0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
1d0f0 73 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  s));.        }..
1d100 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63          if( memc
1d110 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  mp(pPager->dbFil
1d120 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
1d130 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
1d140 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20  Vers))!=0 ){.   
1d150 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
1d160 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
1d170 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1d180 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1d190 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
1d1a0 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
1d1b0 3e 73 74 61 74 65 3c 3d 50 41 47 45 52 5f 53 48  >state<=PAGER_SH
1d1c0 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ARED );.    if( 
1d1d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
1d1e0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
1d1f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
1d200 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
1d210 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  D;.    }.  }..  
1d220 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d230 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 50  .** Allocate a P
1d240 67 48 64 72 20 6f 62 6a 65 63 74 2e 20 20 20 45  gHdr object.   E
1d250 69 74 68 65 72 20 63 72 65 61 74 65 20 61 20 6e  ither create a n
1d260 65 77 20 6f 6e 65 20 6f 72 20 72 65 75 73 65 0a  ew one or reuse.
1d270 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6f  ** an existing o
1d280 6e 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6f  ne that is not o
1d290 74 68 65 72 77 69 73 65 20 69 6e 20 75 73 65 2e  therwise in use.
1d2a0 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 50 67 48  .**.** A new PgH
1d2b0 64 72 20 73 74 72 75 63 74 75 72 65 20 69 73 20  dr structure is 
1d2c0 63 72 65 61 74 65 64 20 69 66 20 61 6e 79 20 6f  created if any o
1d2d0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1d2e0 61 72 65 0a 2a 2a 20 74 72 75 65 3a 0a 2a 2a 0a  are.** true:.**.
1d2f0 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65 20 68  **     (1)  We h
1d300 61 76 65 20 6e 6f 74 20 65 78 63 65 65 64 65 64  ave not exceeded
1d310 20 6f 75 72 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   our maximum all
1d320 6f 63 61 74 65 64 20 63 61 63 68 65 20 73 69 7a  ocated cache siz
1d330 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 73  e.**          as
1d340 20 73 65 74 20 62 79 20 74 68 65 20 22 50 52 41   set by the "PRA
1d350 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 22 20  GMA cache_size" 
1d360 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20  command..**.**  
1d370 20 20 20 28 32 29 20 20 54 68 65 72 65 20 61 72     (2)  There ar
1d380 65 20 6e 6f 20 75 6e 75 73 65 64 20 50 67 48 64  e no unused PgHd
1d390 72 20 6f 62 6a 65 63 74 73 20 61 76 61 69 6c 61  r objects availa
1d3a0 62 6c 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  ble at this time
1d3b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20  ..**.**     (3) 
1d3c0 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   This is an in-m
1d3d0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
1d3e0 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 54  **.**     (4)  T
1d3f0 68 65 72 65 20 61 72 65 20 6e 6f 20 50 67 48 64  here are no PgHd
1d400 72 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 64  r objects that d
1d410 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 20  o not require a 
1d420 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
1d430 20 20 20 20 66 69 6c 65 20 73 79 6e 63 20 61 6e      file sync an
1d440 64 20 61 20 73 79 6e 63 20 6f 66 20 74 68 65 20  d a sync of the 
1d450 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1d460 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20  currently.**    
1d470 20 20 20 20 20 20 70 72 6f 68 69 62 69 74 65 64        prohibited
1d480 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1d490 65 2c 20 72 65 75 73 65 20 61 6e 20 65 78 69 73  e, reuse an exis
1d4a0 74 69 6e 67 20 50 67 48 64 72 2e 20 20 49 6e 20  ting PgHdr.  In 
1d4b0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 75  other words, reu
1d4c0 73 65 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e  se an.** existin
1d4d0 67 20 50 67 48 64 72 20 69 66 20 61 6c 6c 20 6f  g PgHdr if all o
1d4e0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1d4f0 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
1d500 20 20 20 20 28 31 29 20 20 57 65 20 68 61 76 65      (1)  We have
1d510 20 72 65 61 63 68 65 64 20 6f 72 20 65 78 63 65   reached or exce
1d520 65 64 65 64 20 74 68 65 20 6d 61 78 69 6d 75 6d  eded the maximum
1d530 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20   cache size.**  
1d540 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 20          allowed 
1d550 62 79 20 22 50 52 41 47 4d 41 20 63 61 63 68 65  by "PRAGMA cache
1d560 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20 20 20  _size"..**.**   
1d570 20 20 28 32 29 20 20 54 68 65 72 65 20 69 73 20    (2)  There is 
1d580 61 20 50 67 48 64 72 20 61 76 61 69 6c 61 62 6c  a PgHdr availabl
1d590 65 20 77 69 74 68 20 50 67 48 64 72 2d 3e 6e 52  e with PgHdr->nR
1d5a0 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ef==0.**.**     
1d5b0 28 33 29 20 20 57 65 20 61 72 65 20 6e 6f 74 20  (3)  We are not 
1d5c0 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  in an in-memory 
1d5d0 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20  database.**.**  
1d5e0 20 20 20 28 34 29 20 20 45 69 74 68 65 72 20 74     (4)  Either t
1d5f0 68 65 72 65 20 69 73 20 61 6e 20 61 76 61 69 6c  here is an avail
1d600 61 62 6c 65 20 50 67 48 64 72 20 74 68 61 74 20  able PgHdr that 
1d610 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a  does not need.**
1d620 20 20 20 20 20 20 20 20 20 20 74 6f 20 62 65 20            to be 
1d630 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 6f  synced to disk o
1d640 72 20 65 6c 73 65 20 64 69 73 6b 20 73 79 6e 63  r else disk sync
1d650 69 6e 67 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ing is currently
1d660 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c  .**          all
1d670 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  owed..*/.static 
1d680 69 6e 74 20 70 61 67 65 72 41 6c 6c 6f 63 61 74  int pagerAllocat
1d690 65 50 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  ePage(Pager *pPa
1d6a0 67 65 72 2c 20 50 67 48 64 72 20 2a 2a 70 70 50  ger, PgHdr **ppP
1d6b0 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1d6c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64  QLITE_OK;.  PgHd
1d6d0 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 6e 42  r *pPg;.  int nB
1d6e0 79 74 65 48 64 72 3b 0a 0a 20 20 2f 2a 20 43 72  yteHdr;..  /* Cr
1d6f0 65 61 74 65 20 61 20 6e 65 77 20 50 67 48 64 72  eate a new PgHdr
1d700 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
1d710 6f 75 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 64  our conditions d
1d720 65 66 69 6e 65 64 20 0a 20 20 2a 2a 20 61 62 6f  efined .  ** abo
1d730 76 65 20 61 72 65 20 6d 65 74 3a 20 2a 2f 0a 20  ve are met: */. 
1d740 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61   if( pPager->nPa
1d750 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  ge<pPager->mxPag
1d760 65 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e.   || pPager->
1d770 6c 72 75 2e 70 46 69 72 73 74 3d 3d 30 20 0a 20  lru.pFirst==0 . 
1d780 20 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c    || MEMDB.   ||
1d790 20 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46   (pPager->lru.pF
1d7a0 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 26 26  irstSynced==0 &&
1d7b0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
1d7c0 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  nc).  ){.    if(
1d7d0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 3d   pPager->nPage>=
1d7e0 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 29 7b  pPager->nHash ){
1d7f0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
1d800 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 70  ize_hash_table(p
1d810 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20  Pager,.         
1d820 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35  pPager->nHash<25
1d830 36 20 3f 20 32 35 36 20 3a 20 70 50 61 67 65 72  6 ? 256 : pPager
1d840 2d 3e 6e 48 61 73 68 2a 32 29 3b 0a 20 20 20 20  ->nHash*2);.    
1d850 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 48    if( pPager->nH
1d860 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ash==0 ){.      
1d870 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1d880 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  MEM;.        got
1d890 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65  o pager_allocate
1d8a0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
1d8b0 20 20 7d 0a 20 20 20 20 70 61 67 65 72 4c 65 61    }.    pagerLea
1d8c0 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ve(pPager);.    
1d8d0 6e 42 79 74 65 48 64 72 20 3d 20 73 69 7a 65 6f  nByteHdr = sizeo
1d8e0 66 28 2a 70 50 67 29 20 2b 20 73 69 7a 65 6f 66  f(*pPg) + sizeof
1d8f0 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e  (u32) + pPager->
1d900 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20  nExtra.         
1d910 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a       + MEMDB*siz
1d920 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 3b 0a  eof(PgHistory);.
1d930 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
1d940 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 48  3_malloc( nByteH
1d950 64 72 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67  dr + pPager->pag
1d960 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 61 67  eSize );.    pag
1d970 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
1d980 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20  .    if( pPg==0 
1d990 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1d9a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1d9b0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c    goto pager_all
1d9c0 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  ocate_out;.    }
1d9d0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c  .    memset(pPg,
1d9e0 20 30 2c 20 6e 42 79 74 65 48 64 72 29 3b 0a 20   0, nByteHdr);. 
1d9f0 20 20 20 70 50 67 2d 3e 70 44 61 74 61 20 3d 20     pPg->pData = 
1da00 28 76 6f 69 64 2a 29 28 6e 42 79 74 65 48 64 72  (void*)(nByteHdr
1da10 20 2b 20 28 63 68 61 72 2a 29 70 50 67 29 3b 0a   + (char*)pPg);.
1da20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20      pPg->pPager 
1da30 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50  = pPager;.    pP
1da40 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50  g->pNextAll = pP
1da50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20  ager->pAll;.    
1da60 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70  pPager->pAll = p
1da70 50 67 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  Pg;.    pPager->
1da80 6e 50 61 67 65 2b 2b 3b 0a 20 20 7d 65 6c 73 65  nPage++;.  }else
1da90 7b 0a 20 20 20 20 2f 2a 20 52 65 63 79 63 6c 65  {.    /* Recycle
1daa0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   an existing pag
1dab0 65 20 77 69 74 68 20 61 20 7a 65 72 6f 20 72 65  e with a zero re
1dac0 66 2d 63 6f 75 6e 74 2e 20 2a 2f 0a 20 20 20 20  f-count. */.    
1dad0 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63  rc = pager_recyc
1dae0 6c 65 28 70 50 61 67 65 72 2c 20 26 70 50 67 29  le(pPager, &pPg)
1daf0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1db00 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
1db10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
1db20 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20  OERR_BLOCKED;.  
1db30 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
1db40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1db50 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c     goto pager_al
1db60 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20  locate_out;.    
1db70 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
1db80 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41  ager->state>=SHA
1db90 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
1dba0 61 73 73 65 72 74 28 70 50 67 29 3b 0a 20 20 7d  assert(pPg);.  }
1dbb0 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a  .  *ppPg = pPg;.
1dbc0 0a 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f  .pager_allocate_
1dbd0 6f 75 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  out:.  return rc
1dbe0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1dbf0 73 75 72 65 20 77 65 20 68 61 76 65 20 74 68 65  sure we have the
1dc00 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 20 70   content for a p
1dc10 61 67 65 2e 20 20 49 66 20 74 68 65 20 70 61 67  age.  If the pag
1dc20 65 20 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75  e was.** previou
1dc30 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74  sly acquired wit
1dc40 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20  h noContent==1, 
1dc50 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  then the content
1dc60 20 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69 6e 69   was.** just ini
1dc70 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
1dc80 73 20 69 6e 73 74 65 61 64 20 6f 66 20 62 65 69  s instead of bei
1dc90 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  ng read from dis
1dca0 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20 77 65  k..** But now we
1dcb0 20 6e 65 65 64 20 74 68 65 20 72 65 61 6c 20 64   need the real d
1dcc0 61 74 61 20 6f 66 66 20 6f 66 20 64 69 73 6b 2e  ata off of disk.
1dcd0 20 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 77    So make sure w
1dce0 65 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20 20 52  e.** have it.  R
1dcf0 65 61 64 20 69 74 20 69 6e 20 69 66 20 77 65 20  ead it in if we 
1dd00 64 6f 20 6e 6f 74 20 68 61 76 65 20 69 74 20 61  do not have it a
1dd10 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61 74 69  lready..*/.stati
1dd20 63 20 69 6e 74 20 70 61 67 65 72 5f 67 65 74 5f  c int pager_get_
1dd30 63 6f 6e 74 65 6e 74 28 50 67 48 64 72 20 2a 70  content(PgHdr *p
1dd40 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
1dd50 6e 65 65 64 52 65 61 64 20 29 7b 0a 20 20 20 20  needRead ){.    
1dd60 69 6e 74 20 72 63 20 3d 20 72 65 61 64 44 62 50  int rc = readDbP
1dd70 61 67 65 28 70 50 67 2d 3e 70 50 61 67 65 72 2c  age(pPg->pPager,
1dd80 20 70 50 67 2c 20 70 50 67 2d 3e 70 67 6e 6f 29   pPg, pPg->pgno)
1dd90 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1dda0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ddb0 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d   pPg->needRead =
1ddc0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1ddd0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1dde0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1ddf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1de00 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
1de10 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72   page..**.** A r
1de20 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
1de30 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74  disk file is obt
1de40 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66  ained when the f
1de50 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63 71  irst page is acq
1de60 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20  uired. .** This 
1de70 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f  read lock is dro
1de80 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61  pped when the la
1de90 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
1dea0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  sed..**.** This 
1deb0 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f  routine works fo
1dec0 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65  r any page numbe
1ded0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  r greater than 0
1dee0 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
1def0 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d  se.** file is sm
1df00 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
1df10 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74  equested page, t
1df20 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69  hen no actual di
1df30 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72  sk.** read occur
1df40 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79  s and the memory
1df50 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61   image of the pa
1df60 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
1df70 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f  d to.** all zero
1df80 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61  s.  The extra da
1df90 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
1dfa0 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
1dfb0 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74  initialized.** t
1dfc0 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73  o zeros the firs
1dfd0 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
1dfe0 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
1dff0 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ory..**.** The a
1e000 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74  cquisition might
1e010 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61   fail for severa
1e020 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61  l reasons.  In a
1e030 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20  ll cases,.** an 
1e040 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
1e050 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1e060 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69  ed and *ppPage i
1e070 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
1e080 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
1e090 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
1e0a0 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
1e0b0 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75  outine and Looku
1e0c0 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
1e0d0 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
1e0e0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
1e0f0 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
1e100 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
1e110 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
1e120 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
1e130 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
1e140 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
1e150 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a  ereas Lookup().*
1e160 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30  * just returns 0
1e170 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1e180 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  acquires a read-
1e190 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  lock the first t
1e1a0 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f  ime it.** has to
1e1b0 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64   go to disk, and
1e1c0 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79   could also play
1e1d0 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  back an old jour
1e1e0 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
1e1f0 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75  ..** Since Looku
1e200 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74  p() never goes t
1e210 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72  o disk, it never
1e220 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74   has to deal wit
1e230 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f  h locks.** or jo
1e240 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
1e250 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
1e260 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70 61  is false, the pa
1e270 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
1e280 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72  actually read fr
1e290 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 6e  om disk..** If n
1e2a0 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
1e2b0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1e2c0 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
1e2d0 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  bout the content
1e2e0 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  s.** of the page
1e2f0 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 73   at this time, s
1e300 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61 20 64 69  o do not do a di
1e310 73 6b 20 72 65 61 64 2e 20 20 4a 75 73 74 20 66  sk read.  Just f
1e320 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61  ill in the.** pa
1e330 67 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  ge content with 
1e340 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d 61 72 6b  zeros.  But mark
1e350 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 77   the fact that w
1e360 65 20 68 61 76 65 20 6e 6f 74 20 72 65 61 64 20  e have not read 
1e370 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 62  the.** content b
1e380 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67  y setting the Pg
1e390 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61  Hdr.needRead fla
1e3a0 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c 20 69 66  g.  Later on, if
1e3b0 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65   .** sqlite3Page
1e3c0 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
1e3d0 65 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65 20  ed on this page 
1e3e0 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  or if this routi
1e3f0 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  ne is.** called 
1e400 61 67 61 69 6e 20 77 69 74 68 20 6e 6f 43 6f 6e  again with noCon
1e410 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74 20 6d 65  tent==0, that me
1e420 61 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ans that the con
1e430 74 65 6e 74 20 69 73 20 6e 65 65 64 65 64 0a 2a  tent is needed.*
1e440 2a 20 61 6e 64 20 74 68 65 20 64 69 73 6b 20 72  * and the disk r
1e450 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
1e460 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
1e470 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1e480 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61  gerAcquire(.  Pa
1e490 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
1e4a0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
1e4b0 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
1e4c0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
1e4d0 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
1e4e0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
1e4f0 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
1e500 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
1e510 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
1e520 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
1e530 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
1e540 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20  noContent       
1e550 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
1e560 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74   reading content
1e570 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72   from disk if tr
1e580 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72  ue */.){.  PgHdr
1e590 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b   *pPg;.  int rc;
1e5a0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1e5b0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
1e5c0 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65  _UNLOCK || pPage
1e5d0 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e  r->nRef>0 || pgn
1e5e0 6f 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  o==1 );..  /* Th
1e5f0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e  e maximum page n
1e600 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52  umber is 2^31. R
1e610 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1e620 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20  RUPT if a page. 
1e630 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74   ** number great
1e640 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72  er than this, or
1e650 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65 73   zero, is reques
1e660 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ted..  */.  if( 
1e670 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
1e680 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c  GNO || pgno==0 |
1e690 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
1e6a0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
1e6b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1e6c0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1e6d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
1e6e0 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74  sure we have not
1e6f0 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61   hit any critica
1e700 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a  l errors..  */ .
1e710 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1e720 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65  !=0 );.  *ppPage
1e730 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   = 0;..  /* If t
1e740 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
1e750 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20   page accessed, 
1e760 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45  then get a SHARE
1e770 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  D lock.  ** on t
1e780 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1e790 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  . pagerSharedLoc
1e7a0 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  k() is a no-op i
1e7b0 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61  f .  ** a databa
1e7c0 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  se lock is alrea
1e7d0 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20  dy held..  */.  
1e7e0 72 63 20 3d 20 70 61 67 65 72 53 68 61 72 65 64  rc = pagerShared
1e7f0 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  Lock(pPager);.  
1e800 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e810 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1e820 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
1e830 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
1e840 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
1e850 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  ..  pPg = pager_
1e860 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
1e870 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d  gno);.  if( pPg=
1e880 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
1e890 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
1e8a0 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61  is not in the pa
1e8b0 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
1e8c0 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20 69   int nMax;.    i
1e8d0 6e 74 20 68 3b 0a 20 20 20 20 50 41 47 45 52 5f  nt h;.    PAGER_
1e8e0 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69  INCR(pPager->nMi
1e8f0 73 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  ss);.    rc = pa
1e900 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65 28  gerAllocatePage(
1e910 70 50 61 67 65 72 2c 20 26 70 50 67 29 3b 0a 20  pPager, &pPg);. 
1e920 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e930 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1e940 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
1e950 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20      pPg->pgno = 
1e960 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  pgno;.    assert
1e970 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70 67 6e 6f  ( !MEMDB || pgno
1e980 3e 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  >pPager->stmtSiz
1e990 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  e );.    if( pPa
1e9a0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
1e9b0 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50  && (int)pgno<=pP
1e9c0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1e9d0 20 29 7b 0a 23 69 66 20 30 0a 20 20 20 20 20 20   ){.#if 0.      
1e9e0 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f  sqlite3CheckMemo
1e9f0 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ry(pPager->aInJo
1ea00 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a  urnal, pgno/8);.
1ea10 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 73 73  #endif.      ass
1ea20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1ea30 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
1ea40 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
1ea50 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a   = (pPager->aInJ
1ea60 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26  ournal[pgno/8] &
1ea70 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21   (1<<(pgno&7)))!
1ea80 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  =0;.      pPg->n
1ea90 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
1eaa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
1eab0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
1eac0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
1ead0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
1eae0 0a 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28  ..    makeClean(
1eaf0 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e  pPg);.    pPg->n
1eb00 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46  Ref = 1;.    REF
1eb10 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 20 20  INFO(pPg);..    
1eb20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
1eb30 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1eb40 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20  nExtra>0 ){.    
1eb50 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
1eb60 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61  O_EXTRA(pPg, pPa
1eb70 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  ger), 0, pPager-
1eb80 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a  >nExtra);.    }.
1eb90 20 20 20 20 6e 4d 61 78 20 3d 20 73 71 6c 69 74      nMax = sqlit
1eba0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1ebb0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
1ebc0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1ebd0 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
1ebe0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1ebf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1ec00 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
1ec10 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ec20 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f      }..    /* Po
1ec30 70 75 6c 61 74 65 20 74 68 65 20 70 61 67 65 20  pulate the page 
1ec40 77 69 74 68 20 64 61 74 61 2c 20 65 69 74 68 65  with data, eithe
1ec50 72 20 62 79 20 72 65 61 64 69 6e 67 20 66 72 6f  r by reading fro
1ec60 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  m the database. 
1ec70 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20 62     ** file, or b
1ec80 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e  y setting the en
1ec90 74 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65 72  tire page to zer
1eca0 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  o..    */.    if
1ecb0 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f  ( nMax<(int)pgno
1ecc0 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 28 6e 6f   || MEMDB || (no
1ecd0 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67  Content && !pPag
1ece0 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
1ecf0 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ck) ){.      if(
1ed00 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78   pgno>pPager->mx
1ed10 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
1ed20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1ed30 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  f(pPg);.        
1ed40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1ed50 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LL;.      }.    
1ed60 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
1ed70 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20  O_DATA(pPg), 0, 
1ed80 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1ed90 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  );.      pPg->ne
1eda0 65 64 52 65 61 64 20 3d 20 6e 6f 43 6f 6e 74 65  edRead = noConte
1edb0 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 61  nt && !pPager->a
1edc0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 0a 20  lwaysRollback;. 
1edd0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a       IOTRACE(("Z
1ede0 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERO %p %d\n", pP
1edf0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
1ee00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1ee10 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
1ee20 50 61 67 65 72 2c 20 70 50 67 2c 20 70 67 6e 6f  Pager, pPg, pgno
1ee30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1ee40 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
1ee50 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
1ee60 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1ee70 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d       pPg->pgno =
1ee80 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
1ee90 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1eea0 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  g);.        retu
1eeb0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1eec0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65       pPg->needRe
1eed0 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ad = 0;.    }.. 
1eee0 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 70     /* Link the p
1eef0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
1ef00 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  e hash table */.
1ef10 20 20 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28      h = pgno & (
1ef20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
1ef30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
1ef40 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 67  no!=0 );.    pPg
1ef50 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
1ef60 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a  ager->aHash[h];.
1ef70 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
1ef80 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
1ef90 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  if( pPg->pNextHa
1efa0 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  sh ){.      asse
1efb0 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  rt( pPg->pNextHa
1efc0 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  sh->pPrevHash==0
1efd0 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   );.      pPg->p
1efe0 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
1eff0 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ash = pPg;.    }
1f000 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1f010 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
1f020 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
1f030 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1f040 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  Pg);.#endif.  }e
1f050 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
1f060 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
1f070 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
1f080 63 68 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  che. */.    asse
1f090 72 74 28 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e  rt(pPager->nRef>
1f0a0 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29 3b 0a 20  0 || pgno==1);. 
1f0b0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
1f0c0 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20  ager->nHit);.   
1f0d0 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65 6e 74 20   if( !noContent 
1f0e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1f0f0 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28  ger_get_content(
1f100 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pPg);.      if( 
1f110 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
1f120 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1f130 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 5f  .    }.    page_
1f140 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ref(pPg);.  }.  
1f150 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20  *ppPage = pPg;. 
1f160 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f170 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
1f180 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20  PagerAcquire(.  
1f190 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
1f1a0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1f1b0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
1f1c0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1f1d0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
1f1e0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
1f1f0 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
1f200 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
1f210 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
1f220 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
1f230 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
1f240 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20  t noContent     
1f250 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
1f260 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65  er reading conte
1f270 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20  nt from disk if 
1f280 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  true */.){.  int
1f290 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74 65   rc;.  pagerEnte
1f2a0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20  r(pPager);.  rc 
1f2b0 3d 20 70 61 67 65 72 41 63 71 75 69 72 65 28 70  = pagerAcquire(p
1f2c0 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 70 50  Pager, pgno, ppP
1f2d0 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
1f2e0 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
1f2f0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
1f300 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 63  rc;.}.../*.** Ac
1f310 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
1f320 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
1f330 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
1f340 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
1f350 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
1f360 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
1f370 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1f380 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
1f390 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
1f3a0 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  not in cache..**
1f3b0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
1f3c0 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20  ite3PagerGet(). 
1f3d0 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
1f3e0 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
1f3f0 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
1f400 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73  te3PagerGet() is
1f410 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
1f420 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
1f430 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
1f440 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
1f450 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
1f460 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
1f470 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
1f480 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
1f490 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
1f4a0 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
1f4b0 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
1f4c0 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
1f4d0 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20  ened..*/.DbPage 
1f4e0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f  *sqlite3PagerLoo
1f4f0 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
1f500 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
1f510 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b   PgHdr *pPg = 0;
1f520 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1f530 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
1f540 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20  t( pgno!=0 );.. 
1f550 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
1f560 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
1f570 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1f580 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  UNLOCK ){.    as
1f590 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70  sert( !pPager->p
1f5a0 41 6c 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  All || pPager->e
1f5b0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a  xclusiveMode );.
1f5c0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
1f5d0 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
1f5e0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
1f5f0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
1f600 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
1f610 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
1f620 28 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  (pPg = pager_loo
1f630 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
1f640 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 61 67  ))!=0 ){.    pag
1f650 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a  e_ref(pPg);.  }.
1f660 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
1f670 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ger);.  return p
1f680 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  Pg;.}../*.** Rel
1f690 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  ease a page..**.
1f6a0 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
1f6b0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
1f6c0 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
1f6d0 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
1f6e0 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
1f6f0 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
1f700 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
1f710 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
1f720 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
1f730 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
1f740 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
1f750 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1f760 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
1f770 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ved..*/.int sqli
1f780 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62  te3PagerUnref(Db
1f790 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
1f7a0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1f7b0 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  g->pPager;..  /*
1f7c0 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Decrement the r
1f7d0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
1f7e0 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a  or this page.  *
1f7f0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  /.  assert( pPg-
1f800 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 61 67  >nRef>0 );.  pag
1f810 65 72 45 6e 74 65 72 28 70 50 67 2d 3e 70 50 61  erEnter(pPg->pPa
1f820 67 65 72 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65  ger);.  pPg->nRe
1f830 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70  f--;.  REFINFO(p
1f840 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  Pg);..  CHECK_PA
1f850 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57  GE(pPg);..  /* W
1f860 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
1f870 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
1f880 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20  a page reach 0, 
1f890 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65  call the.  ** de
1f8a0 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64  structor and add
1f8b0 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
1f8c0 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a   freelist..  */.
1f8d0 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
1f8e0 3d 30 20 29 7b 0a 0a 20 20 20 20 6c 72 75 4c 69  =0 ){..    lruLi
1f8f0 73 74 41 64 64 28 70 50 67 29 3b 0a 20 20 20 20  stAdd(pPg);.    
1f900 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
1f910 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20  tructor ){.     
1f920 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
1f930 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65 72  ctor(pPg, pPager
1f940 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1f950 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65   }.  .    /* Whe
1f960 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63  n all pages reac
1f970 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  h the freelist, 
1f980 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f  drop the read lo
1f990 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ck from.    ** t
1f9a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f9b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
1f9c0 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ger->nRef--;.   
1f9d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1f9e0 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20  >nRef>=0 );.    
1f9f0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  if( pPager->nRef
1fa00 3d 3d 30 20 26 26 20 28 21 70 50 61 67 65 72 2d  ==0 && (!pPager-
1fa10 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
1fa20 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
1fa30 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20 20 20  lOff>0) ){.     
1fa40 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
1fa50 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
1fa60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67  .    }.  }.  pag
1fa70 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
1fa80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1fa90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
1faa0 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66  eate a journal f
1fab0 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20  ile for pPager. 
1fac0 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c   There should al
1fad0 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
1fae0 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53  VED.** or EXCLUS
1faf0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1fb00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
1fb10 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1fb20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
1fb30 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1fb40 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e  K if everything.
1fb50 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
1fb60 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61  r code and relea
1fb70 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20  se the.** write 
1fb80 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67  lock if anything
1fb90 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
1fba0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1fbb0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
1fbc0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1fbd0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1fbe0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
1fbf0 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ;.  int flags = 
1fc00 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
1fc10 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
1fc20 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
1fc30 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
1fc40 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ;..  int rc;.  a
1fc50 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
1fc60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1fc70 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1fc80 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73  RESERVED );.  as
1fc90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1fca0 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
1fcb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1fcc0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
1fcd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1fce0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
1fcf0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
1fd00 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1fd10 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65  r);.  pagerLeave
1fd20 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
1fd30 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
1fd40 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
1fd50 72 6f 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ro( pPager->dbSi
1fd60 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 70 61  ze/8 + 1 );.  pa
1fd70 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
1fd80 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1fd90 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  aInJournal==0 ){
1fda0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1fdb0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
1fdc0 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f   failed_to_open_
1fdd0 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20  journal;.  }..  
1fde0 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
1fdf0 46 69 6c 65 20 29 7b 0a 20 20 20 20 66 6c 61 67  File ){.    flag
1fe00 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  s |= (SQLITE_OPE
1fe10 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c  N_DELETEONCLOSE|
1fe20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1fe30 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 7d 65 6c  _JOURNAL);.  }el
1fe40 73 65 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d  se{.    flags |=
1fe50 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   (SQLITE_OPEN_MA
1fe60 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 7d  IN_JOURNAL);.  }
1fe70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1fe80 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
1fe90 54 45 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  TE.  rc = sqlite
1fea0 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20  3JournalOpen(.  
1feb0 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
1fec0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
1fed0 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
1fee0 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
1fef0 50 61 67 65 72 29 0a 20 20 29 3b 0a 23 65 6c 73  Pager).  );.#els
1ff00 65 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  e.  rc = sqlite3
1ff10 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
1ff20 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
1ff30 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
1ff40 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  s, 0);.#endif.  
1ff50 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
1ff60 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
1ff70 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  >jfd->pMethods )
1ff80 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
1ff90 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  nalOff = 0;.  pP
1ffa0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
1ffb0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  = 0;.  pPager->j
1ffc0 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
1ffd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ffe0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
1fff0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
20000 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
20010 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
20020 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
20030 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  0);.    }.    go
20040 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
20050 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20  n_journal;.  }. 
20060 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20070 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67  Open = 1;.  pPag
20080 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
20090 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ed = 0;.  pPager
200a0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
200b0 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
200c0 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  Rollback = 0;.  
200d0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
200e0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
200f0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
20100 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
20110 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61  ode;.    goto fa
20120 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
20130 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  rnal;.  }.  pPag
20140 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
20150 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
20160 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f  ..  rc = writeJo
20170 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
20180 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
20190 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26  >stmtAutoopen &&
201a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
201b0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
201c0 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e  e3PagerStmtBegin
201d0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
201e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
201f0 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
20200 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51 4c  NOMEM && rc!=SQL
20210 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
20220 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
20230 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
20240 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  n(pPager);.    i
20250 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20260 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
20270 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
20280 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
20290 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  c;..failed_to_op
202a0 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71  en_journal:.  sq
202b0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
202c0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->aInJournal);.
202d0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
202e0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75  rnal = 0;.  retu
202f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
20300 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Acquire a write-
20310 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
20320 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20  base.  The lock 
20330 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a  is removed when.
20340 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68  ** the any of th
20350 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70  e following happ
20360 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73  en:.**.**   *  s
20370 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
20380 74 50 68 61 73 65 54 77 6f 28 29 20 69 73 20 63  tPhaseTwo() is c
20390 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
203a0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
203b0 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ack() is called.
203c0 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
203d0 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20  PagerClose() is 
203e0 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
203f0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
20400 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  f() is called to
20410 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61   on every outsta
20420 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nding page..**.*
20430 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61  * The first para
20440 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f  meter to this ro
20450 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74  utine is a point
20460 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70  er to any open p
20470 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  age of the.** da
20480 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
20490 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62  thing changes ab
204a0 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69  out the page - i
204b0 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79  t is used merely
204c0 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61   to.** acquire a
204d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
204e0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
204f0 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61  and as proof tha
20500 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c  t there is.** al
20510 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
20520 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
20530 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  e..**.** The sec
20540 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e  ond parameter in
20550 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68  dicates how much
20560 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
20570 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61  to reserve for a
20580 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
20590 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20  al file-name at 
205a0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
205b0 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74   journal when it
205c0 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a   is created..**.
205d0 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** A journal fil
205e0 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74  e is opened if t
205f0 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  his is not a tem
20600 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f  porary file.  Fo
20610 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66  r temporary.** f
20620 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e  iles, the openin
20630 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g of the journal
20640 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65   file is deferre
20650 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73  d until there is
20660 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65   an.** actual ne
20670 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
20680 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
20690 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
206a0 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73  e is already res
206b0 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e  erved for writin
206c0 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  g, this routine 
206d0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
206e0 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74  * If exFlag is t
206f0 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  rue, go ahead an
20700 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49  d get an EXCLUSI
20710 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  VE lock on the f
20720 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  ile.** immediate
20730 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61  ly instead of wa
20740 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74  iting until we t
20750 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20  ry to flush the 
20760 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65  cache.  The.** e
20770 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64  xFlag is ignored
20780 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
20790 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  n is already act
207a0 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
207b0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 44 62  te3PagerBegin(Db
207c0 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65  Page *pPg, int e
207d0 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20  xFlag){.  Pager 
207e0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
207f0 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
20800 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  = SQLITE_OK;.  p
20810 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
20820 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
20830 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73  ->nRef>0 );.  as
20840 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
20850 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
20860 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
20870 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
20880 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73  SHARED ){.    as
20890 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
208a0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
208b0 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
208c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
208d0 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
208e0 55 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61  USIVE;.      pPa
208f0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
20900 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
20910 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20920 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
20930 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
20940 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
20950 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
20960 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20970 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
20980 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52  te = PAGER_RESER
20990 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  VED;.        if(
209a0 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
209b0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
209c0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
209d0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
209e0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OCK);.        }.
209f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
20a00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20a10 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
20a20 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
20a30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
20a40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20a50 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
20a60 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41  he = 0;.      PA
20a70 47 45 52 54 52 41 43 45 32 28 22 54 52 41 4e 53  GERTRACE2("TRANS
20a80 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41  ACTION %d\n", PA
20a90 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
20aa0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
20ab0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20  ->useJournal && 
20ac0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
20ad0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
20ae0 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
20af0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
20b00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
20b10 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
20b20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70  journalOpen && p
20b30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20b40 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
20b50 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
20b60 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
20b70 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
20b80 73 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20  ss mode last.   
20b90 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64   ** time a (read
20ba0 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73   or write) trans
20bb0 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65  action was succe
20bc0 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65  ssfully conclude
20bd0 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73  d.    ** by this
20be0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73   connection. Ins
20bf0 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67  tead of deleting
20c00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
20c10 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a  e it was .    **
20c20 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 74   kept open and t
20c30 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79  runcated to 0 by
20c40 74 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tes..    */.    
20c50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20c60 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  nRec==0 );.    a
20c70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f  ssert( pPager->o
20c80 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a  rigDbSize==0 );.
20c90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
20ca0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
20cb0 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
20cc0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
20cd0 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65  Pager);.    page
20ce0 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
20cf0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
20d00 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
20d10 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 50 61 67  MallocZero( pPag
20d20 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31  er->dbSize/8 + 1
20d30 20 29 3b 0a 20 20 20 20 70 61 67 65 72 45 6e 74   );.    pagerEnt
20d40 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  er(pPager);.    
20d50 69 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e  if( !pPager->aIn
20d60 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
20d70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
20d80 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
20d90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69       pPager->ori
20da0 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
20db0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  ->dbSize;.      
20dc0 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
20dd0 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
20de0 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
20df0 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
20e00 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72  alOpen || pPager
20e10 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c  ->journalOff>0 |
20e20 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc!=SQLITE_OK 
20e30 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
20e40 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
20e50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
20e60 61 6b 65 20 61 20 70 61 67 65 20 64 69 72 74 79  ake a page dirty
20e70 2e 20 20 53 65 74 20 69 74 73 20 64 69 72 74 79  .  Set its dirty
20e80 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69 74   flag and add it
20e90 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a 2a   to the dirty.**
20ea0 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73   page list..*/.s
20eb0 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 44  tatic void makeD
20ec0 69 72 74 79 28 50 67 48 64 72 20 2a 70 50 67 29  irty(PgHdr *pPg)
20ed0 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  {.  if( pPg->dir
20ee0 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67  ty==0 ){.    Pag
20ef0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
20f00 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50  ->pPager;.    pP
20f10 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20  g->dirty = 1;.  
20f20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
20f30 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a  pPager->pDirty;.
20f40 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
20f50 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  pDirty ){.      
20f60 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e  pPager->pDirty->
20f70 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67  pPrevDirty = pPg
20f80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
20f90 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 30 3b  >pPrevDirty = 0;
20fa0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
20fb0 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d  rty = pPg;.  }.}
20fc0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70  ../*.** Make a p
20fd0 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61  age clean.  Clea
20fe0 72 20 69 74 73 20 64 69 72 74 79 20 62 69 74 20  r its dirty bit 
20ff0 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66 72  and remove it fr
21000 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20  om the.** dirty 
21010 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  page list..*/.st
21020 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c  atic void makeCl
21030 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ean(PgHdr *pPg){
21040 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
21050 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69  y ){.    pPg->di
21060 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rty = 0;.    if(
21070 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a   pPg->pDirty ){.
21080 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
21090 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76  g->pDirty->pPrev
210a0 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20  Dirty==pPg );.  
210b0 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 2d      pPg->pDirty-
210c0 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50  >pPrevDirty = pP
210d0 67 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a 20  g->pPrevDirty;. 
210e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
210f0 2d 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b 0a  ->pPrevDirty ){.
21100 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
21110 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70  g->pPrevDirty->p
21120 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20  Dirty==pPg );.  
21130 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69      pPg->pPrevDi
21140 72 74 79 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  rty->pDirty = pP
21150 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  g->pDirty;.    }
21160 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
21170 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d  rt( pPg->pPager-
21180 3e 70 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a  >pDirty==pPg );.
21190 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
211a0 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d  r->pDirty = pPg-
211b0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  >pDirty;.    }. 
211c0 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   }.}.../*.** Mar
211d0 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73  k a data page as
211e0 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65   writeable.  The
211f0 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
21200 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
21210 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e  l .** if it is n
21220 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
21230 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
21240 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
21250 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20  efore making.** 
21260 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
21270 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
21280 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
21290 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
212a0 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65  the pager create
212b0 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e  s a new.** journ
212c0 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  al and acquires 
212d0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
212e0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
212f0 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56 45    If the RESERVE
21300 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20  D.** lock could 
21310 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c  not be acquired,
21320 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
21330 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53  turns SQLITE_BUS
21340 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  Y.  The.** calli
21350 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  ng routine must 
21360 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72  check for that r
21370 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20  eturn value and 
21380 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  be careful not t
21390 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20  o.** change any 
213a0 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20  page data until 
213b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
213c0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
213d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
213e0 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20  rnal file could 
213f0 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
21400 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20  ecause the disk 
21410 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e  is full,.** then
21420 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
21430 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c  turns SQLITE_FUL
21440 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d  L and does an im
21450 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b  mediate rollback
21460 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75  ..** All subsequ
21470 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70  ent write attemp
21480 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53  ts also return S
21490 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c  QLITE_FULL until
214a0 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63   there.** is a c
214b0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
214c0 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73  gerCommit() or s
214d0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
214e0 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65  ack() to.** rese
214f0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
21500 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48   pager_write(PgH
21510 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64  dr *pPg){.  void
21520 20 2a 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f   *pData = PGHDR_
21530 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
21540 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
21550 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
21560 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21570 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  K;..  /* Check f
21580 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20  or errors.  */. 
21590 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
215a0 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74  Code ){ .    ret
215b0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
215c0 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
215d0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
215e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
215f0 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a  LITE_PERM;.  }..
21600 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
21610 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a  r->setMaster );.
21620 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
21630 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  g);..  /* If thi
21640 73 20 70 61 67 65 20 77 61 73 20 70 72 65 76 69  s page was previ
21650 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77  ously acquired w
21660 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31  ith noContent==1
21670 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a  , that means.  *
21680 2a 20 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c  * we didn't real
21690 6c 79 20 72 65 61 64 20 69 6e 20 74 68 65 20 63  ly read in the c
216a0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
216b0 67 65 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61  ge.  This can ha
216c0 70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65  ppen.  ** (for e
216d0 78 61 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65  xample) when the
216e0 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d   page is being m
216f0 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
21700 6c 69 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20  list.  But.  ** 
21710 6e 6f 77 20 77 65 20 61 72 65 20 28 70 65 72 68  now we are (perh
21720 61 70 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20  aps) moving the 
21730 70 61 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20  page off of the 
21740 66 72 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a  freelist for.  *
21750 2a 20 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e  * reuse and we n
21760 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20  eed to know its 
21770 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74  original content
21780 20 73 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74   so that content
21790 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f  .  ** can be sto
217a0 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  red in the rollb
217b0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f  ack journal.  So
217c0 20 64 6f 20 74 68 65 20 72 65 61 64 20 61 74 20   do the read at 
217d0 74 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a  this.  ** time..
217e0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
217f0 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50  r_get_content(pP
21800 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  g);.  if( rc ){.
21810 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
21820 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
21830 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e  e page as dirty.
21840 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61    If the page ha
21850 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
21860 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
21870 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20  he journal then 
21880 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69  we can return ri
21890 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
218a0 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b   makeDirty(pPg);
218b0 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f  .  if( pPg->inJo
218c0 75 72 6e 61 6c 20 26 26 20 28 70 61 67 65 49 6e  urnal && (pageIn
218d0 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 7c  Statement(pPg) |
218e0 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  | pPager->stmtIn
218f0 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70  Use==0) ){.    p
21900 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
21910 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 1;.  }else{.
21920 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65  .    /* If we ge
21930 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
21940 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
21950 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  ge needs to be. 
21960 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f     ** written to
21970 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
21980 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
21990 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  ckeckpoint journ
219a0 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  al.    ** or bot
219b0 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  h..    **.    **
219c0 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
219d0 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61  see that the tra
219e0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
219f0 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20   exists and.    
21a00 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20  ** create it if 
21a10 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20  it does not..   
21a20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
21a30 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
21a40 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
21a50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
21a60 61 67 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30  agerBegin(pPg, 0
21a70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
21a80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21a90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
21aa0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
21ab0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
21ac0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
21ad0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
21ae0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20  >journalOpen && 
21af0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
21b00 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
21b10 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
21b20 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
21b30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
21b40 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
21b50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
21b60 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
21b70 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67  nalOpen || !pPag
21b80 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
21b90 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  ;.    pPager->di
21ba0 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
21bb0 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e  .    /* The tran
21bc0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
21bd0 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77  now exists and w
21be0 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45  e have a RESERVE
21bf0 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D or an.    ** E
21c00 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
21c10 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
21c20 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  se file.  Write 
21c30 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
21c40 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74   to.    ** the t
21c50 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
21c60 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  al if it is not 
21c70 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
21c80 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
21c90 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
21ca0 20 28 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75   (pPager->useJou
21cb0 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29  rnal || MEMDB) )
21cc0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 74  {.      if( (int
21cd0 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
21ce0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
21cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
21d00 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
21d10 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
21d20 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
21d30 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
21d40 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  ;.          PAGE
21d50 52 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c  RTRACE3("JOURNAL
21d60 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
21d70 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
21d80 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
21d90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
21da0 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29  Hist->pOrig==0 )
21db0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73  ;.          pHis
21dc0 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74  t->pOrig = sqlit
21dd0 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65  e3_malloc( pPage
21de0 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  r->pageSize );. 
21df0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 48           if( !pH
21e00 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20  ist->pOrig ){.  
21e10 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
21e20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
21e30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21e40 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73       memcpy(pHis
21e50 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f  t->pOrig, PGHDR_
21e60 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
21e70 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
21e80 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
21e90 20 20 20 20 20 20 20 20 20 20 75 33 32 20 63 6b            u32 ck
21ea0 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 63  sum;.          c
21eb0 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20  har *pData2;..  
21ec0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68          /* We sh
21ed0 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65  ould never write
21ee0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
21ef0 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68  file the page th
21f00 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  at.          ** 
21f10 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
21f20 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68  abase locks.  Th
21f30 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
21f40 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20  rt verifies.    
21f50 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
21f60 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20   do not. */.    
21f70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
21f80 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  g->pgno!=PAGER_M
21f90 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
21fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 61 74  ;.          pDat
21fb0 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67  a2 = CODEC2(pPag
21fc0 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
21fd0 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
21fe0 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65      cksum = page
21ff0 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
22000 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20  (u8*)pData2);.  
22010 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
22020 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
22030 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
22040 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70  urnalOff, pPg->p
22050 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
22060 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22070 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
22080 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
22090 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
220a0 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
220b0 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
220c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220d0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
220e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
220f0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   4);.           
22100 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22110 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  Off += pPager->p
22120 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20  ageSize+4;.     
22130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22140 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22150 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
22160 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
22170 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
22180 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22190 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20  ff, cksum);.    
221a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
221b0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b  journalOff += 4;
221c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
221d0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
221e0 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64  "JOUT %p %d %lld
221f0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
22200 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
22210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22220 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
22230 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
22240 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ize));.         
22250 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
22260 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
22270 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20  _count);.       
22280 20 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22     PAGERTRACE5("
22290 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
222a0 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68  %d needSync=%d h
222b0 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
222c0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
222d0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
222e0 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
222f0 65 64 53 79 6e 63 2c 20 70 61 67 65 72 5f 70 61  edSync, pager_pa
22300 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a 0a 20  gehash(pPg));.. 
22310 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
22320 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64  rror has occured
22330 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
22340 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
22350 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
22360 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
22370 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
22380 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f  by the layer abo
22390 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ve..          */
223a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
223b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
223c0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
223d0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
223e0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50   }..          pP
223f0 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20  ager->nRec++;.  
22400 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
22410 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
22420 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
22430 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
22440 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f  urnal[pPg->pgno/
22450 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
22460 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20  gno&7);.        
22470 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
22480 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = !pPager->noSyn
22490 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  c;.          if(
224a0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
224b0 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
224c0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
224d0 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
224e0 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
224f0 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  7);.          }.
22500 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22510 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
22520 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
22530 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
22540 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65  tarted && !pPage
22550 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20  r->noSync;.     
22560 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22     PAGERTRACE4("
22570 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
22580 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
22590 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
225a0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
225b0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
225c0 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  g->needSync);.  
225d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
225e0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
225f0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
22600 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
22610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
22620 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
22630 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
22640 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
22650 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
22660 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
22670 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20  s not in it,.   
22680 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
22690 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
226a0 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
226b0 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
226c0 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
226d0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
226e0 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73  l format differs
226f0 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
22700 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
22710 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74  t.    ** in that
22720 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
22730 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
22740 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  header..    */. 
22750 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
22760 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 20 20 26  tmtInUse .     &
22770 26 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65  & !pageInStateme
22780 6e 74 28 70 50 67 29 20 0a 20 20 20 20 20 26 26  nt(pPg) .     &&
22790 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
227a0 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
227b0 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e .    ){.      
227c0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
227d0 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
227e0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
227f0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
22800 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
22810 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
22820 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
22830 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
22840 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
22850 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
22860 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
22870 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
22880 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
22890 63 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c( pPager->pageS
228a0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ize );.        i
228b0 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  f( pHist->pStmt 
228c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
228d0 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  cpy(pHist->pStmt
228e0 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
228f0 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
22900 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
22910 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52   }.        PAGER
22920 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55  TRACE3("STMT-JOU
22930 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
22940 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
22950 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
22960 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64  .        page_ad
22970 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
22980 50 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Pg);.      }else
22990 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6f 66  {.        i64 of
229a0 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 73  fset = pPager->s
229b0 74 6d 74 4e 52 65 63 2a 28 34 2b 70 50 61 67 65  tmtNRec*(4+pPage
229c0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
229d0 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
229e0 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67  a2 = CODEC2(pPag
229f0 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
22a00 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
22a10 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
22a20 74 73 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  ts(pPager->stfd,
22a30 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67   offset, pPg->pg
22a40 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
22a50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22a60 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
22a70 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
22a80 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 44  pPager->stfd, pD
22a90 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
22aa0 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
22ab0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
22ac0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
22ad0 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
22ae0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
22af0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
22b00 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
22b10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
22b20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
22b30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
22b40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
22b50 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b  Pager->stmtNRec+
22b60 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
22b70 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  t( pPager->aInSt
22b80 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  mt!=0 );.       
22b90 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
22ba0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
22bb0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
22bc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
22bd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
22be0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
22bf0 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  ize and return..
22c00 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
22c10 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
22c20 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
22c30 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
22c40 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  ze<(int)pPg->pgn
22c50 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
22c60 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  >dbSize = pPg->p
22c70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d 45  gno;.    if( !ME
22c80 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64  MDB && pPager->d
22c90 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  bSize==PENDING_B
22ca0 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  YTE/pPager->page
22cb0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
22cc0 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a  ager->dbSize++;.
22cd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22ce0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22cf0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
22d00 20 75 73 65 64 20 74 6f 20 6d 61 72 6b 20 61 20   used to mark a 
22d10 64 61 74 61 2d 70 61 67 65 20 61 73 20 77 72 69  data-page as wri
22d20 74 61 62 6c 65 2e 20 49 74 20 75 73 65 73 20 0a  table. It uses .
22d30 2a 2a 20 70 61 67 65 72 5f 77 72 69 74 65 28 29  ** pager_write()
22d40 20 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e   to open a journ
22d50 61 6c 20 66 69 6c 65 20 28 69 66 20 69 74 20 69  al file (if it i
22d60 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
22d70 65 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  en).** and write
22d80 20 74 68 65 20 70 61 67 65 20 2a 70 44 61 74 61   the page *pData
22d90 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
22da0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
22db0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
22dc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
22dd0 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73  pager_write() is
22de0 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75   that this.** fu
22df0 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c  nction also deal
22e00 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  s with the speci
22e10 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20  al case where 2 
22e20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a  or more pages.**
22e30 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65   fit on a single
22e40 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e   disk sector. In
22e50 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63   this case all c
22e60 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73  o-resident pages
22e70 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65  .** must have be
22e80 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
22e90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  e journal file b
22ea0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
22eb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
22ec0 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65  agerWrite(DbPage
22ed0 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e   *pDbPage){.  in
22ee0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
22ef0 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ;..  PgHdr *pPg 
22f00 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67  = pDbPage;.  Pag
22f10 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
22f20 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f  ->pPager;.  Pgno
22f30 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20   nPagePerSector 
22f40 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  = (pPager->secto
22f50 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61  rSize/pPager->pa
22f60 67 65 53 69 7a 65 29 3b 0a 0a 20 20 70 61 67 65  geSize);..  page
22f70 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
22f80 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20    if( !MEMDB && 
22f90 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31  nPagePerSector>1
22fa0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   ){.    Pgno nPa
22fb0 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  geCount;        
22fc0 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
22fd0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
22fe0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
22ff0 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20     Pgno pg1;    
23000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23010 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  First page of th
23020 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
23030 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20  located on. */. 
23040 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20     int nPage;   
23050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23060 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
23070 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20  starting at pg1 
23080 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
23090 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e    int ii;.    in
230a0 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  t needSync = 0;.
230b0 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
230c0 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74  doNotSync flag t
230d0 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63  o 1. This is bec
230e0 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61  ause we cannot a
230f0 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20  llow a journal. 
23100 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20     ** header to 
23110 62 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65  be written betwe
23120 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75  en the pages jou
23130 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20 66  rnaled by this f
23140 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  unction..    */.
23150 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
23160 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30  er->doNotSync==0
23170 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
23180 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a  doNotSync = 1;..
23190 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63      /* This tric
231a0 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62  k assumes that b
231b0 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a  oth the page-siz
231c0 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
231d0 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20  e are.    ** an 
231e0 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66  integer power of
231f0 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69   2. It sets vari
23200 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20  able pg1 to the 
23210 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a  identifier.    *
23220 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  * of the first p
23230 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
23240 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
23250 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   on..    */.    
23260 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e  pg1 = ((pPg->pgn
23270 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65  o-1) & ~(nPagePe
23280 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b  rSector-1)) + 1;
23290 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74  ..    nPageCount
232a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
232b0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
232c0 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
232d0 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  gno>nPageCount )
232e0 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
232f0 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31  (pPg->pgno - pg1
23300 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  )+1;.    }else i
23310 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72  f( (pg1+nPagePer
23320 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43  Sector-1)>nPageC
23330 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
23340 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74  age = nPageCount
23350 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73  +1-pg1;.    }els
23360 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  e{.      nPage =
23370 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b   nPagePerSector;
23380 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
23390 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20  t(nPage>0);.    
233a0 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d  assert(pg1<=pPg-
233b0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65  >pgno);.    asse
233c0 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70  rt((pg1+nPage)>p
233d0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20  Pg->pgno);..    
233e0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
233f0 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ge && rc==SQLITE
23400 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  _OK; ii++){.    
23410 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b    Pgno pg = pg1+
23420 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20  ii;.      PgHdr 
23430 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66  *pPage;.      if
23440 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ( !pPager->aInJo
23450 75 72 6e 61 6c 20 7c 7c 20 70 67 3d 3d 70 50 67  urnal || pg==pPg
23460 2d 3e 70 67 6e 6f 20 7c 7c 20 0a 20 20 20 20 20  ->pgno || .     
23470 20 20 20 20 20 70 67 3e 70 50 61 67 65 72 2d 3e       pg>pPager->
23480 6f 72 69 67 44 62 53 69 7a 65 20 7c 7c 20 21 28  origDbSize || !(
23490 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
234a0 61 6c 5b 70 67 2f 38 5d 26 28 31 3c 3c 28 70 67  al[pg/8]&(1<<(pg
234b0 26 37 29 29 29 0a 20 20 20 20 20 20 29 20 7b 0a  &7))).      ) {.
234c0 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d          if( pg!=
234d0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
234e0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
234f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
23500 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
23510 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
23520 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
23530 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23540 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
23550 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
23560 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
23570 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63   pPage->needSync
23580 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23590 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
235a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
235b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
235c0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
235d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
235e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
235f0 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65  }else if( (pPage
23600 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
23610 70 50 61 67 65 72 2c 20 70 67 29 29 20 29 7b 0a  pPager, pg)) ){.
23620 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
23630 65 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  e->needSync ){. 
23640 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
23650 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
23660 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
23670 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 67      /* If the Pg
23680 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  Hdr.needSync fla
23690 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79  g is set for any
236a0 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70 61   of the nPage pa
236b0 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72  ges .    ** star
236c0 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65  ting at pg1, the
236d0 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  n it needs to be
236e0 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20   set for all of 
236f0 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20  them. Because.  
23700 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20    ** writing to 
23710 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61  any of these nPa
23720 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d  ge pages may dam
23730 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20  age the others, 
23740 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
23750 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e  al file must con
23760 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f  tain sync()ed co
23770 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74  pies of all of t
23780 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  hem.    ** befor
23790 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61  e any of them ca
237a0 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74  n be written out
237b0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
237c0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
237d0 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 29    if( needSync )
237e0 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  {.      for(ii=0
237f0 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 6e 65  ; ii<nPage && ne
23800 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20  edSync; ii++){. 
23810 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50         PgHdr *pP
23820 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
23830 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69  up(pPager, pg1+i
23840 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
23850 70 50 61 67 65 20 29 20 70 50 61 67 65 2d 3e 6e  pPage ) pPage->n
23860 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
23870 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
23880 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  t(pPager->needSy
23890 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nc);.    }..    
238a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
238b0 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a  doNotSync==1 );.
238c0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
238d0 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  tSync = 0;.  }el
238e0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
238f0 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65  er_write(pDbPage
23900 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65  );.  }.  pagerLe
23910 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
23920 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23930 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
23940 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  f the page given
23950 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
23960 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
23970 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c  passed.** to sql
23980 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
23990 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
239a0 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
239b0 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f  f it is ok.** to
239c0 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74   change the cont
239d0 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
239e0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
239f0 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  UG.int sqlite3Pa
23a00 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44  gerIswriteable(D
23a10 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
23a20 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79  eturn pPg->dirty
23a30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
23a40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23a50 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70  VACUUM./*.** Rep
23a60 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lace the content
23a70 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   of a single pag
23a80 65 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72  e with the infor
23a90 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68  mation in the th
23aa0 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ird.** argument.
23ab0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
23ac0 61 67 65 72 4f 76 65 72 77 72 69 74 65 28 50 61  agerOverwrite(Pa
23ad0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
23ae0 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44  o pgno, void *pD
23af0 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
23b00 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  Pg;.  int rc;.. 
23b10 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
23b20 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  er);.  rc = sqli
23b30 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
23b40 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 29 3b  er, pgno, &pPg);
23b50 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
23b60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
23b70 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
23b80 74 65 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  te(pPg);.    if(
23b90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23ba0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 73  {.      memcpy(s
23bb0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
23bc0 74 61 28 70 50 67 29 2c 20 70 44 61 74 61 2c 20  ta(pPg), pData, 
23bd0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
23be0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
23bf0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
23c00 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
23c10 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
23c20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
23c30 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  ndif../*.** A ca
23c40 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
23c50 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
23c60 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  er that it is no
23c70 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a  t necessary to.*
23c80 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f  * write the info
23c90 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20  rmation on page 
23ca0 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20  pPg back to the 
23cb0 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67  disk, even thoug
23cc0 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d  h.** that page m
23cd0 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61  ight be marked a
23ce0 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54  s dirty..**.** T
23cf0 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66  he overlying sof
23d00 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c  tware layer call
23d10 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
23d20 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64  hen all of the d
23d30 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69  ata.** on the gi
23d40 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73  ven page is unus
23d50 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d  ed.  The pager m
23d60 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73  arks the page as
23d70 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61   clean so.** tha
23d80 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65  t it does not ge
23d90 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
23da0 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73  k..**.** Tests s
23db0 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70  how that this op
23dc0 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65  timization, toge
23dd0 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a  ther with the.**
23de0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
23df0 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f  tRollback() belo
23e00 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75  w, more than dou
23e10 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a  ble the speed.**
23e20 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54   of large INSERT
23e30 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20   operations and 
23e40 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70  quadruple the sp
23e50 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c  eed of large DEL
23e60 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ETEs..**.** When
23e70 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
23e80 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65   called, set the
23e90 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
23ea0 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a  flag to true..**
23eb0 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
23ec0 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  s to sqlite3Page
23ed0 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
23ee0 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67  for the same pag
23ef0 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61  e.** will therea
23f00 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e  fter be ignored.
23f10 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
23f20 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70  ary to avoid a p
23f30 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20  roblem.** where 
23f40 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61  a page with data
23f50 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
23f60 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
23f70 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20   one part of.** 
23f80 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  a transaction th
23f90 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  en removed from 
23fa0 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
23fb0 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74  ing a later part
23fc0 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20  .** of the same 
23fd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
23fe0 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20  reused for some 
23ff0 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20  other purpose.  
24000 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69  When it.** is fi
24010 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65  rst added to the
24020 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20   freelist, this 
24030 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
24040 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c  d.  When reused,
24050 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 50  .** the sqlite3P
24060 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
24070 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  () routine is ca
24080 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61 75  lled.  But becau
24090 73 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  se the.** page c
240a0 6f 6e 74 61 69 6e 73 20 63 72 69 74 69 63 61 6c  ontains critical
240b0 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20   data, we still 
240c0 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65 20  need to be sure 
240d0 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65  it gets.** rolle
240e0 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20  d back in spite 
240f0 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  of the sqlite3Pa
24100 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
24110 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  ) call..*/.void 
24120 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
24130 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
24140 62 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20  bPage){.  PgHdr 
24150 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
24160 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
24170 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
24180 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65    if( MEMDB ) re
24190 74 75 72 6e 3b 0a 20 20 70 61 67 65 72 45 6e 74  turn;.  pagerEnt
241a0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  er(pPager);.  pP
241b0 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
241c0 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67  k = 1;.  if( pPg
241d0 2d 3e 64 69 72 74 79 20 26 26 20 21 70 50 61 67  ->dirty && !pPag
241e0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
241f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
24200 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
24210 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20  R_SHARED );.    
24220 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
24230 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67  ze==(int)pPg->pg
24240 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72  no && pPager->or
24250 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d  igDbSize<pPager-
24260 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  >dbSize ){.     
24270 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
24280 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  s is the last pa
24290 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61  ge in the file a
242a0 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
242b0 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64  grown.      ** d
242c0 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uring the curren
242d0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  t transaction, t
242e0 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20  hen do NOT mark 
242f0 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
24300 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e  n..      ** When
24310 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24320 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73  le grows, we mus
24330 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  t make sure that
24340 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20   the last page. 
24350 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69       ** gets wri
24360 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e  tten at least on
24370 63 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64  ce so that the d
24380 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  isk file will be
24390 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20   the correct.   
243a0 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79     ** size. If y
243b0 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  ou do not write 
243c0 74 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68  this page and th
243d0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
243e0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  le.      ** on t
243f0 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20  he disk ends up 
24400 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c  being too small,
24410 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74   that can lead t
24420 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  o database.     
24430 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64   ** corruption d
24440 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74  uring the next t
24450 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
24460 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    */.    }else{.
24470 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
24480 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61  3("DONT_WRITE pa
24490 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
244a0 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
244b0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
244c0 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45     IOTRACE(("CLE
244d0 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  AN %p %d\n", pPa
244e0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
244f0 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
24500 28 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51  (pPg);.#ifdef SQ
24510 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
24520 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65  .      pPg->page
24530 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
24540 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
24550 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  if.    }.  }.  p
24560 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
24570 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  );.}../*.** A ca
24580 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
24590 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
245a0 65 72 20 74 68 61 74 20 69 66 20 61 20 72 6f 6c  er that if a rol
245b0 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a  lback occurs,.**
245c0 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
245d0 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20  sary to restore 
245e0 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65 20  the data on the 
245f0 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68 69  given page.  Thi
24600 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  s.** means that 
24610 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e  the pager does n
24620 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f 72  ot have to recor
24630 64 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  d the given page
24640 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62   in the.** rollb
24650 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ack journal..**.
24660 2a 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f  ** If we have no
24670 74 20 79 65 74 20 61 63 74 75 61 6c 6c 79 20 72  t yet actually r
24680 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
24690 6f 66 20 74 68 69 73 20 70 61 67 65 20 28 69 66  of this page (if
246a0 0a 2a 2a 20 74 68 65 20 50 67 48 64 72 2e 6e 65  .** the PgHdr.ne
246b0 65 64 52 65 61 64 20 66 6c 61 67 20 69 73 20 73  edRead flag is s
246c0 65 74 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f  et) then this ro
246d0 75 74 69 6e 65 20 61 63 74 73 20 61 73 20 61 20  utine acts as a 
246e0 70 72 6f 6d 69 73 65 0a 2a 2a 20 74 68 61 74 20  promise.** that 
246f0 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 6e 65  we will never ne
24700 65 64 20 74 6f 20 72 65 61 64 20 74 68 65 20 70  ed to read the p
24710 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74  age content in t
24720 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 20 73 6f  he future..** so
24730 20 74 68 65 20 6e 65 65 64 52 65 61 64 20 66 6c   the needRead fl
24740 61 67 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65  ag can be cleare
24750 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  d at this point.
24760 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24770 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
24780 6b 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  k(DbPage *pPg){.
24790 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
247a0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
247b0 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
247c0 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
247d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
247e0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
247f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
24800 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20  ournalOpen==0 ) 
24810 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
24820 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
24830 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77  k || pPager->alw
24840 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d  aysRollback || M
24850 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20  EMDB ) return;. 
24860 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
24870 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67  rnal && (int)pPg
24880 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
24890 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
248a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
248b0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->aInJournal!=
248c0 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
248d0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d  >aInJournal[pPg-
248e0 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
248f0 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
24900 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
24910 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 6e   = 1;.    pPg->n
24920 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20  eedRead = 0;.   
24930 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
24940 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
24950 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
24960 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
24970 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
24980 3b 0a 20 20 20 20 7d 0a 20 20 20 20 50 41 47 45  ;.    }.    PAGE
24990 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f  RTRACE3("DONT_RO
249a0 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f  LLBACK page %d o
249b0 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
249c0 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
249d0 65 72 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43  er));.    IOTRAC
249e0 45 28 28 22 47 41 52 42 41 47 45 20 25 70 20 25  E(("GARBAGE %p %
249f0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
24a00 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 7d 0a 20 20  g->pgno)).  }.  
24a10 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
24a20 49 6e 55 73 65 20 0a 20 20 20 26 26 20 21 70 61  InUse .   && !pa
24a30 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50  geInStatement(pP
24a40 67 29 20 0a 20 20 20 26 26 20 28 69 6e 74 29 70  g) .   && (int)p
24a50 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
24a60 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20 29 7b  ->stmtSize .  ){
24a70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
24a80 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
24a90 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50  int)pPg->pgno>pP
24aa0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
24ab0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
24ac0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21  pPager->aInStmt!
24ad0 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
24ae0 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
24af0 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
24b00 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 7d 0a  g->pgno&7);.  }.
24b10 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
24b20 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ger);.}.../*.** 
24b30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
24b40 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d  called to increm
24b50 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65  ent the database
24b60 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75   file change-cou
24b70 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20  nter,.** stored 
24b80 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68  at byte 24 of th
24b90 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f  e pager file..*/
24ba0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
24bb0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
24bc0 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  nter(Pager *pPag
24bd0 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74  er, int isDirect
24be0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48  ){.  PgHdr *pPgH
24bf0 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65  dr;.  u32 change
24c00 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20  _counter;.  int 
24c10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24c20 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
24c30 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
24c40 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70  ){.    /* Open p
24c50 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c  age 1 of the fil
24c60 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a  e for writing. *
24c70 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
24c80 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
24c90 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a  r, 1, &pPgHdr);.
24ca0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
24cb0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
24cc0 63 3b 0a 0a 20 20 20 20 69 66 28 20 21 69 73 44  c;..    if( !isD
24cd0 69 72 65 63 74 20 29 7b 0a 20 20 20 20 20 20 72  irect ){.      r
24ce0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
24cf0 57 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20  Write(pPgHdr);. 
24d00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
24d10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24d20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
24d30 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20  ref(pPgHdr);.   
24d40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
24d50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
24d60 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
24d70 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72  the value just r
24d80 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74  ead and write it
24d90 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34   back to byte 24
24da0 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f  . */.    change_
24db0 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  counter = sqlite
24dc0 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70  3Get4byte((u8*)p
24dd0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
24de0 73 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 5f 63  s);.    change_c
24df0 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75  ounter++;.    pu
24e00 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
24e10 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
24e20 67 48 64 72 29 29 2b 32 34 2c 20 63 68 61 6e 67  gHdr))+24, chang
24e30 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20  e_counter);..   
24e40 20 69 66 28 20 69 73 44 69 72 65 63 74 20 26 26   if( isDirect &&
24e50 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
24e60 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 63  thods ){.      c
24e70 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20  onst void *zBuf 
24e80 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  = PGHDR_TO_DATA(
24e90 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 72  pPgHdr);.      r
24ea0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
24eb0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a  te(pPager->fd, z
24ec0 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Buf, pPager->pag
24ed0 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 7d  eSize, 0);.    }
24ee0 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
24ef0 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65   the page refere
24f00 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  nce. */.    sqli
24f10 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
24f20 67 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67 65  gHdr);.    pPage
24f30 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
24f40 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ne = 1;.  }.  re
24f50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24f60 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
24f70 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
24f80 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a   pager pPager. z
24f90 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
24fa0 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
24fb0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
24fc0 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
24fd0 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
24fe0 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  o the individual
24ff0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
25000 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65  . zMaster may be
25010 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20   NULL, which is 
25020 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e  interpreted as n
25030 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  o master.** jour
25040 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61  nal (a single da
25050 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
25060 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  on)..**.** This 
25070 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
25080 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
25090 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20   is synced, all 
250a0 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74  dirty pages writ
250b0 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61  ten.** to the da
250c0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
250d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
250e0 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e  e synced. The on
250f0 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a  ly thing that.**
25100 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d   remains to comm
25110 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
25120 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  on is to delete 
25130 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25140 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a   (or.** master j
25150 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
25160 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
25170 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
25180 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
25190 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
251a0 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
251b0 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
251c0 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67  to an sqlite3Pag
251d0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
251e0 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
251f0 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75  f parameter nTru
25200 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nc is non-zero, 
25210 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  then the pager f
25220 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
25230 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61   to.** nTrunc pa
25240 67 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65  ges (this is use
25250 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
25260 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a   databases)..*/.
25270 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
25280 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 50  CommitPhaseOne(P
25290 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
252a0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
252b0 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b  r, Pgno nTrunc){
252c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
252d0 54 45 5f 4f 4b 3b 0a 0a 20 20 50 41 47 45 52 54  TE_OK;..  PAGERT
252e0 52 41 43 45 34 28 22 44 41 54 41 42 41 53 45 20  RACE4("DATABASE 
252f0 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d  SYNC: File=%s zM
25300 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d  aster=%s nTrunc=
25310 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50  %d\n", .      pP
25320 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
25330 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63   zMaster, nTrunc
25340 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  );.  pagerEnter(
25350 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 49  pPager);..  /* I
25360 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
25370 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f  memory db, or no
25380 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
25390 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20   written to, or 
253a0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
253b0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
253c0 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  een called, it i
253d0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
253e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
253f0 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate!=PAGER_SYNCE
25400 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70  D && !MEMDB && p
25410 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
25420 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
25430 70 50 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  pPg;..#ifdef SQL
25440 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
25450 43 5f 57 52 49 54 45 0a 20 20 20 20 2f 2a 20 54  C_WRITE.    /* T
25460 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
25470 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
25480 20 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20   be used if all 
25490 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f  of the.    ** fo
254a0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
254b0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
254c0 20 20 20 2b 20 54 68 65 20 66 69 6c 65 2d 73 79     + The file-sy
254d0 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68  stem supports th
254e0 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70  e atomic-write p
254f0 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20  roperty for.    
25500 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f  **      blocks o
25510 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65  f size page-size
25520 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20  , and.    **    
25530 2b 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73  + This commit is
25540 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d   not part of a m
25550 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61  ulti-file transa
25560 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a  ction, and.    *
25570 2a 20 20 20 20 2b 20 45 78 61 63 74 6c 79 20 6f  *    + Exactly o
25580 6e 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  ne page has been
25590 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74   modified and st
255a0 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ore in the journ
255b0 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  al file..    **.
255c0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70      ** If the op
255d0 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
255e0 65 20 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65  e used, then the
255f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
25600 6c 6c 20 6e 65 76 65 72 0a 20 20 20 20 2a 2a 20  ll never.    ** 
25610 62 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 74  be created for t
25620 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
25630 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
25640 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 3d  useAtomicWrite =
25650 20 28 0a 20 20 20 20 20 20 20 20 21 7a 4d 61 73   (.        !zMas
25660 74 65 72 20 26 26 20 0a 20 20 20 20 20 20 20 20  ter && .        
25670 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
25680 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69  ff==jrnlBufferSi
25690 7a 65 28 70 50 61 67 65 72 29 20 26 26 20 0a 20  ze(pPager) && . 
256a0 20 20 20 20 20 20 20 6e 54 72 75 6e 63 3d 3d 30         nTrunc==0
256b0 20 26 26 20 0a 20 20 20 20 20 20 20 20 28 30 3d   && .        (0=
256c0 3d 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20  =pPager->pDirty 
256d0 7c 7c 20 30 3d 3d 70 50 61 67 65 72 2d 3e 70 44  || 0==pPager->pD
256e0 69 72 74 79 2d 3e 70 44 69 72 74 79 29 0a 20 20  irty->pDirty).  
256f0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65    );.    if( use
25700 41 74 6f 6d 69 63 57 72 69 74 65 20 29 7b 0a 20  AtomicWrite ){. 
25710 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
25720 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e  he nRec field in
25730 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25740 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  e. */.      int 
25750 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  offset = pPager-
25760 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69  >journalHdr + si
25770 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
25780 69 63 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ic);.      asser
25790 74 28 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d  t(pPager->nRec==
257a0 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  1);.      rc = w
257b0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
257c0 72 2d 3e 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  r->jfd, offset, 
257d0 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a  pPager->nRec);..
257e0 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
257f0 74 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e  the db file chan
25800 67 65 20 63 6f 75 6e 74 65 72 2e 20 54 68 65 20  ge counter. The 
25810 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77  following call w
25820 69 6c 6c 20 6d 6f 64 69 66 79 0a 20 20 20 20 20  ill modify.     
25830 20 2a 2a 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   ** the in-memor
25840 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
25850 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20 69 6e   of page 1 to in
25860 63 6c 75 64 65 20 74 68 65 20 75 70 64 61 74 65  clude the update
25870 64 0a 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67  d.      ** chang
25880 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68  e counter and th
25890 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20  en write page 1 
258a0 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
258b0 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
258c0 2a 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20  * file. Because 
258d0 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  of the atomic-wr
258e0 69 74 65 20 70 72 6f 70 65 72 74 79 20 6f 66 20  ite property of 
258f0 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79  the host file-sy
25900 73 74 65 6d 2c 20 0a 20 20 20 20 20 20 2a 2a 20  stem, .      ** 
25910 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20  this is safe..  
25920 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
25930 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25940 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
25950 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
25960 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
25970 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
25980 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
25990 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
259a0 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  Create(pPager->j
259b0 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  fd);.    }..    
259c0 69 66 28 20 21 75 73 65 41 74 6f 6d 69 63 57 72  if( !useAtomicWr
259d0 69 74 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ite && rc==SQLIT
259e0 45 5f 4f 4b 20 29 0a 23 65 6e 64 69 66 0a 0a 20  E_OK ).#endif.. 
259f0 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65     /* If a maste
25a00 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
25a10 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ame has already 
25a20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
25a30 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
25a40 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f  al file, then no
25a50 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65   sync is require
25a60 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  d. This happens 
25a70 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a  when it is.    *
25a80 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20  * written, then 
25a90 74 68 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c  the process fail
25aa0 73 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  s to upgrade fro
25ab0 6d 20 61 20 52 45 53 45 52 56 45 44 20 74 6f 20  m a RESERVED to 
25ac0 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
25ad0 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65  IVE lock. The ne
25ae0 78 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63  xt time the proc
25af0 65 73 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d  ess tries to com
25b00 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  mit the.    ** t
25b10 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d  ransaction the m
25b20 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76  -j name will hav
25b30 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  e already been w
25b40 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
25b50 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
25b60 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  setMaster ){.   
25b70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
25b80 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
25b90 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
25ba0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
25bb0 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29  unter(pPager, 0)
25bc0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
25bd0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
25be0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e   sync_exit;.#ifn
25bf0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25c00 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
25c10 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29   if( nTrunc!=0 )
25c20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
25c30 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
25c40 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61   has made the da
25c50 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20  tabase smaller, 
25c60 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20  then all pages. 
25c70 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20         ** being 
25c80 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65  discarded by the
25c90 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74   truncation must
25ca0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
25cb0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
25cc0 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
25cd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
25ce0 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 69  gno i;.        i
25cf0 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52  nt iSkip = PAGER
25d00 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
25d10 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69  ;.        for( i
25d20 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50  =nTrunc+1; i<=pP
25d30 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
25d40 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20  ; i++ ){.       
25d50 20 20 20 69 66 28 20 21 28 70 50 61 67 65 72 2d     if( !(pPager-
25d60 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d  >aInJournal[i/8]
25d70 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29 20 26   & (1<<(i&7))) &
25d80 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20  & i!=iSkip ){.  
25d90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
25da0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
25db0 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29 3b  Pager, i, &pPg);
25dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
25dd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25de0 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
25df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
25e00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
25e10 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ite(pPg);.      
25e20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
25e30 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
25e40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
25e50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
25e60 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
25e70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25e80 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e    } .      }.#en
25e90 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 77  dif.      rc = w
25ea0 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
25eb0 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  l(pPager, zMaste
25ec0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
25ed0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
25ee0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
25ef0 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
25f00 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
25f10 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
25f20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
25f30 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 23 69 66   sync_exit;..#if
25f40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25f50 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
25f60 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b  if( nTrunc!=0 ){
25f70 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
25f80 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
25f90 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29  (pPager, nTrunc)
25fa0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
25fb0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
25fc0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
25fd0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
25fe0 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79   Write all dirty
25ff0 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61   pages to the da
26000 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
26010 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67     pPg = pager_g
26020 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
26030 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  es(pPager);.    
26040 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
26050 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a  _pagelist(pPg);.
26060 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
26070 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77  TE_OK ){.      w
26080 68 69 6c 65 28 20 70 50 67 20 26 26 20 21 70 50  hile( pPg && !pP
26090 67 2d 3e 64 69 72 74 79 20 29 7b 20 70 50 67 20  g->dirty ){ pPg 
260a0 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 20 7d  = pPg->pDirty; }
260b0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
260c0 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 20  Dirty = pPg;.   
260d0 20 20 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69     goto sync_exi
260e0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  t;.    }.    pPa
260f0 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ger->pDirty = 0;
26100 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
26110 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
26120 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
26130 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
26140 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26150 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
26160 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
26170 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20  _flags);.    }. 
26180 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 53     IOTRACE(("DBS
26190 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
261a0 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72 2d  r))..    pPager-
261b0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
261c0 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69  YNCED;.  }else i
261d0 66 28 20 4d 45 4d 44 42 20 26 26 20 6e 54 72 75  f( MEMDB && nTru
261e0 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  nc!=0 ){.    rc 
261f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  = sqlite3PagerTr
26200 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
26210 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e  Trunc);.  }..syn
26220 63 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 72 63  c_exit:.  if( rc
26230 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  ==SQLITE_IOERR_B
26240 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a  LOCKED ){.    /*
26250 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
26260 67 65 63 6f 75 6e 74 65 72 28 29 20 6d 61 79 20  gecounter() may 
26270 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69  attempt to obtai
26280 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 20  n an exclusive. 
26290 20 20 20 20 2a 20 6c 6f 63 6b 20 74 6f 20 73 70      * lock to sp
262a0 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 61 6e  ill the cache an
262b0 64 20 72 65 74 75 72 6e 20 49 4f 45 52 52 5f 42  d return IOERR_B
262c0 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73 69 6e 63  LOCKED. But sinc
262d0 65 20 0a 20 20 20 20 20 2a 20 74 68 65 72 65 20  e .     * there 
262e0 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 65  is no chance the
262f0 20 63 61 63 68 65 20 69 73 20 69 6e 63 6f 6e 73   cache is incons
26300 69 73 74 65 6e 74 2c 20 69 74 27 73 0a 20 20 20  istent, it's.   
26310 20 20 2a 20 62 65 74 74 65 72 20 74 6f 20 72 65    * better to re
26320 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
26330 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  ..     */.    rc
26340 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
26350 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65    }.  pagerLeave
26360 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
26370 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
26380 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e   Commit all chan
26390 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
263a0 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ase and release 
263b0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a  the write lock..
263c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
263d0 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e  mit fails for an
263e0 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c  y reason, a roll
263f0 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20  back attempt is 
26400 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  made.** and an e
26410 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
26420 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63  urned.  If the c
26430 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51  ommit worked, SQ
26440 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
26450 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
26460 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
26470 74 50 68 61 73 65 54 77 6f 28 50 61 67 65 72 20  tPhaseTwo(Pager 
26480 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
26490 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
264a0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
264b0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
264c0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
264d0 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66  rrCode;.  }.  if
264e0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
264f0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
26500 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
26510 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
26520 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
26530 65 72 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  er);.  PAGERTRAC
26540 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22  E2("COMMIT %d\n"
26550 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
26560 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
26570 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  ){.    pPg = pag
26580 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
26590 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a  _pages(pPager);.
265a0 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 29      while( pPg )
265b0 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
265c0 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
265d0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
265e0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 63 6c 65  ager);.      cle
265f0 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29  arHistory(pHist)
26600 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72  ;.      pPg->dir
26610 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ty = 0;.      pP
26620 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
26630 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69  ;.      pHist->i
26640 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
26650 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
26660 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d   0;.      pHist-
26670 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69  >pPrevStmt = pHi
26680 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  st->pNextStmt = 
26690 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70  0;.      pPg = p
266a0 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
266b0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  }.    pPager->pD
266c0 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65  irty = 0;.#ifnde
266d0 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72  f NDEBUG.    for
266e0 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
266f0 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
26700 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
26710 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
26720 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
26730 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
26740 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
26750 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
26760 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ack );.      ass
26770 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72  ert( !pHist->pOr
26780 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ig );.      asse
26790 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d  rt( !pHist->pStm
267a0 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  t );.    }.#endi
267b0 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  f.    pPager->pS
267c0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  tmt = 0;.    pPa
267d0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
267e0 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72  ER_SHARED;.    r
267f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26800 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
26810 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
26820 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64  en || !pPager->d
26830 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20 61  irtyCache );.  a
26840 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
26850 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
26860 45 44 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64  ED || !pPager->d
26870 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20 72  irtyCache );.  r
26880 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
26890 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
268a0 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
268b0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
268c0 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
268d0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
268e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
268f0 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e  ollback all chan
26900 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62 61  ges.  The databa
26910 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f  se falls back to
26920 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f   PAGER_SHARED mo
26930 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65  de..** All in-me
26940 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73  mory cache pages
26950 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72   revert to their
26960 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63   original data c
26970 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20  ontents..** The 
26980 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74  journal is delet
26990 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
269a0 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61  outine cannot fa
269b0 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  il unless some o
269c0 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
269d0 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  not following.**
269e0 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63   the correct loc
269f0 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f 72  king protocol or
26a00 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
26a10 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  er.** process is
26a20 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69   writing trash i
26a30 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
26a40 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52  file (SQLITE_COR
26a50 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65  RUPT) or.** unle
26a60 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f  ss a prior mallo
26a70 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49  c() failed (SQLI
26a80 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72  TE_NOMEM).  Appr
26a90 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a  opriate error.**
26aa0 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72   codes are retur
26ab0 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ned for all thes
26ac0 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74  e occasions.  Ot
26ad0 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49  herwise,.** SQLI
26ae0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
26af0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
26b00 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50  3PagerRollback(P
26b10 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
26b20 20 69 6e 74 20 72 63 3b 0a 20 20 50 41 47 45 52   int rc;.  PAGER
26b30 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b  TRACE2("ROLLBACK
26b40 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
26b50 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
26b60 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48  MEMDB ){.    PgH
26b70 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  dr *p;.    for(p
26b80 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
26b90 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29  ; p=p->pNextAll)
26ba0 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
26bb0 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20  y *pHist;.      
26bc0 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61  assert( !p->alwa
26bd0 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  ysRollback );.  
26be0 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74      if( !p->dirt
26bf0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  y ){.        ass
26c00 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72  ert( !((PgHistor
26c10 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53  y *)PGHDR_TO_HIS
26c20 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70  T(p, pPager))->p
26c30 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20  Orig );.        
26c40 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73  assert( !((PgHis
26c50 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f  tory *)PGHDR_TO_
26c60 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29  HIST(p, pPager))
26c70 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  ->pStmt );.     
26c80 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
26c90 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73     }..      pHis
26ca0 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
26cb0 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  T(p, pPager);.  
26cc0 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
26cd0 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Orig ){.        
26ce0 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
26cf0 44 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e  DATA(p), pHist->
26d00 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70  pOrig, pPager->p
26d10 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
26d20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 52    PAGERTRACE3("R
26d30 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 20  OLLBACK-PAGE %d 
26d40 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e  of %d\n", p->pgn
26d50 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
26d60 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r));.      }else
26d70 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  {.        PAGERT
26d80 52 41 43 45 33 28 22 50 41 47 45 20 25 64 20 69  RACE3("PAGE %d i
26d90 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22  s clean on %d\n"
26da0 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  , p->pgno, PAGER
26db0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
26dc0 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72     }.      clear
26dd0 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a  History(pHist);.
26de0 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d        p->dirty =
26df0 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a   0;.      p->inJ
26e00 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
26e10 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20    pHist->inStmt 
26e20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74  = 0;.      pHist
26e30 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48  ->pPrevStmt = pH
26e40 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  ist->pNextStmt =
26e50 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   0;.      if( pP
26e60 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
26e70 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
26e80 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 2c 20  r->xReiniter(p, 
26e90 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
26ea0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
26eb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
26ec0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  rty = 0;.    pPa
26ed0 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
26ee0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
26ef0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  ze = pPager->ori
26f00 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 70 61 67  gDbSize;.    pag
26f10 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
26f20 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  e(pPager);.    p
26f30 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
26f40 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
26f50 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
26f60 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75  SHARED;.    retu
26f70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
26f80 7d 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  }..  pagerEnter(
26f90 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21  pPager);.  if( !
26fa0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
26fb0 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a  he || !pPager->j
26fc0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
26fd0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
26fe0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
26ff0 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 4c  ger);.    pagerL
27000 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
27010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
27020 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
27030 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
27040 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
27050 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69  TE_FULL ){.    i
27060 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
27070 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
27080 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  E ){.      pager
27090 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
270a0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
270b0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
270c0 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  r);.    return p
270d0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
270e0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
270f0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
27100 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69  ESERVED ){.    i
27110 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d  nt rc2;.    rc =
27120 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
27130 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
27140 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f  rc2 = pager_end_
27150 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
27160 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
27170 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27180 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
27190 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
271a0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
271b0 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
271c0 0a 20 20 7d 0a 20 20 2f 2a 20 70 61 67 65 72 5f  .  }.  /* pager_
271d0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 20 2a  reset(pPager); *
271e0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
271f0 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49  ze = -1;..  /* I
27200 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
27210 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42  s during a ROLLB
27220 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c  ACK, we can no l
27230 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20  onger trust the 
27240 70 61 67 65 72 0a 20 20 2a 2a 20 63 61 63 68 65  pager.  ** cache
27250 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f  . So call pager_
27260 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77  error() on the w
27270 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61  ay out to make a
27280 6e 79 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70  ny error .  ** p
27290 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a  ersistent..  */.
272a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
272b0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
272c0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
272d0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
272e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
272f0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64  rn TRUE if the d
27300 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
27310 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79  opened read-only
27320 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a  .  Return FALSE.
27330 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ** if the databa
27340 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79  se is (in theory
27350 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69  ) writable..*/.i
27360 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
27370 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20  sreadonly(Pager 
27380 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
27390 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  rn pPager->readO
273a0 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nly;.}../*.** Re
273b0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
273c0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
273d0 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69   the pager..*/.i
273e0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
273f0 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  efcount(Pager *p
27400 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
27410 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d   pPager->nRef;.}
27420 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
27430 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TEST./*.** This 
27440 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
27450 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
27460 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
27470 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61  /.int *sqlite3Pa
27480 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a  gerStats(Pager *
27490 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69  pPager){.  stati
274a0 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61  c int a[11];.  a
274b0 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  [0] = pPager->nR
274c0 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61  ef;.  a[1] = pPa
274d0 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b  ger->nPage;.  a[
274e0 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50  2] = pPager->mxP
274f0 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50  age;.  a[3] = pP
27500 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
27510 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73  a[4] = pPager->s
27520 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70  tate;.  a[5] = p
27530 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
27540 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d    a[6] = pPager-
27550 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20  >nHit;.  a[7] = 
27560 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20  pPager->nMiss;. 
27570 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55   a[8] = 0;  /* U
27580 73 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72  sed to be pPager
27590 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39  ->nOvfl */.  a[9
275a0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61  ] = pPager->nRea
275b0 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61  d;.  a[10] = pPa
275c0 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72  ger->nWrite;.  r
275d0 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69  eturn a;.}.#endi
275e0 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  f../*.** Set the
275f0 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62   statement rollb
27600 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a  ack point..**.**
27610 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
27620 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77  ould be called w
27630 69 74 68 20 74 68 65 20 74 72 61 6e 73 61 63 74  ith the transact
27640 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65  ion journal alre
27650 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20  ady.** open.  A 
27660 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  new statement jo
27670 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64  urnal is created
27680 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
27690 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  d to rollback.**
276a0 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69   changes of a si
276b0 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64  ngle SQL command
276c0 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72   within a larger
276d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
276e0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
276f0 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72  rStmtBegin(Pager
27700 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
27710 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21   rc;.  assert( !
27720 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
27730 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
27740 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
27750 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
27760 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27770 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 50  dbSize>=0 );.  P
27780 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54  AGERTRACE2("STMT
27790 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41  -BEGIN %d\n", PA
277a0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
277b0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
277c0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
277d0 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  nUse = 1;.    pP
277e0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
277f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
27800 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
27810 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
27820 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
27830 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61  lOpen ){.    pPa
27840 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
27850 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  n = 1;.    retur
27860 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
27870 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27880 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
27890 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
278a0 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74  Pager);.  assert
278b0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
278c0 74 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72  t==0 );.  pPager
278d0 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69  ->aInStmt = sqli
278e0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70  te3MallocZero( p
278f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
27900 2b 20 31 20 29 3b 0a 20 20 70 61 67 65 72 45 6e  + 1 );.  pagerEn
27910 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
27920 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  f( pPager->aInSt
27930 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  mt==0 ){.    /* 
27940 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
27950 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
27960 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72  _LOCK); */.    r
27970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
27980 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  EM;.  }.#ifndef 
27990 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71  NDEBUG.  rc = sq
279a0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
279b0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
279c0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29  ager->stmtJSize)
279d0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
279e0 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69  o stmt_begin_fai
279f0 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  led;.  assert( p
27a00 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
27a10 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   == pPager->jour
27a20 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66  nalOff );.#endif
27a30 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  .  pPager->stmtJ
27a40 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a  Size = pPager->j
27a50 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61  ournalOff;.  pPa
27a60 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
27a70 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
27a80 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64    pPager->stmtHd
27a90 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  rOff = 0;.  pPag
27aa0 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20  er->stmtCksum = 
27ab0 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
27ac0 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  t;.  if( !pPager
27ad0 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
27ae0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
27af0 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
27b00 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
27b10 2d 3e 73 74 66 64 2c 20 70 50 61 67 65 72 2d 3e  ->stfd, pPager->
27b20 7a 53 74 6d 74 4a 72 6e 6c 2c 0a 20 20 20 20 20  zStmtJrnl,.     
27b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b40 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
27b50 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29  OPEN_SUBJOURNAL)
27b60 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
27b70 20 20 20 20 20 20 67 6f 74 6f 20 73 74 6d 74 5f        goto stmt_
27b80 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
27b90 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
27ba0 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  stmtOpen = 1;.  
27bb0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
27bc0 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  ec = 0;.  }.  pP
27bd0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
27be0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
27bf0 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f  LITE_OK;. .stmt_
27c00 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20  begin_failed:.  
27c10 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  if( pPager->aInS
27c20 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tmt ){.    sqlit
27c30 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
27c40 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50  aInStmt);.    pP
27c50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
27c60 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
27c70 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
27c80 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28  3PagerStmtBegin(
27c90 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
27ca0 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65    int rc;.  page
27cb0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
27cc0 20 20 72 63 20 3d 20 70 61 67 65 72 53 74 6d 74    rc = pagerStmt
27cd0 42 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20  Begin(pPager);. 
27ce0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
27cf0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
27d00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
27d10 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  t a statement..*
27d20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
27d30 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 50 61 67  erStmtCommit(Pag
27d40 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70  er *pPager){.  p
27d50 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
27d60 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
27d70 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
27d80 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
27d90 4e 65 78 74 3b 0a 20 20 20 20 50 41 47 45 52 54  Next;.    PAGERT
27da0 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d  RACE2("STMT-COMM
27db0 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
27dc0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
27dd0 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
27de0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73      /* sqlite3Os
27df0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
27e00 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20  >stfd, 0); */.  
27e10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
27e20 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
27e30 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  t );.      pPage
27e40 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a  r->aInStmt = 0;.
27e50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27e60 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
27e70 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67  >pStmt; pPg; pPg
27e80 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  =pNext){.       
27e90 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
27ea0 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
27eb0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
27ec0 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20          pNext = 
27ed0 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74  pHist->pNextStmt
27ee0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
27ef0 28 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20  ( pHist->inStmt 
27f00 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
27f10 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
27f20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72        pHist->pPr
27f30 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e  evStmt = pHist->
27f40 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
27f50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
27f60 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
27f70 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
27f80 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
27f90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
27fa0 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
27fb0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
27fc0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
27fd0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
27fe0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 0;.  }.  pPa
27ff0 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
28000 6e 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 4c 65  n = 0;.  pagerLe
28010 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
28020 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28030 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
28040 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ck a statement..
28050 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
28060 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28  gerStmtRollback(
28070 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
28080 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65    int rc;.  page
28090 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
280a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
280b0 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50  mtInUse ){.    P
280c0 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54  AGERTRACE2("STMT
280d0 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  -ROLLBACK %d\n",
280e0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
280f0 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  );.    if( MEMDB
28100 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
28110 2a 70 50 67 3b 0a 20 20 20 20 20 20 50 67 48 69  *pPg;.      PgHi
28120 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20  story *pHist;.  
28130 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
28140 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20  er->pStmt; pPg; 
28150 70 50 67 3d 70 48 69 73 74 2d 3e 70 4e 65 78 74  pPg=pHist->pNext
28160 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 70  Stmt){.        p
28170 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
28180 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
28190 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
281a0 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  Hist->pStmt ){. 
281b0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
281c0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
281d0 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  g), pHist->pStmt
281e0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
281f0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ze);.          s
28200 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69 73  qlite3_free(pHis
28210 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
28220 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
28230 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
28240 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
28250 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
28260 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
28270 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 74 72  ;.      pager_tr
28280 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61  uncate_cache(pPa
28290 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ger);.      rc =
282a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
282b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
282c0 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61  = pager_stmt_pla
282d0 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
282e0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
282f0 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28  PagerStmtCommit(
28300 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
28310 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
28320 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
28330 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
28340 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 4c 65 61   = 0;.  pagerLea
28350 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
28360 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28370 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
28380 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
28390 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
283a0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
283b0 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
283c0 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
283d0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
283e0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b  ager->zFilename;
283f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
28400 20 74 68 65 20 56 46 53 20 73 74 72 75 63 74 75   the VFS structu
28410 72 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  re for the pager
28420 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74  ..*/.const sqlit
28430 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50  e3_vfs *sqlite3P
28440 61 67 65 72 56 66 73 28 50 61 67 65 72 20 2a 70  agerVfs(Pager *p
28450 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
28460 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d   pPager->pVfs;.}
28470 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
28480 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66  he file handle f
28490 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
284a0 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a  file associated.
284b0 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ** with the page
284c0 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 72  r.  This might r
284d0 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
284e0 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f  e file has.** no
284f0 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
28500 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69  d..*/.sqlite3_fi
28510 6c 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  le *sqlite3Pager
28520 46 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  File(Pager *pPag
28530 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
28540 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a  ager->fd;.}../*.
28550 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69  ** Return the di
28560 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64  rectory of the d
28570 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
28580 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
28590 69 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65  ite3PagerDirname
285a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
285b0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
285c0 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a  ->zDirectory;.}.
285d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
285e0 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
285f0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
28600 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
28610 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
28620 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65  Journalname(Page
28630 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
28640 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  turn pPager->zJo
28650 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urnal;.}../*.** 
28660 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66  Return true if f
28670 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65  sync() calls are
28680 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68   disabled for th
28690 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72  is pager.  Retur
286a0 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73  n FALSE.** if fs
286b0 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75  ync()s are execu
286c0 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f  ted normally..*/
286d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
286e0 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  rNosync(Pager *p
286f0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
28700 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b   pPager->noSync;
28710 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
28720 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a  E_HAS_CODEC./*.*
28730 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20  * Set the codec 
28740 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a  for this pager.*
28750 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
28760 67 65 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50  gerSetCodec(.  P
28770 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20  ager *pPager,.  
28780 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
28790 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
287a0 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70  ,int),.  void *p
287b0 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50  CodecArg.){.  pP
287c0 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78  ager->xCodec = x
287d0 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d  Codec;.  pPager-
287e0 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f  >pCodecArg = pCo
287f0 64 65 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66  decArg;.}.#endif
28800 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
28810 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
28820 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
28830 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61  page pPg to loca
28840 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65  tion pgno in the
28850 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68   file. .**.** Th
28860 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72  ere must be no r
28870 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
28880 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79   page previously
28890 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20 70   located at.** p
288a0 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63 61  gno (which we ca
288b0 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75 67  ll pPgOld) thoug
288c0 68 20 74 68 61 74 20 70 61 67 65 20 69 73 20 61  h that page is a
288d0 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20  llowed to be.** 
288e0 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74 68  in cache.  If th
288f0 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 20  e page previous 
28900 6c 6f 63 61 74 65 64 20 61 74 20 70 67 6e 6f 20  located at pgno 
28910 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
28920 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  * in the rollbac
28930 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73  k journal, it is
28940 20 6e 6f 74 20 70 75 74 20 74 68 65 72 65 20 62   not put there b
28950 79 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  y by this routin
28960 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e  e..**.** Referen
28970 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
28980 70 50 67 20 72 65 6d 61 69 6e 20 76 61 6c 69 64  pPg remain valid
28990 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a  . Updating any.*
289a0 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f  * meta-data asso
289b0 63 69 61 74 65 64 20 77 69 74 68 20 70 50 67 20  ciated with pPg 
289c0 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65  (i.e. data store
289d0 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20  d in the nExtra 
289e0 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74  bytes.** allocat
289f0 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
28a00 65 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72  e page) is the r
28a10 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
28a20 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
28a30 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** A transaction
28a40 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20   must be active 
28a50 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
28a60 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20  e is called. It 
28a70 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65  used to be.** re
28a80 71 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74  quired that a st
28a90 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
28aa0 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69  ion was not acti
28ab0 76 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73  ve, but this res
28ac0 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  triction.** has 
28ad0 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52  been removed (CR
28ae0 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73  EATE INDEX needs
28af0 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20   to move a page 
28b00 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  when a statement
28b10 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
28b20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69  is active)..*/.i
28b30 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
28b40 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70  ovepage(Pager *p
28b50 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70  Pager, DbPage *p
28b60 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Pg, Pgno pgno){.
28b70 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b    PgHdr *pPgOld;
28b80 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62 65    /* The page be
28b90 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
28ba0 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50   */.  int h;.  P
28bb0 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  gno needSyncPgno
28bc0 20 3d 20 30 3b 0a 0a 20 20 70 61 67 65 72 45 6e   = 0;..  pagerEn
28bd0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 61  ter(pPager);.  a
28be0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
28bf0 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45 52 54 52  >0 );..  PAGERTR
28c00 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61  ACE5("MOVE %d pa
28c10 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d  ge %d (needSync=
28c20 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c  %d) moves to %d\
28c30 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52  n", .      PAGER
28c40 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
28c50 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
28c60 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20 20 49  Sync, pgno);.  I
28c70 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70  OTRACE(("MOVE %p
28c80 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %d %d\n", pPage
28c90 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67  r, pPg->pgno, pg
28ca0 6e 6f 29 29 0a 0a 20 20 70 61 67 65 72 5f 67 65  no))..  pager_ge
28cb0 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a  t_content(pPg);.
28cc0 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
28cd0 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65 64 53  ync ){.    needS
28ce0 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  yncPgno = pPg->p
28cf0 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  gno;.    assert(
28d00 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
28d10 7c 7c 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50 61  || (int)pgno>pPa
28d20 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
28d30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
28d40 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20  Pg->dirty );.   
28d50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
28d60 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d  >needSync );.  }
28d70 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50  ..  /* Unlink pP
28d80 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  g from it's hash
28d90 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69  -chain */.  unli
28da0 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67  nkHashChain(pPag
28db0 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  er, pPg);..  /* 
28dc0 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e  If the cache con
28dd0 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74  tains a page wit
28de0 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67  h page-number pg
28df0 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20  no, remove it.  
28e00 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73  ** from it's has
28e10 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69  h chain. Also, i
28e20 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  f the PgHdr.need
28e30 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72  Sync was set for
28e40 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f   .  ** page pgno
28e50 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76   before the 'mov
28e60 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74  e' operation, it
28e70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74   needs to be ret
28e80 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20  ained .  ** for 
28e90 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74  the page moved t
28ea0 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  here..  */.  pPg
28eb0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
28ec0 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72    pPgOld = pager
28ed0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
28ee0 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
28ef0 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Old ){.    asser
28f00 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d  t( pPgOld->nRef=
28f10 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b  =0 );.    unlink
28f20 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
28f30 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d  , pPgOld);.    m
28f40 61 6b 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29  akeClean(pPgOld)
28f50 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53  ;.    pPg->needS
28f60 79 6e 63 20 3d 20 70 50 67 4f 6c 64 2d 3e 6e 65  ync = pPgOld->ne
28f70 65 64 53 79 6e 63 3b 0a 20 20 7d 65 6c 73 65 7b  edSync;.  }else{
28f80 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79  .    pPg->needSy
28f90 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  nc = 0;.  }.  if
28fa0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
28fb0 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e  rnal && (int)pgn
28fc0 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  o<=pPager->origD
28fd0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 70 50 67  bSize ){.    pPg
28fe0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 20 28  ->inJournal =  (
28ff0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
29000 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c  al[pgno/8] & (1<
29010 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a  <(pgno&7)))!=0;.
29020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67    }else{.    pPg
29030 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
29040 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
29050 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 7c 7c  ->needSync==0 ||
29060 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65   (int)pgno>pPage
29070 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
29080 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67  .  }..  /* Chang
29090 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
290a0 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e  r for pPg and in
290b0 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
290c0 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e   new hash-chain.
290d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 67   */.  assert( pg
290e0 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e  no!=0 );.  pPg->
290f0 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68  pgno = pgno;.  h
29100 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65   = pgno & (pPage
29110 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69  r->nHash-1);.  i
29120 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  f( pPager->aHash
29130 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72  [h] ){.    asser
29140 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
29150 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  [h]->pPrevHash==
29160 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
29170 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76  >aHash[h]->pPrev
29180 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  Hash = pPg;.  }.
29190 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
291a0 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
291b0 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  [h];.  pPager->a
291c0 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
291d0 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
291e0 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74  = 0;..  makeDirt
291f0 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72  y(pPg);.  pPager
29200 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
29210 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e  ;..  if( needSyn
29220 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20  cPgno ){.    /* 
29230 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  If needSyncPgno 
29240 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
29250 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
29260 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a  le needs to be .
29270 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20      ** sync()ed 
29280 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
29290 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61  is written to da
292a0 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65  tabase file page
292b0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20   needSyncPgno.. 
292c0 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c     ** Currently,
292d0 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78   no such page ex
292e0 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65  ists in the page
292f0 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a  -cache and the .
29300 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e      ** Pager.aIn
29310 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20  Journal bit has 
29320 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e  been set. This n
29330 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64  eeds to be remed
29340 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20  ied by loading. 
29350 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69     ** the page i
29360 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61  nto the pager-ca
29370 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20  che and setting 
29380 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
29390 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a  nc flag..    **.
293a0 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74      ** The sqlit
293b0 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61 6c  e3PagerGet() cal
293c0 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  l may cause the 
293d0 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e  journal to sync.
293e0 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   So make.    ** 
293f0 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e  sure the Pager.n
29400 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
29410 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  set too..    */.
29420 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
29430 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
29440 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
29450 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
29460 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
29470 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
29480 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70  needSyncPgno, &p
29490 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
294a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
294b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
294c0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
294d0 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d  = 1;.    pPgHdr-
294e0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
294f0 20 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75     pPgHdr->inJou
29500 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61  rnal = 1;.    ma
29510 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b  keDirty(pPgHdr);
29520 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
29530 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
29540 20 20 7d 0a 0a 20 20 70 61 67 65 72 4c 65 61 76    }..  pagerLeav
29550 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
29560 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
29570 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
29580 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
29590 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  to the data for 
295a0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
295b0 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ge..*/.void *sql
295c0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
295d0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
295e0 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f   return PGHDR_TO
295f0 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f  _DATA(pPg);.}../
29600 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
29610 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
29620 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
29630 6f 66 20 22 65 78 74 72 61 22 20 73 70 61 63 65  of "extra" space
29640 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61   .** allocated a
29650 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73 70  long with the sp
29660 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
29670 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
29680 67 65 72 47 65 74 45 78 74 72 61 28 44 62 50 61  gerGetExtra(DbPa
29690 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  ge *pPg){.  Page
296a0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
296b0 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72  >pPager;.  retur
296c0 6e 20 28 70 50 61 67 65 72 3f 50 47 48 44 52 5f  n (pPager?PGHDR_
296d0 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50  TO_EXTRA(pPg, pP
296e0 61 67 65 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a  ager):0);.}../*.
296f0 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c  ** Get/set the l
29700 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20  ocking-mode for 
29710 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61  this pager. Para
29720 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74  meter eMode must
29730 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41   be one.** of PA
29740 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
29750 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43  QUERY, PAGER_LOC
29760 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
29770 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43  or .** PAGER_LOC
29780 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
29790 56 45 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d  VE. If the param
297a0 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45  eter is not _QUE
297b0 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  RY, then.** the 
297c0 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20  locking-mode is 
297d0 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
297e0 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
297f0 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
29800 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50  alue is either P
29810 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
29820 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41  _NORMAL or.** PA
29830 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
29840 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63  EXCLUSIVE, indic
29850 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ating the curren
29860 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61  t (possibly upda
29870 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d  ted).** locking-
29880 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mode..*/.int sql
29890 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
298a0 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  Mode(Pager *pPag
298b0 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a  er, int eMode){.
298c0 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
298d0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
298e0 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20  DE_QUERY.       
298f0 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
29900 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
29910 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20  _NORMAL.        
29920 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
29930 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
29940 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
29950 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
29960 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30  KINGMODE_QUERY<0
29970 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
29980 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
29990 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47  NORMAL>=0 && PAG
299a0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
299b0 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20  XCLUSIVE>=0 );. 
299c0 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26   if( eMode>=0 &&
299d0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
299e0 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  le ){.    pPager
299f0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
29a00 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72  = eMode;.  }.  r
29a10 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65  eturn (int)pPage
29a20 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
29a30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
29a40 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
29a50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f  rint a listing o
29a60 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64  f all referenced
29a70 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69 72   pages and their
29a80 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76   ref count..*/.v
29a90 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
29aa0 52 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70  Refdump(Pager *p
29ab0 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
29ac0 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d  *pPg;.  for(pPg=
29ad0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
29ae0 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
29af0 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70  tAll){.    if( p
29b00 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f  Pg->nRef<=0 ) co
29b10 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69  ntinue;.    sqli
29b20 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
29b30 50 41 47 45 20 25 33 64 20 61 64 64 72 3d 25 70  PAGE %3d addr=%p
29b40 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20   nRef=%d\n", .  
29b50 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20       pPg->pgno, 
29b60 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
29b70 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a  g), pPg->nRef);.
29b80 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65    }.}.#endif..#e
29b90 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
29ba0 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a        MIT_DISKIO */.