/ Hex Artifact Content
Login

Artifact a6ecad26297469a8a3d1fd7a7c3dc2d603955044:


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 34 36  : pager.c,v 1.46
0350: 37 20 32 30 30 38 2f 30 37 2f 32 32 20 30 35 3a  7 2008/07/22 05:
0360: 31 38 3a 30 31 20 73 68 61 6e 65 20 45 78 70 20  18:01 shane Exp 
0370: 24 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  $.*/.#ifndef SQL
0380: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0390: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
03a0: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
03b0: 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c  <assert.h>.#incl
03c0: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a  ude <string.h>..
03d0: 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72  /*.** Macros for
03e0: 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67   troubleshooting
03f0: 2e 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e  .  Normally turn
0400: 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a  ed off.*/.#if 0.
0410: 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44  #define sqlite3D
0420: 65 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74  ebugPrintf print
0430: 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  f.#define PAGERT
0440: 52 41 43 45 31 28 58 29 20 20 20 20 20 20 20 73  RACE1(X)       s
0450: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0460: 66 28 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47  f(X).#define PAG
0470: 45 52 54 52 41 43 45 32 28 58 2c 59 29 20 20 20  ERTRACE2(X,Y)   
0480: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
0490: 69 6e 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e  intf(X,Y).#defin
04a0: 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58 2c  e PAGERTRACE3(X,
04b0: 59 2c 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65  Y,Z)   sqlite3De
04c0: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29  bugPrintf(X,Y,Z)
04d0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
04e0: 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71  ACE4(X,Y,Z,W) sq
04f0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
0500: 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e  (X,Y,Z,W).#defin
0510: 65 20 50 41 47 45 52 54 52 41 43 45 35 28 58 2c  e PAGERTRACE5(X,
0520: 59 2c 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33  Y,Z,W,V) sqlite3
0530: 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c  DebugPrintf(X,Y,
0540: 5a 2c 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65  Z,W,V).#else.#de
0550: 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45 31  fine PAGERTRACE1
0560: 28 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45  (X).#define PAGE
0570: 52 54 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65  RTRACE2(X,Y).#de
0580: 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45 33  fine PAGERTRACE3
0590: 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20  (X,Y,Z).#define 
05a0: 50 41 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c  PAGERTRACE4(X,Y,
05b0: 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47  Z,W).#define PAG
05c0: 45 52 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57  ERTRACE5(X,Y,Z,W
05d0: 2c 56 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,V).#endif../*.*
05e0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
05f0: 74 77 6f 20 6d 61 63 72 6f 73 20 61 72 65 20 75  two macros are u
0600: 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 50  sed within the P
0610: 41 47 45 52 54 52 41 43 45 58 28 29 20 6d 61 63  AGERTRACEX() mac
0620: 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20  ros above.** to 
0630: 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64  print out file-d
0640: 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a  escriptors. .**.
0650: 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61 6b  ** PAGERID() tak
0660: 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  es a pointer to 
0670: 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20 61  a Pager struct a
0680: 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 20  s its argument. 
0690: 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  The.** associate
06a0: 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  d file-descripto
06b0: 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46  r is returned. F
06c0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61  ILEHANDLEID() ta
06d0: 6b 65 73 20 61 6e 20 73 71 6c 69 74 65 33 5f 66  kes an sqlite3_f
06e0: 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 20 61 73  ile.** struct as
06f0: 20 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   its 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 73 20 6d 65 6d 6f 72 79  efore its memory
18b0: 20 63 61 6e 20 62 65 20 72 65 63 6c 61 69 6d 65   can be reclaime
18c0: 64 2e 20 49 66 20 6e 6f 20 73 75 63 68 0a 2a 2a  d. If no such.**
18d0: 20 70 61 67 65 20 65 78 69 73 74 73 2c 20 50 61   page exists, Pa
18e0: 67 65 72 4c 72 75 4c 69 73 74 2e 70 46 69 72 73  gerLruList.pFirs
18f0: 74 53 79 6e 63 65 64 20 69 73 20 73 65 74 20 74  tSynced is set t
1900: 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 74 79 70 65 64  o NULL..*/.typed
1910: 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72 4c  ef struct PagerL
1920: 72 75 4c 69 73 74 20 50 61 67 65 72 4c 72 75 4c  ruList PagerLruL
1930: 69 73 74 3b 0a 73 74 72 75 63 74 20 50 61 67 65  ist;.struct Page
1940: 72 4c 72 75 4c 69 73 74 20 7b 0a 20 20 50 67 48  rLruList {.  PgH
1950: 64 72 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20  dr *pFirst;     
1960: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67      /* First pag
1970: 65 20 69 6e 20 4c 52 55 20 6c 69 73 74 20 2a 2f  e in LRU list */
1980: 0a 20 20 50 67 48 64 72 20 2a 70 4c 61 73 74 3b  .  PgHdr *pLast;
1990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73            /* Las
19a0: 74 20 70 61 67 65 20 69 6e 20 4c 52 55 20 6c 69  t page in LRU li
19b0: 73 74 20 28 74 68 65 20 6d 6f 73 74 20 72 65 63  st (the most rec
19c0: 65 6e 74 6c 79 20 75 73 65 64 29 20 2a 2f 0a 20  ently used) */. 
19d0: 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 53 79   PgHdr *pFirstSy
19e0: 6e 63 65 64 3b 20 20 20 2f 2a 20 46 69 72 73 74  nced;   /* First
19f0: 20 70 61 67 65 20 69 6e 20 6c 69 73 74 20 77 69   page in list wi
1a00: 74 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  th PgHdr.needSyn
1a10: 63 3d 3d 30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  c==0 */.};../*.*
1a20: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1a30: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
1a40: 6e 73 20 74 68 65 20 6e 65 78 74 20 61 6e 64 20  ns the next and 
1a50: 70 72 65 76 69 6f 75 73 20 70 6f 69 6e 74 65 72  previous pointer
1a60: 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 69 6e  s used.** to lin
1a70: 6b 20 61 20 50 67 48 64 72 20 73 74 72 75 63 74  k a PgHdr struct
1a80: 75 72 65 20 69 6e 74 6f 20 61 20 50 61 67 65 72  ure into a Pager
1a90: 4c 72 75 4c 69 73 74 20 6c 69 6e 6b 65 64 20 6c  LruList linked l
1aa0: 69 73 74 2e 20 0a 2a 2f 0a 74 79 70 65 64 65 66  ist. .*/.typedef
1ab0: 20 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75   struct PagerLru
1ac0: 4c 69 6e 6b 20 50 61 67 65 72 4c 72 75 4c 69 6e  Link PagerLruLin
1ad0: 6b 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c  k;.struct PagerL
1ae0: 72 75 4c 69 6e 6b 20 7b 0a 20 20 50 67 48 64 72  ruLink {.  PgHdr
1af0: 20 2a 70 4e 65 78 74 3b 0a 20 20 50 67 48 64 72   *pNext;.  PgHdr
1b00: 20 2a 70 50 72 65 76 3b 0a 7d 3b 0a 0a 2f 2a 0a   *pPrev;.};../*.
1b10: 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  ** Each in-memor
1b20: 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67  y image of a pag
1b30: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68  e begins with th
1b40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64  e following head
1b50: 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64  er..** This head
1b60: 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62  er is only visib
1b70: 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 72  le to this pager
1b80: 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c   module.  The cl
1b90: 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61  ient.** code tha
1ba0: 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65  t calls pager se
1bb0: 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61  es only the data
1bc0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68   that follows th
1bd0: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
1be0: 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75  Client code shou
1bf0: 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  ld call sqlite3P
1c00: 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 61  agerWrite() on a
1c10: 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d   page prior to m
1c20: 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64  aking.** any mod
1c30: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
1c40: 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66 69  at page.  The fi
1c50: 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33  rst time sqlite3
1c60: 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20  PagerWrite().** 
1c70: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f  is called, the o
1c80: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
1c90: 74 65 6e 74 73 20 61 72 65 20 77 72 69 74 74 65  tents are writte
1ca0: 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  n into the rollb
1cb0: 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  ack.** journal a
1cc0: 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e  nd PgHdr.inJourn
1cd0: 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65  al and PgHdr.nee
1ce0: 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20  dSync are set.  
1cf0: 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74  Later, once.** t
1d00: 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  he journal page 
1d10: 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f  has made it onto
1d20: 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
1d30: 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  e, PgHdr.needSyn
1d40: 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e  c.** is cleared.
1d50: 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70    The modified p
1d60: 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72  age cannot be wr
1d70: 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20  itten back into 
1d80: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
1d90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e  database file un
1da0: 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  til the journal 
1db0: 70 61 67 65 73 20 68 61 73 20 62 65 65 6e 20 73  pages has been s
1dc0: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e  ynced to disk an
1dd0: 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e  d the.** PgHdr.n
1de0: 65 65 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e  eedSync has been
1df0: 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   cleared..**.** 
1e00: 54 68 65 20 50 67 48 64 72 2e 64 69 72 74 79 20  The PgHdr.dirty 
1e10: 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65 6e  flag is set when
1e20: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1e30: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61  te() is called a
1e40: 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64  nd.** is cleared
1e50: 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65 20   again when the 
1e60: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
1e70: 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20  written back to 
1e80: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
1e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1ea0: 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66 20  *.** Details of 
1eb0: 69 6d 70 6f 72 74 61 6e 74 20 73 74 72 75 63 74  important struct
1ec0: 75 72 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a 2a  ure elements:.**
1ed0: 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a  .** needSync.**.
1ee0: 2a 2a 20 20 20 20 20 49 66 20 74 68 69 73 20 69  **     If this i
1ef0: 73 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61  s true, this mea
1f00: 6e 73 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  ns that it is no
1f10: 74 20 73 61 66 65 20 74 6f 20 77 72 69 74 65 20  t safe to write 
1f20: 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20  the page.**     
1f30: 63 6f 6e 74 65 6e 74 20 74 6f 20 74 68 65 20 64  content to the d
1f40: 61 74 61 62 61 73 65 20 62 65 63 61 75 73 65 20  atabase because 
1f50: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  the original con
1f60: 74 65 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20 20  tent needed.**  
1f70: 20 20 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20     for rollback 
1f80: 68 61 73 20 6e 6f 74 20 62 79 20 73 79 6e 63 65  has not by synce
1f90: 64 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f  d to the main ro
1fa0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
1fb0: 2a 2a 20 20 20 20 20 54 68 65 20 6f 72 69 67 69  **     The origi
1fc0: 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20  nal content may 
1fd0: 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
1fe0: 6e 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  n to the rollbac
1ff0: 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  k journal.**    
2000: 20 62 75 74 20 69 74 20 68 61 73 20 6e 6f 74 20   but it has not 
2010: 79 65 74 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  yet been synced.
2020: 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 77    So we cannot w
2030: 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61  rite to the data
2040: 62 61 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c 65  base.**     file
2050: 20 62 65 63 61 75 73 65 20 70 6f 77 65 72 20 66   because power f
2060: 61 69 6c 75 72 65 20 6d 69 67 68 74 20 63 61 75  ailure might cau
2070: 73 65 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  se the page in t
2080: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
2090: 2a 2a 20 20 20 20 20 74 6f 20 6e 65 76 65 72 20  **     to never 
20a0: 72 65 61 63 68 20 74 68 65 20 64 69 73 6b 2e 20  reach the disk. 
20b0: 20 49 74 20 69 73 20 61 73 20 69 66 20 74 68 65   It is as if the
20c0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
20d0: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20  urnal file.**   
20e0: 20 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72    does not occur
20f0: 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e   until the journ
2100: 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
2110: 64 2e 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20 20  d..**     .**   
2120: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 66    This flag is f
2130: 61 6c 73 65 20 69 66 20 74 68 65 20 70 61 67 65  alse if the page
2140: 20 63 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c 79   content exactly
2150: 20 6d 61 74 63 68 65 73 20 77 68 61 74 0a 2a 2a   matches what.**
2160: 20 20 20 20 20 63 75 72 72 65 6e 74 6c 79 20 65       currently e
2170: 78 69 73 74 73 20 69 6e 20 74 68 65 20 64 61 74  xists in the dat
2180: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
2190: 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69   needSync flag i
21a0: 73 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66 61  s also.**     fa
21b0: 6c 73 65 20 69 66 20 74 68 65 20 6f 72 69 67 69  lse if the origi
21c0: 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  nal content has 
21d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
21e0: 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
21f0: 6b 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c  k.**     journal
2200: 20 61 6e 64 20 73 79 6e 63 65 64 2e 20 20 49 66   and synced.  If
2210: 20 74 68 65 20 70 61 67 65 20 72 65 70 72 65 73   the page repres
2220: 65 6e 74 73 20 61 20 6e 65 77 20 70 61 67 65 20  ents a new page 
2230: 74 68 61 74 20 68 61 73 0a 2a 2a 20 20 20 20 20  that has.**     
2240: 62 65 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f 20  been added onto 
2250: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
2260: 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 74  atabase during t
2270: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
2280: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74    transaction, t
2290: 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  he needSync flag
22a0: 20 69 73 20 74 72 75 65 20 75 6e 74 69 6c 20 74   is true until t
22b0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
22c0: 62 61 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a 65  base.**     size
22d0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
22e0: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
22f0: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
2300: 2a 2a 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c 0a  **.** inJournal.
2310: 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 69  **.**     This i
2320: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 72  s true if the or
2330: 69 67 69 6e 61 6c 20 70 61 67 65 20 68 61 73 20  iginal page has 
2340: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 74  been written int
2350: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20 20  o the main.**   
2360: 20 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e    rollback journ
2370: 61 6c 2e 20 20 54 68 69 73 20 69 73 20 61 6c 77  al.  This is alw
2380: 61 79 73 20 66 61 6c 73 65 20 66 6f 72 20 6e 65  ays false for ne
2390: 77 20 70 61 67 65 73 20 61 64 64 65 64 20 74 6f  w pages added to
23a0: 0a 2a 2a 20 20 20 20 20 74 68 65 20 65 6e 64 20  .**     the end 
23b0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
23c0: 66 69 6c 65 20 64 75 72 69 6e 67 20 74 68 65 20  file during the 
23d0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
23e0: 69 6f 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64 20  ion..**     And 
23f0: 74 68 69 73 20 66 6c 61 67 20 73 61 79 73 20 6e  this flag says n
2400: 6f 74 68 69 6e 67 20 61 62 6f 75 74 20 77 68 65  othing about whe
2410: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
2420: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 68  journal.**     h
2430: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
2440: 6f 20 64 69 73 6b 2e 20 20 46 6f 72 20 70 61 67  o disk.  For pag
2450: 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20 74  es that are in t
2460: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
2470: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
2480: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
2490: 65 78 70 72 65 73 73 69 6f 6e 20 73 68 6f 75 6c  expression shoul
24a0: 64 20 61 6c 77 61 79 73 20 62 65 20 74 72 75 65  d always be true
24b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e  :.**.**       in
24c0: 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
24d0: 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
24e0: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
24f0: 70 67 6e 6f 29 0a 2a 2a 0a 2a 2a 20 20 20 20 20  pgno).**.**     
2500: 54 68 65 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  The pPager->pInJ
2510: 6f 75 72 6e 61 6c 20 6f 62 6a 65 63 74 20 69 73  ournal object is
2520: 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20   only valid for 
2530: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
2540: 20 20 20 20 70 61 67 65 73 20 6f 66 20 74 68 65      pages of the
2550: 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 74 20 6e   database, not n
2560: 65 77 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ew pages that ar
2570: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 65  e added to the e
2580: 6e 64 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65  nd.**     of the
2590: 20 64 61 74 61 62 61 73 65 2c 20 73 6f 20 6f 62   database, so ob
25a0: 76 69 6f 75 73 6c 79 20 74 68 65 20 61 62 6f 76  viously the abov
25b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
25c0: 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 76 61  not be.**     va
25d0: 6c 69 64 20 66 6f 72 20 6e 65 77 20 70 61 67 65  lid for new page
25e0: 73 2e 20 20 46 6f 72 20 6e 65 77 20 70 61 67 65  s.  For new page
25f0: 73 20 69 6e 4a 6f 75 72 6e 61 6c 20 69 73 20 61  s inJournal is a
2600: 6c 77 61 79 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 64  lways 0..**.** d
2610: 69 72 74 79 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57  irty.**.**     W
2620: 68 65 6e 20 74 72 75 65 2c 20 74 68 69 73 20 6d  hen true, this m
2630: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f  eans that the co
2640: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
2650: 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20  e has been.**   
2660: 20 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 6e    modified and n
2670: 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74  eeds to be writt
2680: 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  en back to the d
2690: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
26a0: 20 20 20 20 20 49 66 20 66 61 6c 73 65 2c 20 69       If false, i
26b0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74  t means that eit
26c0: 68 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  her the content 
26d0: 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 0a 2a  of the page is.*
26e0: 2a 20 20 20 20 20 75 6e 63 68 61 6e 67 65 64 20  *     unchanged 
26f0: 6f 72 20 65 6c 73 65 20 74 68 65 20 63 6f 6e 74  or else the cont
2700: 65 6e 74 20 69 73 20 75 6e 69 6d 70 6f 72 74 61  ent is unimporta
2710: 6e 74 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74  nt and we do not
2720: 0a 2a 2a 20 20 20 20 20 63 61 72 65 20 77 68 65  .**     care whe
2730: 74 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 69  ther or not it i
2740: 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a  s preserved..**.
2750: 2a 2a 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ** alwaysRollbac
2760: 6b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73  k.**.**     This
2770: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
2780: 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
2790: 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 73  Rollback() API s
27a0: 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 20 20 20 20  hould be.**     
27b0: 69 67 6e 6f 72 65 64 20 66 6f 72 20 74 68 69 73  ignored for this
27c0: 20 70 61 67 65 2e 20 20 54 68 65 20 44 6f 6e 74   page.  The Dont
27d0: 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 61  Rollback() API a
27e0: 74 74 65 6d 70 74 73 20 74 6f 20 73 61 79 0a 2a  ttempts to say.*
27f0: 2a 20 20 20 20 20 74 68 61 74 20 74 68 65 20 63  *     that the c
2800: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
2810: 67 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 75 6e  ge on disk is un
2820: 69 6d 70 6f 72 74 61 6e 74 20 28 69 74 20 69 73  important (it is
2830: 20 61 6e 0a 2a 2a 20 20 20 20 20 75 6e 75 73 65   an.**     unuse
2840: 64 20 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72  d page on the fr
2850: 65 65 6c 69 73 74 29 20 73 6f 20 74 68 61 74 20  eelist) so that 
2860: 69 74 20 69 73 20 75 6e 6e 65 63 65 73 73 61 72  it is unnecessar
2870: 79 20 74 6f 20 0a 2a 2a 20 20 20 20 20 72 6f 6c  y to .**     rol
2880: 6c 62 61 63 6b 20 63 68 61 6e 67 65 73 20 74 6f  lback changes to
2890: 20 74 68 69 73 20 70 61 67 65 20 62 65 63 61 75   this page becau
28a0: 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  se the content o
28b0: 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20  f the page.**   
28c0: 20 20 63 61 6e 20 63 68 61 6e 67 65 20 77 69 74    can change wit
28d0: 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68  hout changing th
28e0: 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
28f0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
2900: 0a 2a 2a 20 20 20 20 20 66 6c 61 67 20 6f 76 65  .**     flag ove
2910: 72 72 69 64 65 73 20 61 6e 79 20 44 6f 6e 74 52  rrides any DontR
2920: 6f 6c 6c 62 61 63 6b 28 29 20 61 74 74 65 6d 70  ollback() attemp
2930: 74 2e 20 20 54 68 69 73 20 66 6c 61 67 20 69 73  t.  This flag is
2940: 20 73 65 74 0a 2a 2a 20 20 20 20 20 77 68 65 6e   set.**     when
2950: 20 61 20 70 61 67 65 20 74 68 61 74 20 6f 72 69   a page that ori
2960: 67 69 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65  ginally containe
2970: 64 20 76 61 6c 69 64 20 64 61 74 61 20 69 73 20  d valid data is 
2980: 61 64 64 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20  added to.**     
2990: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 4c  the freelist.  L
29a0: 61 74 65 72 20 69 6e 20 74 68 65 20 73 61 6d 65  ater in the same
29b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
29c0: 69 73 20 70 61 67 65 20 6d 69 67 68 74 0a 2a 2a  is page might.**
29d0: 20 20 20 20 20 62 65 20 70 75 6c 6c 65 64 20 66       be pulled f
29e0: 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
29f0: 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20   and reused for 
2a00: 73 6f 6d 65 74 68 69 6e 67 20 64 69 66 66 65 72  something differ
2a10: 65 6e 74 0a 2a 2a 20 20 20 20 20 61 6e 64 20 61  ent.**     and a
2a20: 74 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65  t that point the
2a30: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
2a40: 41 50 49 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  API will be call
2a50: 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 20 20  ed because.**   
2a60: 20 20 70 61 67 65 73 20 74 61 6b 65 6e 20 66 72    pages taken fr
2a70: 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
2a80: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  do not need to b
2a90: 65 20 70 72 6f 74 65 63 74 65 64 20 62 79 0a 2a  e protected by.*
2aa0: 2a 20 20 20 20 20 74 68 65 20 72 6f 6c 6c 62 61  *     the rollba
2ab0: 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 42 75 74  ck journal.  But
2ac0: 20 74 68 69 73 20 66 6c 61 67 20 73 61 79 73 20   this flag says 
2ad0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 77 61  that the page wa
2ae0: 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 6f 72 69  s.**     not ori
2af0: 67 69 6e 61 6c 6c 79 20 70 61 72 74 20 6f 66 20  ginally part of 
2b00: 74 68 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20  the freelist so 
2b10: 74 68 61 74 20 69 74 20 73 74 69 6c 6c 20 6e 65  that it still ne
2b20: 65 64 73 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65  eds to.**     be
2b30: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20   rolled back in 
2b40: 73 70 69 74 65 20 6f 66 20 61 6e 79 20 73 75 62  spite of any sub
2b50: 73 65 71 75 65 6e 74 20 44 6f 6e 74 52 6f 6c 6c  sequent DontRoll
2b60: 62 61 63 6b 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a  back() calls..**
2b70: 0a 2a 2a 20 6e 65 65 64 52 65 61 64 20 0a 2a 2a  .** needRead .**
2b80: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61  .**     This fla
2b90: 67 20 6d 65 61 6e 73 20 28 77 68 65 6e 20 74 72  g means (when tr
2ba0: 75 65 29 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ue) that the con
2bb0: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
2bc0: 20 68 61 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20   has.**     not 
2bd0: 79 65 74 20 62 65 65 6e 20 6c 6f 61 64 65 64 20  yet been loaded 
2be0: 66 72 6f 6d 20 64 69 73 6b 2e 20 20 54 68 65 20  from disk.  The 
2bf0: 69 6e 2d 6d 65 6d 6f 72 79 20 63 6f 6e 74 65 6e  in-memory conten
2c00: 74 20 69 73 20 6a 75 73 74 0a 2a 2a 20 20 20 20  t is just.**    
2c10: 20 67 61 72 62 61 67 65 2e 20 20 28 41 63 74 75   garbage.  (Actu
2c20: 61 6c 6c 79 2c 20 77 65 20 7a 65 72 6f 20 74 68  ally, we zero th
2c30: 65 20 63 6f 6e 74 65 6e 74 2c 20 62 75 74 20 79  e content, but y
2c40: 6f 75 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a  ou should not.**
2c50: 20 20 20 20 20 6d 61 6b 65 20 61 6e 79 20 61 73       make any as
2c60: 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20  sumptions about 
2c70: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6e 65 76 65  the content neve
2c80: 72 74 68 65 6c 65 73 73 2e 29 20 20 49 66 20 74  rtheless.)  If t
2c90: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e  he.**     conten
2ca0: 74 20 69 73 20 6e 65 65 64 65 64 20 69 6e 20 74  t is needed in t
2cb0: 68 65 20 66 75 74 75 72 65 2c 20 69 74 20 73 68  he future, it sh
2cc0: 6f 75 6c 64 20 62 65 20 72 65 61 64 20 66 72 6f  ould be read fro
2cd0: 6d 20 74 68 65 0a 2a 2a 20 20 20 20 20 6f 72 69  m the.**     ori
2ce0: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
2cf0: 69 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50  ile..*/.struct P
2d00: 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a  gHdr {.  Pager *
2d10: 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20  pPager;         
2d20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
2d30: 61 67 65 72 20 74 6f 20 77 68 69 63 68 20 74 68  ager to which th
2d40: 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20  is page belongs 
2d50: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
2d80: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20  number for this 
2d90: 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  page */.  PgHdr 
2da0: 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72  *pNextHash, *pPr
2db0: 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68  evHash;  /* Hash
2dc0: 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e   collision chain
2dd0: 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20   for PgHdr.pgno 
2de0: 2a 2f 0a 20 20 50 61 67 65 72 4c 72 75 4c 69 6e  */.  PagerLruLin
2df0: 6b 20 66 72 65 65 3b 20 20 20 20 20 20 20 20 20  k free;         
2e00: 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 6e 64 20      /* Next and 
2e10: 70 72 65 76 69 6f 75 73 20 66 72 65 65 20 70 61  previous free pa
2e20: 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ges */.  PgHdr *
2e30: 70 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20  pNextAll;       
2e40: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73          /* A lis
2e50: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a  t of all pages *
2e60: 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c  /.  u8 inJournal
2e70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e80: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61     /* TRUE if ha
2e90: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
2ea0: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  o journal */.  u
2eb0: 38 20 64 69 72 74 79 3b 20 20 20 20 20 20 20 20  8 dirty;        
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ed0: 20 54 52 55 45 20 69 66 20 77 65 20 6e 65 65 64   TRUE if we need
2ee0: 20 74 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63   to write back c
2ef0: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e  hanges */.  u8 n
2f00: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
2f10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79             /* Sy
2f20: 6e 63 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  nc journal befor
2f30: 65 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 70  e writing this p
2f40: 61 67 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61  age */.  u8 alwa
2f50: 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20  ysRollback;     
2f60: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62          /* Disab
2f70: 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  le DontRollback(
2f80: 29 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  ) for this page 
2f90: 2a 2f 0a 20 20 75 38 20 6e 65 65 64 52 65 61 64  */.  u8 needRead
2fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fb0: 20 20 20 20 2f 2a 20 52 65 61 64 20 63 6f 6e 74      /* Read cont
2fc0: 65 6e 74 20 69 66 20 50 61 67 65 72 57 72 69 74  ent if PagerWrit
2fd0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f  e() is called */
2fe0: 0a 20 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65  .  short int nRe
2ff0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
3000: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
3010: 73 65 72 73 20 6f 66 20 74 68 69 73 20 70 61 67  sers of this pag
3020: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44  e */.  PgHdr *pD
3030: 69 72 74 79 2c 20 2a 70 50 72 65 76 44 69 72 74  irty, *pPrevDirt
3040: 79 3b 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70  y;    /* Dirty p
3050: 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  ages */.#ifdef S
3060: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
3070: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
3080: 20 50 67 48 64 72 20 2a 70 50 72 65 76 41 6c 6c   PgHdr *pPrevAll
3090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30a0: 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c  /* A list of all
30b0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 61 67 65   pages */.  Page
30c0: 72 4c 72 75 4c 69 6e 6b 20 67 66 72 65 65 3b 20  rLruLink gfree; 
30d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 6c             /* Gl
30e0: 6f 62 61 6c 20 6c 69 73 74 20 6f 66 20 6e 52 65  obal list of nRe
30f0: 66 3d 3d 30 20 70 61 67 65 73 20 2a 2f 0a 23 65  f==0 pages */.#e
3100: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
3110: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
3120: 20 75 33 32 20 70 61 67 65 48 61 73 68 3b 0a 23   u32 pageHash;.#
3130: 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 2a 70 44  endif.  void *pD
3140: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
3150: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 64         /* Page d
3160: 61 74 61 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65  ata */.  /* Page
3170: 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f  r.nExtra bytes o
3180: 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 61 70 70  f local data app
3190: 65 6e 64 65 64 20 74 6f 20 74 68 69 73 20 68 65  ended to this he
31a0: 61 64 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ader */.};../*.*
31b0: 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  * For an in-memo
31c0: 72 79 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ry only database
31d0: 2c 20 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66  , some extra inf
31e0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f  ormation is reco
31f0: 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61  rded about.** ea
3200: 63 68 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  ch page so that 
3210: 63 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72  changes can be r
3220: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f  olled back.  (Jo
3230: 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20  urnal files are 
3240: 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20  not.** used for 
3250: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
3260: 73 65 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f  ses.)  The follo
3270: 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  wing information
3280: 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20   is added to.** 
3290: 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
32a0: 20 45 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72   EXTRA block for
32b0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
32c0: 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ases..**.** This
32d0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75   information cou
32e0: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 61 64 64  ld have been add
32f0: 65 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  ed directly to t
3300: 68 65 20 50 67 48 64 72 20 73 74 72 75 63 74 75  he PgHdr structu
3310: 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20  re..** But then 
3320: 69 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70  it would take up
3330: 20 61 6e 20 65 78 74 72 61 20 38 20 62 79 74 65   an extra 8 byte
3340: 73 20 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20  s of storage on 
3350: 65 76 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65  every PgHdr.** e
3360: 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73  ven for disk-bas
3370: 65 64 20 64 61 74 61 62 61 73 65 73 2e 20 20 53  ed databases.  S
3380: 70 6c 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20  plitting it out 
3390: 73 61 76 65 73 20 38 20 62 79 74 65 73 2e 20 20  saves 8 bytes.  
33a0: 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  This.** is only 
33b0: 61 20 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38  a savings of 0.8
33c0: 25 20 62 75 74 20 74 68 6f 73 65 20 70 65 72 63  % but those perc
33d0: 65 6e 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a  entages add up..
33e0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
33f0: 74 20 50 67 48 69 73 74 6f 72 79 20 50 67 48 69  t PgHistory PgHi
3400: 73 74 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67  story;.struct Pg
3410: 48 69 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a  History {.  u8 *
3420: 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72  pOrig;     /* Or
3430: 69 67 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74  iginal page text
3440: 2e 20 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68  .  Restore to th
3450: 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c  is on a full rol
3460: 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70  lback */.  u8 *p
3470: 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78  Stmt;     /* Tex
3480: 74 20 61 73 20 69 74 20 77 61 73 20 61 74 20 74  t as it was at t
3490: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
34a0: 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
34b0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 50 67 48 64 72  ement */.  PgHdr
34c0: 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50   *pNextStmt, *pP
34d0: 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73  revStmt;  /* Lis
34e0: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
34f0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
3500: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74  nal */.  u8 inSt
3510: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
3520: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
3530: 69 66 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  if in the statem
3540: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a  ent subjournal *
3550: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61  /.};../*.** A ma
3560: 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e 76  cro used for inv
3570: 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63 20  oking the codec 
3580: 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a  if there is one.
3590: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
35a0: 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65 66  _HAS_CODEC.# def
35b0: 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e  ine CODEC1(P,D,N
35c0: 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64 65  ,X) if( P->xCode
35d0: 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64 65  c!=0 ){ P->xCode
35e0: 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44  c(P->pCodecArg,D
35f0: 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69 6e  ,N,X); }.# defin
3600: 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58  e CODEC2(P,D,N,X
3610: 29 20 28 28 63 68 61 72 2a 29 28 50 2d 3e 78 43  ) ((char*)(P->xC
3620: 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64 65  odec!=0?P->xCode
3630: 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44  c(P->pCodecArg,D
3640: 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65 0a  ,N,X):D)).#else.
3650: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28  # define CODEC1(
3660: 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f  P,D,N,X) /* NO-O
3670: 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43 4f  P */.# define CO
3680: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28  DEC2(P,D,N,X) ((
3690: 63 68 61 72 2a 29 44 29 0a 23 65 6e 64 69 66 0a  char*)D).#endif.
36a0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
36b0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67   pointer to a Pg
36c0: 48 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74  Hdr into a point
36d0: 65 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a  er to its data.*
36e0: 2a 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e  * and back again
36f0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48  ..*/.#define PGH
3700: 44 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 20  DR_TO_DATA(P)   
3710: 20 28 28 50 29 2d 3e 70 44 61 74 61 29 0a 23 64   ((P)->pData).#d
3720: 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45  efine PGHDR_TO_E
3730: 58 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64  XTRA(G,P) ((void
3740: 2a 29 26 28 28 47 29 5b 31 5d 29 29 0a 23 64 65  *)&((G)[1])).#de
3750: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49  fine PGHDR_TO_HI
3760: 53 54 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20  ST(P,PGR)  \.   
3770: 20 20 20 20 20 20 20 20 20 28 28 50 67 48 69 73           ((PgHis
3780: 74 6f 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28  tory*)&((char*)(
3790: 26 28 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d  &(P)[1]))[(PGR)-
37a0: 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a  >nExtra])../*.**
37b0: 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63   A open page cac
37c0: 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  he is an instanc
37d0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
37e0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ng structure..**
37f0: 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72 43 6f 64  .** Pager.errCod
3800: 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  e may be set to 
3810: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
3820: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
3830: 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  .** or SQLITE_FU
3840: 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20  LL. Once one of 
3850: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
3860: 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c 20 69  errors occurs, i
3870: 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20 61 6e  t persists.** an
3880: 64 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73  d is returned as
3890: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65   the result of e
38a0: 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67 65 72  very major pager
38b0: 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a   API call.  The.
38c0: 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72  ** SQLITE_FULL r
38d0: 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 6c  eturn code is sl
38e0: 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74  ightly different
38f0: 2e 20 49 74 20 70 65 72 73 69 73 74 73 20 6f 6e  . It persists on
3900: 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20  ly until the.** 
3910: 6e 65 78 74 20 73 75 63 63 65 73 73 66 75 6c 20  next successful 
3920: 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65 72 66  rollback is perf
3930: 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70 61 67  ormed on the pag
3940: 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 0a  er cache. Also,.
3950: 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64  ** SQLITE_FULL d
3960: 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20 74  oes not affect t
3970: 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
3980: 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  et() and sqlite3
3990: 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  PagerLookup().**
39a0: 20 41 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20   APIs, they may 
39b0: 73 74 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75  still be used su
39c0: 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 73  ccessfully..*/.s
39d0: 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20  truct Pager {.  
39e0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
39f0: 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  s;          /* O
3a00: 53 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75  S functions to u
3a10: 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75  se for IO */.  u
3a20: 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20  8 journalOpen;  
3a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3a40: 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69  ue if journal fi
3a50: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 69  le descriptors i
3a60: 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20  s valid */.  u8 
3a70: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20  journalStarted; 
3a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3a90: 20 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f   if header of jo
3aa0: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
3ab0: 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e  */.  u8 useJourn
3ac0: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
3ad0: 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61   /* Use a rollba
3ae0: 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68  ck journal on th
3af0: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  is file */.  u8 
3b00: 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20  noReadlock;     
3b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
3b20: 6f 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74  ot bother to obt
3b30: 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f  ain readlocks */
3b40: 0a 20 20 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20  .  u8 stmtOpen; 
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b60: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 74  * True if the st
3b70: 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e  atement subjourn
3b80: 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20  al is open */.  
3b90: 75 38 20 73 74 6d 74 49 6e 55 73 65 3b 20 20 20  u8 stmtInUse;   
3ba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3bb0: 72 75 65 20 77 65 20 61 72 65 20 69 6e 20 61 20  rue we are in a 
3bc0: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
3bd0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38  nsaction */.  u8
3be0: 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20   stmtAutoopen;  
3bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
3c00: 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77  n stmt journal w
3c10: 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  hen main journal
3c20: 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75   is opened*/.  u
3c30: 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20  8 noSync;       
3c40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
3c50: 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f   not sync the jo
3c60: 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f  urnal if true */
3c70: 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20  .  u8 fullSync; 
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3c90: 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73  * Do extra syncs
3ca0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
3cb0: 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a  for robustness *
3cc0: 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67  /.  u8 sync_flag
3cd0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
3ce0: 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e  /* One of SYNC_N
3cf0: 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55  ORMAL or SYNC_FU
3d00: 4c 4c 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65  LL */.  u8 state
3d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3d20: 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c      /* PAGER_UNL
3d30: 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52  OCK, _SHARED, _R
3d40: 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f  ESERVED, etc. */
3d50: 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20  .  u8 tempFile; 
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3d70: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61  * zFilename is a
3d80: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
3d90: 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79  */.  u8 readOnly
3da0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3db0: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72   /* True for a r
3dc0: 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
3dd0: 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79  e */.  u8 needSy
3de0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
3df0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
3e00: 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64   fsync() is need
3e10: 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
3e20: 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 43  l */.  u8 dirtyC
3e30: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
3e40: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61     /* True if ca
3e50: 63 68 65 64 20 70 61 67 65 73 20 68 61 76 65 20  ched pages have 
3e60: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20  changed */.  u8 
3e70: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20  alwaysRollback; 
3e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
3e90: 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  ble DontRollback
3ea0: 28 29 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73  () for all pages
3eb0: 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20   */.  u8 memDb; 
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ed0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68    /* True to inh
3ee0: 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f  ibit all file I/
3ef0: 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73  O */.  u8 setMas
3f00: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
3f10: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
3f20: 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65  m-j name has bee
3f30: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e  n written to jrn
3f40: 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53  l */.  u8 doNotS
3f50: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
3f60: 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57     /* Boolean. W
3f70: 68 69 6c 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f  hile true, do no
3f80: 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68  t spill the cach
3f90: 65 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73  e */.  u8 exclus
3fa0: 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  iveMode;        
3fb0: 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54     /* Boolean. T
3fc0: 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d  rue if locking_m
3fd0: 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a  ode==EXCLUSIVE *
3fe0: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f  /.  u8 journalMo
3ff0: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
4000: 2f 2a 20 4f 6e 20 6f 66 20 74 68 65 20 50 41 47  /* On of the PAG
4010: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a  ER_JOURNALMODE_*
4020: 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20   values */.  u8 
4030: 64 62 4d 6f 64 69 66 69 65 64 3b 20 20 20 20 20  dbModified;     
4040: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
4050: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
4060: 79 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  y changes to the
4070: 20 44 62 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e   Db */.  u8 chan
4080: 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20  geCountDone;    
4090: 20 20 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65       /* Set afte
40a0: 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74  r incrementing t
40b0: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
40c0: 72 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  r */.  u32 vfsFl
40d0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
40e0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
40f0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
4100: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  n() */.  int err
4110: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
4120: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
4130: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
4140: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
4150: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
4160: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4170: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
4180: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
4190: 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20  origDbSize;     
41a0: 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a          /* dbSiz
41b0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72  e before the cur
41c0: 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20  rent change */. 
41d0: 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20   int stmtSize;  
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
41f0: 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65  Size of database
4200: 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20 73   (in pages) at s
4210: 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20  tmt_begin() */. 
4220: 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
4230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4240: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
4250: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
4260: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
4270: 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
4280: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69          /* Quasi
4290: 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64  -random value ad
42a0: 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65  ded to every che
42b0: 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73  cksum */.  int s
42c0: 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20  tmtNRec;        
42d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
42e0: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73   of records in s
42f0: 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a  tmt subjournal *
4300: 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20  /.  int nExtra; 
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4320: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
4330: 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69   bytes to each i
4340: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
4350: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4370: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
4380: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
4390: 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
43b0: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
43c0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
43d0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
4400: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69  -memory pages wi
4410: 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20  th PgHdr.nRef>0 
4420: 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b  */.  int mxPage;
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
4450: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68  er of pages to h
4460: 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a  old in cache */.
4470: 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20    Pgno mxPgno;  
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4490: 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   Maximum allowed
44a0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
44b0: 61 62 61 73 65 20 2a 2f 0a 20 20 42 69 74 76 65  abase */.  Bitve
44c0: 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  c *pInJournal;  
44d0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
44e0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
44f0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
4500: 66 69 6c 65 20 2a 2f 0a 20 20 42 69 74 76 65 63  file */.  Bitvec
4510: 20 2a 70 49 6e 53 74 6d 74 3b 20 20 20 20 20 20   *pInStmt;      
4520: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
4530: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
4540: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
4550: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
4560: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
4570: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
4580: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
4590: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
45a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
45b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
45c0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
45d0: 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b  har *zDirectory;
45e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
45f0: 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74  rectory hold dat
4600: 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61  abase and journa
4610: 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 73 71 6c  l files */.  sql
4620: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 2a  ite3_file *fd, *
4630: 6a 66 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c 65  jfd;     /* File
4640: 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72   descriptors for
4650: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f   database and jo
4660: 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74  urnal */.  sqlit
4670: 65 33 5f 66 69 6c 65 20 2a 73 74 66 64 3b 20 20  e3_file *stfd;  
4680: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
4690: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
46a0: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
46b0: 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48  ournal*/.  BusyH
46c0: 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e  andler *pBusyHan
46d0: 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65  dler;  /* Pointe
46e0: 72 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79  r to sqlite.busy
46f0: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 61 67  Handler */.  Pag
4700: 65 72 4c 72 75 4c 69 73 74 20 6c 72 75 3b 20 20  erLruList lru;  
4710: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 52 55 20           /* LRU 
4720: 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67  list of free pag
4730: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
4740: 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  All;            
4750: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
4760: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ll pages */.  Pg
4770: 48 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  Hdr *pStmt;     
4780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
4790: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
47a0: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
47b0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64  ournal */.  PgHd
47c0: 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20  r *pDirty;      
47d0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
47e0: 6f 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  of all dirty pag
47f0: 65 73 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  es */.  i64 jour
4800: 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20  nalOff;         
4810: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62      /* Current b
4820: 79 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68  yte offset in th
4830: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
4840: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  /.  i64 journalH
4850: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
4860: 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74  /* Byte offset t
4870: 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e  o previous journ
4880: 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  al header */.  i
4890: 36 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20  64 stmtHdrOff;  
48a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
48b0: 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
48c0: 65 72 20 77 72 69 74 74 65 6e 20 74 68 69 73 20  er written this 
48d0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
48e0: 36 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20  64 stmtCksum;   
48f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b             /* ck
4900: 73 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61  sumInit when sta
4910: 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74  tement was start
4920: 65 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74  ed */.  i64 stmt
4930: 4a 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  JSize;          
4940: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a      /* Size of j
4950: 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62  ournal at stmt_b
4960: 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  egin() */.  int 
4970: 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20  sectorSize;     
4980: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d          /* Assum
4990: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64  ed sector size d
49a0: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a  uring rollback *
49b0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
49c0: 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c  TEST.  int nHit,
49d0: 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20   nMiss;         
49e0: 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73     /* Cache hits
49f0: 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a   and missing */.
4a00: 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72    int nRead, nWr
4a10: 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ite;          /*
4a20: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20   Database pages 
4a30: 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a  read/written */.
4a40: 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a  #endif.  void (*
4a50: 78 44 65 73 74 72 75 63 74 6f 72 29 28 44 62 50  xDestructor)(DbP
4a60: 61 67 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61  age*,int); /* Ca
4a70: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
4a80: 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67  when freeing pag
4a90: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
4aa0: 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65  Reiniter)(DbPage
4ab0: 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c  *,int);   /* Cal
4ac0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
4ad0: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
4ae0: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
4af0: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
4b00: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
4b10: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
4b20: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
4b30: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
4b40: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
4b50: 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20  d *pCodecArg;   
4b60: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
4b70: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43  t argument to xC
4b80: 6f 64 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66  odec() */.#endif
4b90: 0a 20 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20  .  int nHash;   
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4bb0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61  * Size of the pa
4bc0: 67 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a  ger hash table *
4bd0: 2f 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73  /.  PgHdr **aHas
4be0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
4bf0: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f  /* Hash table to
4c00: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
4c10: 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69 66   to PgHdr */.#if
4c20: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4c30: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
4c40: 45 4e 54 0a 20 20 50 61 67 65 72 20 2a 70 4e 65  ENT.  Pager *pNe
4c50: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
4c60: 20 20 2f 2a 20 44 6f 75 62 6c 79 20 6c 69 6e 6b    /* Doubly link
4c70: 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72  ed list of pager
4c80: 73 20 6f 6e 20 77 68 69 63 68 20 2a 2f 0a 20 20  s on which */.  
4c90: 50 61 67 65 72 20 2a 70 50 72 65 76 3b 20 20 20  Pager *pPrev;   
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
4cb0: 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d  qlite3_release_m
4cc0: 65 6d 6f 72 79 28 29 20 77 69 6c 6c 20 77 6f 72  emory() will wor
4cd0: 6b 20 2a 2f 0a 20 20 76 6f 6c 61 74 69 6c 65 20  k */.  volatile 
4ce0: 69 6e 74 20 69 49 6e 55 73 65 4d 4d 3b 20 20 20  int iInUseMM;   
4cf0: 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69     /* Non-zero i
4d00: 66 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 74 6f  f unavailable to
4d10: 20 4d 4d 20 2a 2f 0a 20 20 76 6f 6c 61 74 69 6c   MM */.  volatil
4d20: 65 20 69 6e 74 20 69 49 6e 55 73 65 44 42 3b 20  e int iInUseDB; 
4d30: 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f       /* Non-zero
4d40: 20 69 66 20 69 6e 20 73 71 6c 69 74 65 33 5f 72   if in sqlite3_r
4d50: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20  elease_memory() 
4d60: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72  */.#endif.  char
4d70: 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20   *pTmpSpace;    
4d80: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
4d90: 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  .pageSize bytes 
4da0: 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70  of space for tmp
4db0: 20 75 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 64   use */.  char d
4dc0: 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20  bFileVers[16];  
4dd0: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
4de0: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
4df0: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20  se file changes 
4e00: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
4e10: 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20  SizeLimit;      
4e20: 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66   /* Size limit f
4e30: 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f  or persistent jo
4e40: 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 7d  urnal files */.}
4e50: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  ;../*.** The fol
4e60: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
4e70: 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75  riables hold cou
4e80: 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a  nters used for.*
4e90: 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  * testing purpos
4ea0: 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20  es only.  These 
4eb0: 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74  variables do not
4ec0: 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e   exist in.** a n
4ed0: 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64  on-testing build
4ee0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
4ef0: 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61  es are not threa
4f00: 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65  d-safe..*/.#ifde
4f10: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
4f20: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
4f30: 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30  readdb_count = 0
4f40: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
4f50: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61  f full pages rea
4f60: 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74  d from DB */.int
4f70: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
4f80: 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30  ritedb_count = 0
4f90: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
4fa0: 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74   full pages writ
4fb0: 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74  ten to DB */.int
4fc0: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
4fd0: 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b  ritej_count = 0;
4fe0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4ff0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
5000: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 69 6e 74  o journal */.int
5010: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70   sqlite3_pager_p
5020: 67 66 72 65 65 5f 63 6f 75 6e 74 20 3d 20 30 3b  gfree_count = 0;
5030: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5040: 20 63 61 63 68 65 20 70 61 67 65 73 20 66 72 65   cache pages fre
5050: 65 64 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  ed */.# define P
5060: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
5070: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
5080: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
5090: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
50a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
50b0: 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ble points to th
50c0: 65 20 68 65 61 64 20 6f 66 20 61 20 64 6f 75 62  e head of a doub
50d0: 6c 65 2d 6c 69 6e 6b 65 64 20 6c 69 73 74 0a 2a  le-linked list.*
50e0: 2a 20 6f 66 20 61 6c 6c 20 70 61 67 65 72 73 20  * of all pagers 
50f0: 74 68 61 74 20 61 72 65 20 65 6c 69 67 69 62 6c  that are eligibl
5100: 65 20 66 6f 72 20 70 61 67 65 20 73 74 65 61 6c  e for page steal
5110: 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20 73 71  ing by the.** sq
5120: 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
5130: 6d 6f 72 79 28 29 20 69 6e 74 65 72 66 61 63 65  mory() interface
5140: 2e 20 20 41 63 63 65 73 73 20 74 6f 20 74 68 69  .  Access to thi
5150: 73 20 6c 69 73 74 20 69 73 0a 2a 2a 20 70 72 6f  s list is.** pro
5160: 74 65 63 74 65 64 20 62 79 20 74 68 65 20 53 51  tected by the SQ
5170: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
5180: 43 5f 4d 45 4d 32 20 6d 75 74 65 78 2e 0a 2a 2f  C_MEM2 mutex..*/
5190: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
51a0: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
51b0: 41 47 45 4d 45 4e 54 0a 73 74 61 74 69 63 20 50  AGEMENT.static P
51c0: 61 67 65 72 20 2a 73 71 6c 69 74 65 33 50 61 67  ager *sqlite3Pag
51d0: 65 72 4c 69 73 74 20 3d 20 30 3b 0a 73 74 61 74  erList = 0;.stat
51e0: 69 63 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20  ic PagerLruList 
51f0: 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
5200: 73 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a  st = {0, 0, 0};.
5210: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  #endif.../*.** J
5220: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
5230: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
5240: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
5250: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
5260: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
5270: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
5280: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
5290: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
52a0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
52b0: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
52c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
52d0: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
52e0: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
52f0: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
5300: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
5310: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
5320: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
5330: 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  egin.** written,
5340: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
5350: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
5360: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
5370: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
5380: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
5390: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
53a0: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
53b0: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
53c0: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
53d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
53e0: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
53f0: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
5400: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
5410: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
5420: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
5430: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
5440: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
5450: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
5460: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
5470: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
5480: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
5490: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
54a0: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
54b0: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
54c0: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
54d0: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
54e0: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
54f0: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
5500: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
5510: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
5520: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
5530: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
5540: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
5550: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
5560: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
5570: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
5580: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
5590: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
55a0: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
55b0: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
55c0: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
55d0: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
55e0: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
55f0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
5600: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
5610: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
5620: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
5630: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
5640: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
5650: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
5660: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
5670: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
5680: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
5690: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
56a0: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
56b0: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
56c0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
56d0: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
56e0: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
56f0: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
5700: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
5710: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
5720: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
5730: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
5740: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
5750: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
5760: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
5770: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
5780: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
5790: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
57a0: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
57b0: 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65  and of each page
57c0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
57d0: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a  is determined.**
57e0: 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   by the followin
57f0: 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65  g macros..*/.#de
5800: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  fine JOURNAL_PG_
5810: 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50  SZ(pPager)  ((pP
5820: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
5830: 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  + 8)../*.** The 
5840: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
5850: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ize for this pag
5860: 65 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72  er. In the futur
5870: 65 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65  e, this could be
5880: 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20  .** set to some 
5890: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
58a0: 74 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c  the disk control
58b0: 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61  ler. The importa
58c0: 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69  nt.** characteri
58d0: 73 74 69 63 20 69 73 20 74 68 61 74 20 69 74 20  stic is that it 
58e0: 69 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  is the same size
58f0: 20 61 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f   as a disk secto
5900: 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  r..*/.#define JO
5910: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5920: 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65  ger) (pPager->se
5930: 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a  ctorSize)../*.**
5940: 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42   The macro MEMDB
5950: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
5960: 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
5970: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
5980: 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20  abase..** We do 
5990: 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20  this as a macro 
59a0: 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53  so that if the S
59b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
59c0: 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74  YDB macro is set
59d0: 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
59e0: 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20  f MEMDB will be 
59f0: 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74  a constant and t
5a00: 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c  he compiler will
5a10: 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74   optimize.** out
5a20: 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64   code that would
5a30: 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a   never execute..
5a40: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
5a50: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23  _OMIT_MEMORYDB.#
5a60: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a   define MEMDB 0.
5a70: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d  #else.# define M
5a80: 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d  EMDB pPager->mem
5a90: 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  Db.#endif../*.**
5aa0: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47   Page number PAG
5ab0: 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65  ER_MJ_PGNO is ne
5ac0: 76 65 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53  ver used in an S
5ad0: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 28  QLite database (
5ae0: 69 74 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65  it is.** reserve
5af0: 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72  d for working ar
5b00: 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70  ound a windows/p
5b10: 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69  osix incompatibi
5b20: 6c 69 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20  lity). It is.** 
5b30: 75 73 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72  used in the jour
5b40: 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74  nal to signify t
5b50: 68 61 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65  hat the remainde
5b60: 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
5b70: 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76   file .** is dev
5b80: 6f 74 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20  oted to storing 
5b90: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
5ba0: 20 6e 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72   name - there ar
5bb0: 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20  e no more pages 
5bc0: 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e  to.** roll back.
5bd0: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f   See comments fo
5be0: 72 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  r function write
5bf0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20  MasterJournal() 
5c00: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
5c10: 2f 2a 20 23 64 65 66 69 6e 65 20 50 41 47 45 52  /* #define PAGER
5c20: 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e  _MJ_PGNO(x) (PEN
5c30: 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e  DING_BYTE/((x)->
5c40: 70 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64  pageSize)) */.#d
5c50: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50  efine PAGER_MJ_P
5c60: 47 4e 4f 28 78 29 20 28 28 50 45 4e 44 49 4e 47  GNO(x) ((PENDING
5c70: 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65  _BYTE/((x)->page
5c80: 53 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  Size))+1)../*.**
5c90: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67   The maximum leg
5ca0: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  al page number i
5cb0: 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f  s (2^31 - 1)..*/
5cc0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d  .#define PAGER_M
5cd0: 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36  AX_PGNO 21474836
5ce0: 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  47../*.** The pa
5cf0: 67 65 72 45 6e 74 65 72 28 29 20 61 6e 64 20 70  gerEnter() and p
5d00: 61 67 65 72 4c 65 61 76 65 28 29 20 72 6f 75 74  agerLeave() rout
5d10: 69 6e 65 73 20 61 63 71 75 69 72 65 20 61 6e 64  ines acquire and
5d20: 20 72 65 6c 65 61 73 65 0a 2a 2a 20 61 20 6d 75   release.** a mu
5d30: 74 65 78 20 6f 6e 20 65 61 63 68 20 70 61 67 65  tex on each page
5d40: 72 2e 20 20 54 68 65 20 6d 75 74 65 78 20 69 73  r.  The mutex is
5d50: 20 72 65 63 75 72 73 69 76 65 2e 0a 2a 2a 0a 2a   recursive..**.*
5d60: 2a 20 54 68 69 73 20 69 73 20 61 20 73 70 65 63  * This is a spec
5d70: 69 61 6c 2d 70 75 72 70 6f 73 65 20 6d 75 74 65  ial-purpose mute
5d80: 78 2e 20 20 49 74 20 6f 6e 6c 79 20 70 72 6f 76  x.  It only prov
5d90: 69 64 65 73 20 6d 75 74 75 61 6c 20 65 78 63 6c  ides mutual excl
5da0: 75 73 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e  usion.** between
5db0: 20 74 68 65 20 42 74 72 65 65 20 61 6e 64 20 74   the Btree and t
5dc0: 68 65 20 4d 65 6d 6f 72 79 20 4d 61 6e 61 67 65  he Memory Manage
5dd0: 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 72 65 6c  ment sqlite3_rel
5de0: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 0a 2a 2a  ease_memory().**
5df0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 64   function.  It d
5e00: 6f 65 73 20 6e 6f 74 20 70 72 65 76 65 6e 74 2c  oes not prevent,
5e10: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 77   for example, tw
5e20: 6f 20 42 74 72 65 65 73 20 66 72 6f 6d 20 61 63  o Btrees from ac
5e30: 63 65 73 73 69 6e 67 0a 2a 2a 20 74 68 65 20 73  cessing.** the s
5e40: 61 6d 65 20 70 61 67 65 72 20 61 74 20 74 68 65  ame pager at the
5e50: 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 4f 74 68   same time.  Oth
5e60: 65 72 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f  er general-purpo
5e70: 73 65 20 6d 75 74 65 78 65 73 20 69 6e 0a 2a 2a  se mutexes in.**
5e80: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
5e90: 20 68 61 6e 64 6c 65 20 74 68 61 74 20 63 68 6f   handle that cho
5ea0: 72 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  re..*/.#ifdef SQ
5eb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
5ec0: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
5ed0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
5ee0: 72 45 6e 74 65 72 28 50 61 67 65 72 20 2a 70 29  rEnter(Pager *p)
5ef0: 7b 0a 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44  {.    p->iInUseD
5f00: 42 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  B++;.    if( p->
5f10: 69 49 6e 55 73 65 4d 4d 20 26 26 20 70 2d 3e 69  iInUseMM && p->i
5f20: 49 6e 55 73 65 44 42 3d 3d 31 20 29 7b 0a 23 69  InUseDB==1 ){.#i
5f30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d 55 54  fndef SQLITE_MUT
5f40: 45 58 5f 4e 4f 4f 50 0a 20 20 20 20 20 20 73 71  EX_NOOP.      sq
5f50: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
5f60: 65 78 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 20  ex;.      mutex 
5f70: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
5f80: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
5f90: 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 23  _STATIC_MEM2);.#
5fa0: 65 6e 64 69 66 0a 20 20 20 20 20 20 70 2d 3e 69  endif.      p->i
5fb0: 49 6e 55 73 65 44 42 20 3d 20 30 3b 0a 20 20 20  InUseDB = 0;.   
5fc0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
5fd0: 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20  _enter(mutex);. 
5fe0: 20 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42       p->iInUseDB
5ff0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
6000: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
6010: 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20  mutex);.    }.  
6020: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 49 6e    assert( p->iIn
6030: 55 73 65 4d 4d 3d 3d 30 20 29 3b 0a 20 20 7d 0a  UseMM==0 );.  }.
6040: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
6050: 67 65 72 4c 65 61 76 65 28 50 61 67 65 72 20 2a  gerLeave(Pager *
6060: 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49 6e 55 73  p){.    p->iInUs
6070: 65 44 42 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  eDB--;.    asser
6080: 74 28 20 70 2d 3e 69 49 6e 55 73 65 44 42 3e 3d  t( p->iInUseDB>=
6090: 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 23  0 );.  }.#else.#
60a0: 20 64 65 66 69 6e 65 20 70 61 67 65 72 45 6e 74   define pagerEnt
60b0: 65 72 28 58 29 0a 23 20 64 65 66 69 6e 65 20 70  er(X).# define p
60c0: 61 67 65 72 4c 65 61 76 65 28 58 29 0a 23 65 6e  agerLeave(X).#en
60d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70  dif../*.** Add p
60e0: 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 65  age pPg to the e
60f0: 6e 64 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64  nd of the linked
6100: 20 6c 69 73 74 20 6d 61 6e 61 67 65 64 20 62 79   list managed by
6110: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 4c   structure.** pL
6120: 69 73 74 20 28 70 50 67 20 62 65 63 6f 6d 65 73  ist (pPg becomes
6130: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
6140: 69 6e 20 74 68 65 20 6c 69 73 74 20 2d 20 74 68  in the list - th
6150: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
6160: 0a 2a 2a 20 75 73 65 64 29 2e 20 41 72 67 75 6d  .** used). Argum
6170: 65 6e 74 20 70 4c 69 6e 6b 20 73 68 6f 75 6c 64  ent pLink should
6180: 20 70 6f 69 6e 74 20 74 6f 20 65 69 74 68 65 72   point to either
6190: 20 70 50 67 2d 3e 66 72 65 65 20 6f 72 20 70 50   pPg->free or pP
61a0: 67 2d 3e 67 66 72 65 65 2c 0a 2a 2a 20 64 65 70  g->gfree,.** dep
61b0: 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
61c0: 72 20 70 50 67 20 69 73 20 62 65 69 6e 67 20 61  r pPg is being a
61d0: 64 64 65 64 20 74 6f 20 74 68 65 20 70 61 67 65  dded to the page
61e0: 72 2d 73 70 65 63 69 66 69 63 20 6f 72 0a 2a 2a  r-specific or.**
61f0: 20 67 6c 6f 62 61 6c 20 4c 52 55 20 6c 69 73 74   global LRU list
6200: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6210: 20 6c 69 73 74 41 64 64 28 50 61 67 65 72 4c 72   listAdd(PagerLr
6220: 75 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 50 61  uList *pList, Pa
6230: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 69 6e  gerLruLink *pLin
6240: 6b 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  k, PgHdr *pPg){.
6250: 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d    pLink->pNext =
6260: 20 30 3b 0a 20 20 70 4c 69 6e 6b 2d 3e 70 50 72   0;.  pLink->pPr
6270: 65 76 20 3d 20 70 4c 69 73 74 2d 3e 70 4c 61 73  ev = pList->pLas
6280: 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t;..#ifdef SQLIT
6290: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
62a0: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 61 73 73  MANAGEMENT.  ass
62b0: 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d  ert(pLink==&pPg-
62c0: 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e 6b 3d 3d  >free || pLink==
62d0: 26 70 50 67 2d 3e 67 66 72 65 65 29 3b 0a 20 20  &pPg->gfree);.  
62e0: 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70  assert(pLink==&p
62f0: 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20 70 4c 69  Pg->gfree || pLi
6300: 73 74 21 3d 26 73 71 6c 69 74 65 33 4c 72 75 50  st!=&sqlite3LruP
6310: 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66  ageList);.#endif
6320: 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70  ..  if( pList->p
6330: 4c 61 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Last ){.    int 
6340: 69 4f 66 66 20 3d 20 28 63 68 61 72 20 2a 29 70  iOff = (char *)p
6350: 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20 2a 29 70  Link - (char *)p
6360: 50 67 3b 0a 20 20 20 20 50 61 67 65 72 4c 72 75  Pg;.    PagerLru
6370: 4c 69 6e 6b 20 2a 70 4c 61 73 74 4c 69 6e 6b 20  Link *pLastLink 
6380: 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  = (PagerLruLink 
6390: 2a 29 28 26 28 28 75 38 20 2a 29 70 4c 69 73 74  *)(&((u8 *)pList
63a0: 2d 3e 70 4c 61 73 74 29 5b 69 4f 66 66 5d 29 3b  ->pLast)[iOff]);
63b0: 0a 20 20 20 20 70 4c 61 73 74 4c 69 6e 6b 2d 3e  .    pLastLink->
63c0: 70 4e 65 78 74 20 3d 20 70 50 67 3b 0a 20 20 7d  pNext = pPg;.  }
63d0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
63e0: 28 21 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 29  (!pList->pFirst)
63f0: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69  ;.    pList->pFi
6400: 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 0a  rst = pPg;.  }..
6410: 20 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20 3d    pList->pLast =
6420: 20 70 50 67 3b 0a 20 20 69 66 28 20 21 70 4c 69   pPg;.  if( !pLi
6430: 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  st->pFirstSynced
6440: 20 26 26 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e   && pPg->needSyn
6450: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  c==0 ){.    pLis
6460: 74 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  t->pFirstSynced 
6470: 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = pPg;.  }.}../*
6480: 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 50 67 20 66  .** Remove pPg f
6490: 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6d 61 6e  rom the list man
64a0: 61 67 65 64 20 62 79 20 74 68 65 20 73 74 72 75  aged by the stru
64b0: 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
64c0: 20 62 79 20 70 4c 69 73 74 2e 0a 2a 2a 0a 2a 2a   by pList..**.**
64d0: 20 41 72 67 75 6d 65 6e 74 20 70 4c 69 6e 6b 20   Argument pLink 
64e0: 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20  should point to 
64f0: 65 69 74 68 65 72 20 70 50 67 2d 3e 66 72 65 65  either pPg->free
6500: 20 6f 72 20 70 50 67 2d 3e 67 66 72 65 65 2c 20   or pPg->gfree, 
6510: 64 65 70 65 6e 64 69 6e 67 20 0a 2a 2a 20 6f 6e  depending .** on
6520: 20 77 68 65 74 68 65 72 20 70 50 67 20 69 73 20   whether pPg is 
6530: 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74  being added to t
6540: 68 65 20 70 61 67 65 72 2d 73 70 65 63 69 66 69  he pager-specifi
6550: 63 20 6f 72 20 67 6c 6f 62 61 6c 20 4c 52 55 20  c or global LRU 
6560: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
6570: 76 6f 69 64 20 6c 69 73 74 52 65 6d 6f 76 65 28  void listRemove(
6580: 50 61 67 65 72 4c 72 75 4c 69 73 74 20 2a 70 4c  PagerLruList *pL
6590: 69 73 74 2c 20 50 61 67 65 72 4c 72 75 4c 69 6e  ist, PagerLruLin
65a0: 6b 20 2a 70 4c 69 6e 6b 2c 20 50 67 48 64 72 20  k *pLink, PgHdr 
65b0: 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 69 4f 66  *pPg){.  int iOf
65c0: 66 20 3d 20 28 63 68 61 72 20 2a 29 70 4c 69 6e  f = (char *)pLin
65d0: 6b 20 2d 20 28 63 68 61 72 20 2a 29 70 50 67 3b  k - (char *)pPg;
65e0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
65f0: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
6600: 4e 41 47 45 4d 45 4e 54 0a 20 20 61 73 73 65 72  NAGEMENT.  asser
6610: 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 66  t(pLink==&pPg->f
6620: 72 65 65 20 7c 7c 20 70 4c 69 6e 6b 3d 3d 26 70  ree || pLink==&p
6630: 50 67 2d 3e 67 66 72 65 65 29 3b 0a 20 20 61 73  Pg->gfree);.  as
6640: 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67  sert(pLink==&pPg
6650: 2d 3e 67 66 72 65 65 20 7c 7c 20 70 4c 69 73 74  ->gfree || pList
6660: 21 3d 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67  !=&sqlite3LruPag
6670: 65 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  eList);.#endif..
6680: 20 20 69 66 28 20 70 50 67 3d 3d 70 4c 69 73 74    if( pPg==pList
6690: 2d 3e 70 46 69 72 73 74 20 29 7b 0a 20 20 20 20  ->pFirst ){.    
66a0: 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 20 3d 20  pList->pFirst = 
66b0: 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLink->pNext;.  
66c0: 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 4c 69  }.  if( pPg==pLi
66d0: 73 74 2d 3e 70 4c 61 73 74 20 29 7b 0a 20 20 20  st->pLast ){.   
66e0: 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20 3d 20   pList->pLast = 
66f0: 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 3b 0a 20 20  pLink->pPrev;.  
6700: 7d 0a 20 20 69 66 28 20 70 4c 69 6e 6b 2d 3e 70  }.  if( pLink->p
6710: 50 72 65 76 20 29 7b 0a 20 20 20 20 50 61 67 65  Prev ){.    Page
6720: 72 4c 72 75 4c 69 6e 6b 20 2a 70 50 72 65 76 4c  rLruLink *pPrevL
6730: 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c  ink = (PagerLruL
6740: 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70  ink *)(&((u8 *)p
6750: 4c 69 6e 6b 2d 3e 70 50 72 65 76 29 5b 69 4f 66  Link->pPrev)[iOf
6760: 66 5d 29 3b 0a 20 20 20 20 70 50 72 65 76 4c 69  f]);.    pPrevLi
6770: 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 69 6e  nk->pNext = pLin
6780: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  k->pNext;.  }.  
6790: 69 66 28 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74  if( pLink->pNext
67a0: 20 29 7b 0a 20 20 20 20 50 61 67 65 72 4c 72 75   ){.    PagerLru
67b0: 4c 69 6e 6b 20 2a 70 4e 65 78 74 4c 69 6e 6b 20  Link *pNextLink 
67c0: 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  = (PagerLruLink 
67d0: 2a 29 28 26 28 28 75 38 20 2a 29 70 4c 69 6e 6b  *)(&((u8 *)pLink
67e0: 2d 3e 70 4e 65 78 74 29 5b 69 4f 66 66 5d 29 3b  ->pNext)[iOff]);
67f0: 0a 20 20 20 20 70 4e 65 78 74 4c 69 6e 6b 2d 3e  .    pNextLink->
6800: 70 50 72 65 76 20 3d 20 70 4c 69 6e 6b 2d 3e 70  pPrev = pLink->p
6810: 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Prev;.  }.  if( 
6820: 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70 46 69 72  pPg==pList->pFir
6830: 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20  stSynced ){.    
6840: 50 67 48 64 72 20 2a 70 20 3d 20 70 4c 69 6e 6b  PgHdr *p = pLink
6850: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 77 68 69  ->pNext;.    whi
6860: 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64  le( p && p->need
6870: 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 50 61  Sync ){.      Pa
6880: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 20 3d  gerLruLink *pL =
6890: 20 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a   (PagerLruLink *
68a0: 29 28 26 28 28 75 38 20 2a 29 70 29 5b 69 4f 66  )(&((u8 *)p)[iOf
68b0: 66 5d 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 70  f]);.      p = p
68c0: 4c 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  L->pNext;.    }.
68d0: 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73      pList->pFirs
68e0: 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d  tSynced = p;.  }
68f0: 0a 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74  ..  pLink->pNext
6900: 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20   = pLink->pPrev 
6910: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41  = 0;.}../* .** A
6920: 64 64 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  dd page pPg to t
6930: 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20  he list of free 
6940: 70 61 67 65 73 20 66 6f 72 20 74 68 65 20 70 61  pages for the pa
6950: 67 65 72 2e 20 49 66 20 0a 2a 2a 20 6d 65 6d 6f  ger. If .** memo
6960: 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73  ry-management is
6970: 20 65 6e 61 62 6c 65 64 2c 20 61 6c 73 6f 20 61   enabled, also a
6980: 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  dd the page to t
6990: 68 65 20 67 6c 6f 62 61 6c 20 0a 2a 2a 20 6c 69  he global .** li
69a0: 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73  st of free pages
69b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
69c0: 20 6c 72 75 4c 69 73 74 41 64 64 28 50 67 48 64   lruListAdd(PgHd
69d0: 72 20 2a 70 50 67 29 7b 0a 20 20 6c 69 73 74 41  r *pPg){.  listA
69e0: 64 64 28 26 70 50 67 2d 3e 70 50 61 67 65 72 2d  dd(&pPg->pPager-
69f0: 3e 6c 72 75 2c 20 26 70 50 67 2d 3e 66 72 65 65  >lru, &pPg->free
6a00: 2c 20 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53  , pPg);.#ifdef S
6a10: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
6a20: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
6a30: 20 69 66 28 20 21 70 50 67 2d 3e 70 50 61 67 65   if( !pPg->pPage
6a40: 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
6a50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
6a60: 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ter(sqlite3Mutex
6a70: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
6a80: 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
6a90: 0a 20 20 20 20 6c 69 73 74 41 64 64 28 26 73 71  .    listAdd(&sq
6aa0: 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
6ab0: 2c 20 26 70 50 67 2d 3e 67 66 72 65 65 2c 20 70  , &pPg->gfree, p
6ac0: 50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Pg);.    sqlite3
6ad0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
6ae0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
6af0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
6b00: 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23 65  IC_LRU));.  }.#e
6b10: 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52  ndif.}../* .** R
6b20: 65 6d 6f 76 65 20 70 61 67 65 20 70 50 67 20 66  emove page pPg f
6b30: 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rom the list of 
6b40: 66 72 65 65 20 70 61 67 65 73 20 66 6f 72 20 74  free pages for t
6b50: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 70 61  he associated pa
6b60: 67 65 72 2e 0a 2a 2a 20 49 66 20 6d 65 6d 6f 72  ger..** If memor
6b70: 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20  y-management is 
6b80: 65 6e 61 62 6c 65 64 2c 20 61 6c 73 6f 20 72 65  enabled, also re
6b90: 6d 6f 76 65 20 70 50 67 20 66 72 6f 6d 20 74 68  move pPg from th
6ba0: 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 0a 2a 2a  e global list.**
6bb0: 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 2e 0a   of free pages..
6bc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
6bd0: 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 50 67 48  ruListRemove(PgH
6be0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 6c 69 73 74  dr *pPg){.  list
6bf0: 52 65 6d 6f 76 65 28 26 70 50 67 2d 3e 70 50 61  Remove(&pPg->pPa
6c00: 67 65 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d 3e  ger->lru, &pPg->
6c10: 66 72 65 65 2c 20 70 50 67 29 3b 0a 23 69 66 64  free, pPg);.#ifd
6c20: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6c30: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
6c40: 4e 54 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 70  NT.  if( !pPg->p
6c50: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
6c60: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
6c70: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d  x_enter(sqlite3M
6c80: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
6c90: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52  _MUTEX_STATIC_LR
6ca0: 55 29 29 3b 0a 20 20 20 20 6c 69 73 74 52 65 6d  U));.    listRem
6cb0: 6f 76 65 28 26 73 71 6c 69 74 65 33 4c 72 75 50  ove(&sqlite3LruP
6cc0: 61 67 65 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67  ageList, &pPg->g
6cd0: 66 72 65 65 2c 20 70 50 67 29 3b 0a 20 20 20 20  free, pPg);.    
6ce0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
6cf0: 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ave(sqlite3Mutex
6d00: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
6d10: 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
6d20: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
6d30: 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  * .** This funct
6d40: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6a 75  ion is called ju
6d50: 73 74 20 61 66 74 65 72 20 74 68 65 20 6e 65 65  st after the nee
6d60: 64 53 79 6e 63 20 66 6c 61 67 20 68 61 73 20 62  dSync flag has b
6d70: 65 65 6e 20 63 6c 65 61 72 65 64 0a 2a 2a 20 66  een cleared.** f
6d80: 72 6f 6d 20 61 6c 6c 20 70 61 67 65 73 20 6d 61  rom all pages ma
6d90: 6e 61 67 65 64 20 62 79 20 70 50 61 67 65 72 20  naged by pPager 
6da0: 28 75 73 75 61 6c 6c 79 20 62 65 63 61 75 73 65  (usually because
6db0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6dc0: 65 0a 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65  e.** has just be
6dd0: 65 6e 20 73 79 6e 63 65 64 29 2e 20 49 74 20 75  en synced). It u
6de0: 70 64 61 74 65 73 20 74 68 65 20 70 50 61 67 65  pdates the pPage
6df0: 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e  r->lru.pFirstSyn
6e00: 63 65 64 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  ced variable.** 
6e10: 61 6e 64 2c 20 69 66 20 6d 65 6d 6f 72 79 2d 6d  and, if memory-m
6e20: 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61  anagement is ena
6e30: 62 6c 65 64 2c 20 74 68 65 20 73 71 6c 69 74 65  bled, the sqlite
6e40: 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69  3LruPageList.pFi
6e50: 72 73 74 53 79 6e 63 65 64 0a 2a 2a 20 76 61 72  rstSynced.** var
6e60: 69 61 62 6c 65 20 61 6c 73 6f 2e 0a 2a 2f 0a 73  iable also..*/.s
6e70: 74 61 74 69 63 20 76 6f 69 64 20 6c 72 75 4c 69  tatic void lruLi
6e80: 73 74 53 65 74 46 69 72 73 74 53 79 6e 63 65 64  stSetFirstSynced
6e90: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
6ea0: 0a 20 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  .  pPager->lru.p
6eb0: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
6ec0: 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
6ed0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6ee0: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
6ef0: 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NAGEMENT.  if( !
6f00: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
6f10: 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  .    PgHdr *p;. 
6f20: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
6f30: 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75  _enter(sqlite3Mu
6f40: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
6f50: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55  MUTEX_STATIC_LRU
6f60: 29 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71  ));.    for(p=sq
6f70: 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
6f80: 2e 70 46 69 72 73 74 3b 20 70 20 26 26 20 70 2d  .pFirst; p && p-
6f90: 3e 6e 65 65 64 53 79 6e 63 3b 20 70 3d 70 2d 3e  >needSync; p=p->
6fa0: 67 66 72 65 65 2e 70 4e 65 78 74 29 3b 0a 20 20  gfree.pNext);.  
6fb0: 20 20 61 73 73 65 72 74 28 70 3d 3d 70 50 61 67    assert(p==pPag
6fc0: 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79  er->lru.pFirstSy
6fd0: 6e 63 65 64 20 7c 7c 20 70 3d 3d 73 71 6c 69 74  nced || p==sqlit
6fe0: 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46  e3LruPageList.pF
6ff0: 69 72 73 74 53 79 6e 63 65 64 29 3b 0a 20 20 20  irstSynced);.   
7000: 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c   sqlite3LruPageL
7010: 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64  ist.pFirstSynced
7020: 20 3d 20 70 3b 0a 20 20 20 20 73 71 6c 69 74 65   = p;.    sqlite
7030: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
7040: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
7050: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
7060: 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23  TIC_LRU));.  }.#
7070: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
7080: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 70 61  eturn true if pa
7090: 67 65 20 2a 70 50 67 20 68 61 73 20 61 6c 72 65  ge *pPg has alre
70a0: 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
70b0: 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e   to the statemen
70c0: 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 6f 72  t.** journal (or
70d0: 20 73 74 61 74 65 6d 65 6e 74 20 73 6e 61 70 73   statement snaps
70e0: 68 6f 74 20 68 61 73 20 62 65 65 6e 20 63 72 65  hot has been cre
70f0: 61 74 65 64 2c 20 69 66 20 2a 70 50 67 20 69 73  ated, if *pPg is
7100: 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 6e 20 69   part.** of an i
7110: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
7120: 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
7130: 74 20 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e  t pageInStatemen
7140: 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
7150: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
7160: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
7170: 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
7180: 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f   return PGHDR_TO
7190: 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
71a0: 72 29 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20 7d 65  r)->inStmt;.  }e
71b0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
71c0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
71d0: 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d  t(pPager->pInStm
71e0: 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  t, pPg->pgno);. 
71f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
7200: 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ge the size of t
7210: 68 65 20 70 61 67 65 72 20 68 61 73 68 20 74 61  he pager hash ta
7220: 62 6c 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73  ble to N.  N mus
7230: 74 20 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t be a power.** 
7240: 6f 66 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69  of two..*/.stati
7250: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
7260: 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50  ize_hash_table(P
7270: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
7280: 74 20 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a  t N){.  PgHdr **
7290: 61 48 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61  aHash, *pPg;.  a
72a0: 73 73 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e  ssert( N>0 && (N
72b0: 26 28 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 23 69  &(N-1))==0 );.#i
72c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 41 4c 4c  fdef SQLITE_MALL
72d0: 4f 43 5f 53 4f 46 54 5f 4c 49 4d 49 54 0a 20 20  OC_SOFT_LIMIT.  
72e0: 69 66 28 20 4e 2a 73 69 7a 65 6f 66 28 61 48 61  if( N*sizeof(aHa
72f0: 73 68 5b 30 5d 29 3e 53 51 4c 49 54 45 5f 4d 41  sh[0])>SQLITE_MA
7300: 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49 4d 49 54 20  LLOC_SOFT_LIMIT 
7310: 29 7b 0a 20 20 20 20 4e 20 3d 20 53 51 4c 49 54  ){.    N = SQLIT
7320: 45 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49  E_MALLOC_SOFT_LI
7330: 4d 49 54 2f 73 69 7a 65 6f 66 28 61 48 61 73 68  MIT/sizeof(aHash
7340: 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [0]);.  }.  if( 
7350: 4e 3d 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  N==pPager->nHash
7360: 20 29 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69   ) return;.#endi
7370: 66 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  f.  pagerLeave(p
7380: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
7390: 61 67 65 72 2d 3e 61 48 61 73 68 21 3d 30 20 29  ager->aHash!=0 )
73a0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
73b0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 61  ignMalloc();.  a
73c0: 48 61 73 68 20 3d 20 73 71 6c 69 74 65 33 4d 61  Hash = sqlite3Ma
73d0: 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
73e0: 28 61 48 61 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a  (aHash[0])*N );.
73f0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48    if( pPager->aH
7400: 61 73 68 21 3d 30 20 29 20 73 71 6c 69 74 65 33  ash!=0 ) sqlite3
7410: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
7420: 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  );.  pagerEnter(
7430: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 61  pPager);.  if( a
7440: 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Hash==0 ){.    /
7450: 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65 68  * Failure to reh
7460: 61 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65 72  ash is not an er
7470: 72 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ror.  It is only
7480: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68   a performance h
7490: 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  it. */.    retur
74a0: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
74b0: 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48  _free(pPager->aH
74c0: 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ash);.  pPager->
74d0: 6e 48 61 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61  nHash = N;.  pPa
74e0: 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 61 48 61  ger->aHash = aHa
74f0: 73 68 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  sh;.  for(pPg=pP
7500: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
7510: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
7520: 6c 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a  ll){.    int h;.
7530: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
7540: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  o==0 ){.      as
7550: 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
7560: 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e  Hash==0 && pPg->
7570: 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
7580: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
7590: 20 20 20 20 7d 0a 20 20 20 20 68 20 3d 20 70 50      }.    h = pP
75a0: 67 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b  g->pgno & (N-1);
75b0: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
75c0: 61 73 68 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a  ash = aHash[h];.
75d0: 20 20 20 20 69 66 28 20 61 48 61 73 68 5b 68 5d      if( aHash[h]
75e0: 20 29 7b 0a 20 20 20 20 20 20 61 48 61 73 68 5b   ){.      aHash[
75f0: 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  h]->pPrevHash = 
7600: 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  pPg;.    }.    a
7610: 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
7620: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73     pPg->pPrevHas
7630: 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  h = 0;.  }.}../*
7640: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
7650: 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  t integer from t
7660: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
7670: 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65  scriptor.  Store
7680: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
7690: 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20  that is read in 
76a0: 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53  *pRes.  Return S
76b0: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
76c0: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f  ything worked, o
76d0: 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  r an.** error co
76e0: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
76f0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
7700: 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65  * All values are
7710: 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20   stored on disk 
7720: 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a  as big-endian..*
7730: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
7740: 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  d32bits(sqlite3_
7750: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
7760: 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29  fset, u32 *pRes)
7770: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
7780: 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72  r ac[4];.  int r
7790: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
77a0: 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66  d(fd, ac, sizeof
77b0: 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20  (ac), offset);. 
77c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
77d0: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  OK ){.    *pRes 
77e0: 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
77f0: 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(ac);.  }.  ret
7800: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7810: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
7820: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
7830: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
7840: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
7850: 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  order..*/.#defin
7860: 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29  e put32bits(A,B)
7870: 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74    sqlite3Put4byt
7880: 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a  e((u8*)A,B)../*.
7890: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
78a0: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74  t integer into t
78b0: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
78c0: 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72  scriptor.  Retur
78d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
78e0: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
78f0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
7900: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
7910: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
7920: 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71  t write32bits(sq
7930: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
7940: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
7950: 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b  val){.  char ac[
7960: 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  4];.  put32bits(
7970: 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75  ac, val);.  retu
7980: 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  rn sqlite3OsWrit
7990: 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66  e(fd, ac, 4, off
79a0: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  set);.}../*.** I
79b0: 66 20 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70  f file pFd is op
79c0: 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  en, call sqlite3
79d0: 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74  OsUnlock() on it
79e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
79f0: 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  osUnlock(sqlite3
7a00: 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20  _file *pFd, int 
7a10: 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 70  eLock){.  if( !p
7a20: 46 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  Fd->pMethods ){.
7a30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7a40: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
7a50: 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  rn sqlite3OsUnlo
7a60: 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a  ck(pFd, eLock);.
7a70: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
7a80: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
7a90: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
7aa0: 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
7ab0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
7ac0: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69  * can be used wi
7ad0: 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54  th this pager. T
7ae0: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
7af0: 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a  can be used if:.
7b00: 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76  **.**  (a) the v
7b10: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
7b20: 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74   OsDeviceCharact
7b30: 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63  eristics() indic
7b40: 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  ates that.**    
7b50: 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67    a database pag
7b60: 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  e may be written
7b70: 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64   atomically, and
7b80: 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c  .**  (b) the val
7b90: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
7ba0: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73  sSectorSize() is
7bb0: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
7bc0: 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ual.**      to t
7bd0: 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
7be0: 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d  .** If the optim
7bf0: 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ization cannot b
7c00: 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74  e used, 0 is ret
7c10: 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e  urned. If it can
7c20: 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65   be used,.** the
7c30: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
7c40: 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65  rned is the size
7c50: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
7c60: 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20  file when it.** 
7c70: 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63  contains rollbac
7c80: 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74  k data for exact
7c90: 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a  ly one page..*/.
7ca0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
7cb0: 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
7cc0: 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e  E.static int jrn
7cd0: 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65  lBufferSize(Page
7ce0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
7cf0: 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20  t dc;           
7d00: 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63  /* Device charac
7d10: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 69  teristics */.  i
7d20: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
7d30: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
7d40: 2a 2f 0a 20 20 69 6e 74 20 73 7a 50 61 67 65 3b  */.  int szPage;
7d50: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
7d60: 73 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  size */.  sqlite
7d70: 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61  3_file *fd = pPa
7d80: 67 65 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28 20  ger->fd;..  if( 
7d90: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
7da0: 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33      dc = sqlite3
7db0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
7dc0: 72 69 73 74 69 63 73 28 66 64 29 3b 0a 20 20 20  ristics(fd);.   
7dd0: 20 6e 53 65 63 74 6f 72 20 3d 20 73 71 6c 69 74   nSector = sqlit
7de0: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66  e3OsSectorSize(f
7df0: 64 29 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d  d);.    szPage =
7e00: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
7e10: 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  e;.  }..  assert
7e20: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
7e30: 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
7e40: 29 29 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c  ));.  assert(SQL
7e50: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
7e60: 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
7e70: 3b 0a 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d  ;..  if( !fd->pM
7e80: 65 74 68 6f 64 73 20 7c 7c 20 0a 20 20 20 20 20  ethods || .     
7e90: 20 20 28 64 63 20 26 20 28 53 51 4c 49 54 45 5f    (dc & (SQLITE_
7ea0: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a  IOCAP_ATOMIC|(sz
7eb0: 50 61 67 65 3e 3e 38 29 29 20 26 26 20 6e 53 65  Page>>8)) && nSe
7ec0: 63 74 6f 72 3c 3d 73 7a 50 61 67 65 29 20 29 7b  ctor<=szPage) ){
7ed0: 0a 20 20 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  .    return JOUR
7ee0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
7ef0: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
7f00: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
7f10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
7f20: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
7f30: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
7f40: 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
7f50: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
7f60: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 72  within the pager
7f70: 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69  .** code. The fi
7f80: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
7f90: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
7fa0: 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65   pager structure
7fb0: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
7fc0: 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
7fd0: 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
7fe0: 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41  ned by a pager A
7ff0: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  PI function. .**
8000: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
8010: 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
8020: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
8030: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
8040: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
8050: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
8060: 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49  ment is SQLITE_I
8070: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
8080: 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f  RUPT, or SQLITE_
8090: 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  FULL.** the erro
80a0: 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73  r becomes persis
80b0: 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20  tent. Until the 
80c0: 70 65 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20  persisten error 
80d0: 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73  is cleared,.** s
80e0: 75 62 73 65 71 75 65 6e 74 20 41 50 49 20 63 61  ubsequent API ca
80f0: 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65  lls on this Page
8100: 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  r will immediate
8110: 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ly return the sa
8120: 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  me .** error cod
8130: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69  e..**.** A persi
8140: 73 74 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69  stent error indi
8150: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63  cates that the c
8160: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
8170: 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63  ager-cache .** c
8180: 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
8190: 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e  . This state can
81a0: 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63   be cleared by c
81b0: 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72  ompletely discar
81c0: 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ding .** the con
81d0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
81e0: 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74  er-cache. If a t
81f0: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61  ransaction was a
8200: 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68  ctive when.** th
8210: 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  e persistent err
8220: 6f 72 20 6f 63 63 75 72 65 64 2c 20 74 68 65 6e  or occured, then
8230: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
8240: 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a  urnal may need.*
8250: 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64  * to be replayed
8260: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8270: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61   pager_unlock(Pa
8280: 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 73 74  ger *pPager);.st
8290: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
82a0: 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
82b0: 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
82c0: 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
82d0: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20  ff;.  assert(.  
82e0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
82f0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
8300: 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67  L ||.       pPag
8310: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
8320: 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20  ITE_OK ||.      
8330: 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   (pPager->errCod
8340: 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54  e & 0xff)==SQLIT
8350: 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69  E_IOERR.  );.  i
8360: 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49  f(.    rc2==SQLI
8370: 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72  TE_FULL ||.    r
8380: 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  c2==SQLITE_IOERR
8390: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
83a0: 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b  ITE_CORRUPT.  ){
83b0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
83c0: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 69  Code = rc;.    i
83d0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
83e0: 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 26  ==PAGER_UNLOCK &
83f0: 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  & pPager->nRef==
8400: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
8410: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   the pager is al
8420: 72 65 61 64 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ready unlocked, 
8430: 63 61 6c 6c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  call pager_unloc
8440: 6b 28 29 20 6e 6f 77 20 74 6f 0a 20 20 20 20 20  k() now to.     
8450: 20 2a 2a 20 63 6c 65 61 72 20 74 68 65 20 65 72   ** clear the er
8460: 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 65 6e  ror state and en
8470: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61  sure that the pa
8480: 67 65 72 2d 63 61 63 68 65 20 69 73 20 0a 20 20  ger-cache is .  
8490: 20 20 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c      ** completel
84a0: 79 20 65 6d 70 74 79 2e 0a 20 20 20 20 20 20 2a  y empty..      *
84b0: 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e  /.      pager_un
84c0: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
84d0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
84e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
84f0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
8500: 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74  GES is defined t
8510: 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73  hen we do some s
8520: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a  anity checking.*
8530: 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75  * on the cache u
8540: 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63  sing a hash func
8550: 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75  tion.  This is u
8560: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a  sed for testing.
8570: 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ** and debugging
8580: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66   only..*/.#ifdef
8590: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
85a0: 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  GES./*.** Return
85b0: 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f   a 32-bit hash o
85c0: 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  f the page data 
85d0: 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74  for pPage..*/.st
85e0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64  atic u32 pager_d
85f0: 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74  atahash(int nByt
8600: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
8610: 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *pData){.  u32 
8620: 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20  hash = 0;.  int 
8630: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
8640: 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nByte; i++){.   
8650: 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30   hash = (hash*10
8660: 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a  39) + pData[i];.
8670: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
8680: 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20  h;.}.static u32 
8690: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50  pager_pagehash(P
86a0: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
86b0: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74  return pager_dat
86c0: 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61  ahash(pPage->pPa
86d0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 0a  ger->pageSize, .
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86f0: 20 20 20 20 20 20 20 20 28 75 6e 73 69 67 6e 65          (unsigne
8700: 64 20 63 68 61 72 20 2a 29 50 47 48 44 52 5f 54  d char *)PGHDR_T
8710: 4f 5f 44 41 54 41 28 70 50 61 67 65 29 29 3b 0a  O_DATA(pPage));.
8720: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
8730: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
8740: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
8750: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
8760: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
8770: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
8780: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
8790: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
87a0: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
87b0: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
87c0: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
87d0: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
87e0: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
87f0: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
8800: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
8810: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
8820: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
8830: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
8840: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
8850: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
8860: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
8870: 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61  assert( !pPg->pa
8880: 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72  geHash || pPager
8890: 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d  ->errCode || MEM
88a0: 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79  DB || pPg->dirty
88b0: 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e   || .      pPg->
88c0: 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f  pageHash==pager_
88d0: 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b  pagehash(pPg) );
88e0: 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  .}..#else.#defin
88f0: 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  e pager_datahash
8900: 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65  (X,Y)  0.#define
8910: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
8920: 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 43 48  X)  0.#define CH
8930: 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64  ECK_PAGE(x).#end
8940: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  if../*.** When t
8950: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
8960: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
8970: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
8980: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
8990: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
89a0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
89b0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 65   read from the e
89c0: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
89d0: 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69  nd .** written i
89e0: 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c  nto memory suppl
89f0: 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ied by the calle
8a00: 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65  r. .**.** zMaste
8a10: 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  r must point to 
8a20: 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c  a buffer of at l
8a30: 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74  east nMaster byt
8a40: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  es allocated by.
8a50: 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  ** the caller. T
8a60: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71  his should be sq
8a70: 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
8a80: 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72  name+1 (to ensur
8a90: 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e  e there is.** en
8aa0: 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77 72  ough space to wr
8ab0: 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
8ac0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66  ournal name). If
8ad0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8ae0: 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74  nal.** name in t
8af0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f  he journal is lo
8b00: 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65  nger than nMaste
8b10: 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69  r bytes (includi
8b20: 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  ng a.** nul-term
8b30: 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68  inator), then th
8b40: 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73  is is handled as
8b50: 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   if no master jo
8b60: 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65  urnal name.** we
8b70: 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  re present in th
8b80: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
8b90: 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   If no master jo
8ba0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
8bb0: 69 73 20 70 72 65 73 65 6e 74 20 7a 4d 61 73 74  is present zMast
8bc0: 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20  er[0] is set to 
8bd0: 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  0 and.** SQLITE_
8be0: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
8bf0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
8c00: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c  asterJournal(sql
8c10: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c  ite3_file *pJrnl
8c20: 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  , char *zMaster,
8c30: 20 69 6e 74 20 6e 4d 61 73 74 65 72 29 7b 0a 20   int nMaster){. 
8c40: 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c   int rc;.  u32 l
8c50: 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20  en;.  i64 szJ;. 
8c60: 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 75 33   u32 cksum;.  u3
8c70: 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
8c80: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
8c90: 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
8ca0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
8cb0: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a  ar aMagic[8]; /*
8cc0: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
8cd0: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
8ce0: 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61 73 74 65 72  er */..  zMaster
8cf0: 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 72  [0] = '\0';..  r
8d00: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
8d10: 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a  eSize(pJrnl, &sz
8d20: 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
8d30: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31  LITE_OK || szJ<1
8d40: 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  6 ) return rc;..
8d50: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
8d60: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c  s(pJrnl, szJ-16,
8d70: 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63   &len);.  if( rc
8d80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
8d90: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
8da0: 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 29 7b 0a  len>=nMaster ){.
8db0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8dc0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
8dd0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
8de0: 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73  nl, szJ-12, &cks
8df0: 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  um);.  if( rc!=S
8e00: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
8e10: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
8e20: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
8e30: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a  l, aMagic, 8, sz
8e40: 4a 2d 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  J-8);.  if( rc!=
8e50: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d  SQLITE_OK || mem
8e60: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
8e70: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20  rnalMagic, 8) ) 
8e80: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
8e90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
8ea0: 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c  (pJrnl, zMaster,
8eb0: 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e   len, szJ-16-len
8ec0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
8ed0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
8ee0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 7a  turn rc;.  }.  z
8ef0: 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c  Master[len] = '\
8f00: 30 27 3b 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66  0';..  /* See if
8f10: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61   the checksum ma
8f20: 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72  tches the master
8f30: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
8f40: 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65  .  for(u=0; u<le
8f50: 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; u++){.    cks
8f60: 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d  um -= zMaster[u]
8f70: 3b 0a 20 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ;.   }.  if( cks
8f80: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
8f90: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
8fa0: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
8fb0: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
8fc0: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
8fd0: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
8fe0: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
8ff0: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
9000: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
9010: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
9020: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
9030: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
9040: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
9050: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
9060: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
9070: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
9080: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61  ..    */.    zMa
9090: 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ster[0] = '\0';.
90a0: 20 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e    }.   .  return
90b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
90c0: 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f  *.** Seek the jo
90d0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
90e0: 69 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  iptor to the nex
90f0: 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
9100: 79 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75  y where a.** jou
9110: 72 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20  rnal header may 
9120: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
9130: 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  en. Pager.journa
9140: 6c 4f 66 66 20 69 73 20 75 70 64 61 74 65 64 20  lOff is updated 
9150: 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20  with.** the new 
9160: 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a  seek offset..**.
9170: 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63  ** i.e for a sec
9180: 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a  tor size of 512:
9190: 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66  .**.** Input Off
91a0: 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20  set             
91b0: 20 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a   Output Offset.*
91c0: 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
91d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20  ---------.** 0  
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9200: 20 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20         0.** 512 
9210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9220: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30        512.** 100
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9240: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30         512.** 20
9250: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
9260: 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20          2048.** 
9270: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9280: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50  seekJournalHdr(P
9290: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
92a0: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
92b0: 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65  .  i64 c = pPage
92c0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
92d0: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66   if( c ){.    of
92e0: 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f  fset = ((c-1)/JO
92f0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
9300: 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52  ger) + 1) * JOUR
9310: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
9320: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
9330: 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c  ( offset%JOURNAL
9340: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
9350: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9360: 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61  offset>=c );.  a
9370: 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63  ssert( (offset-c
9380: 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )<JOURNAL_HDR_SZ
9390: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50  (pPager) );.  pP
93a0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
93b0: 20 3d 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a   = offset;.}../*
93c0: 0a 2a 2a 20 57 72 69 74 65 20 7a 65 72 6f 73 20  .** Write zeros 
93d0: 6f 76 65 72 20 74 68 65 20 68 65 61 64 65 72 20  over the header 
93e0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
93f0: 69 6c 65 2e 20 20 54 68 69 73 20 68 61 73 20 74  ile.  This has t
9400: 68 65 0a 2a 2a 20 65 66 66 65 63 74 20 6f 66 20  he.** effect of 
9410: 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65  invalidating the
9420: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
9430: 64 20 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65  d committing the
9440: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
9450: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .*/.static int z
9460: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eroJournalHdr(Pa
9470: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
9480: 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20   doTruncate){.  
9490: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
94a0: 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  OK;.  static con
94b0: 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b  st char zeroHdr[
94c0: 32 38 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  28];..  if( pPag
94d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
94e0: 7b 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74  {.    i64 iLimit
94f0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
9500: 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 0a 20 20  alSizeLimit;..  
9510: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52    IOTRACE(("JZER
9520: 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67  OHDR %p\n", pPag
9530: 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54  er)).    if( doT
9540: 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69  runcate || iLimi
9550: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
9560: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
9570: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
9580: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
9590: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
95a0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
95b0: 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c  r->jfd, zeroHdr,
95c0: 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29   sizeof(zeroHdr)
95d0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
95e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
95f0: 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  K && !pPager->no
9600: 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63  Sync ){.      rc
9610: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
9620: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
9630: 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
9640: 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  LY|pPager->sync_
9650: 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  flags);.    }.. 
9660: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
9670: 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  int the transact
9680: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
9690: 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c   but the write l
96a0: 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73  ock .    ** is s
96b0: 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
96c0: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
96d0: 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20  is a size limit 
96e0: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a  configured for .
96f0: 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69      ** the persi
9700: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  stent journal an
9710: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
9720: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
9730: 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a  sumes more.    *
9740: 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61  * space than tha
9750: 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66  t limit allows f
9760: 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20  or, truncate it 
9770: 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  now. There is no
9780: 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
9790: 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f  sync the file fo
97a0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
97b0: 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ration..    */. 
97c0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
97d0: 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30  E_OK && iLimit>0
97e0: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a   ){.      i64 sz
97f0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
9800: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
9810: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29  Pager->jfd, &sz)
9820: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
9830: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e  SQLITE_OK && sz>
9840: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
9850: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9860: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
9870: 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  >jfd, iLimit);. 
9880: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9890: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
98a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
98b0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
98c0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
98d0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
98e0: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
98f0: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
9900: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
9910: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
9920: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
9930: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
9940: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
9950: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
9960: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
9970: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
9980: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
9990: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
99a0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
99b0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
99c0: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
99d0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
99e0: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
99f0: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
9a00: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
9a10: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
9a20: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
9a30: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
9a40: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
9a50: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
9a60: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
9a70: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
9a80: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
9a90: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20  journal..** - 4 
9aa0: 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20  bytes: Database 
9ab0: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a  page size..** .*
9ac0: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
9ad0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
9ae0: 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  28) bytes of unu
9af0: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
9b00: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
9b10: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
9b20: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
9b30: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
9b40: 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d   char *zHeader =
9b50: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
9b60: 63 65 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65  ce;.  int nHeade
9b70: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  r = pPager->page
9b80: 53 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 57 72 69  Size;.  int nWri
9b90: 74 65 3b 0a 0a 20 20 69 66 28 20 6e 48 65 61 64  te;..  if( nHead
9ba0: 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  er>JOURNAL_HDR_S
9bb0: 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
9bc0: 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e   nHeader = JOURN
9bd0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9be0: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  );.  }..  if( pP
9bf0: 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
9c00: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ==0 ){.    pPage
9c10: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20  r->stmtHdrOff = 
9c20: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9c30: 66 66 3b 0a 20 20 7d 0a 0a 20 20 73 65 65 6b 4a  ff;.  }..  seekJ
9c40: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
9c50: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
9c60: 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
9c70: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
9c80: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
9c90: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
9ca0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
9cb0: 61 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20  agic));..  /* . 
9cc0: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
9cd0: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
9ce0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
9cf0: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
9d00: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
9d10: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
9d20: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
9d30: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
9d40: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
9d50: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
9d60: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
9d70: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
9d80: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
9d90: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
9da0: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
9db0: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
9dc0: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
9dd0: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
9de0: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
9df0: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
9e00: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
9e10: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
9e20: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
9e30: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
9e40: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
9e50: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
9e60: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
9e70: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
9e80: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
9e90: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
9ea0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
9eb0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
9ec0: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
9ed0: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
9ee0: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
9ef0: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
9f00: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65  a failure occure
9f10: 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
9f20: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
9f30: 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79    ** file it may
9f40: 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61   contain some ga
9f50: 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72  rbage data. Ther
9f60: 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72  e are two scenar
9f70: 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74  ios.  ** where t
9f80: 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20  his risk can be 
9f90: 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20  ignored:.  **.  
9fa0: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
9fb0: 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73  pager is in no-s
9fc0: 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70  ync mode. Corrup
9fd0: 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  tion can follow 
9fe0: 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72  a.  **     power
9ff0: 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73   failure in this
a000: 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20   case anyway..  
a010: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
a020: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
a030: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c  P_SAFE_APPEND fl
a040: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
a050: 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20  guarantees.  ** 
a060: 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65      that garbage
a070: 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61   data is never a
a080: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a  ppended to the j
a090: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a  ournal file..  *
a0a0: 2f 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  /.  assert(pPage
a0b0: 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
a0c0: 7c 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29  |pPager->noSync)
a0d0: 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  ;.  if( (pPager-
a0e0: 3e 6e 6f 53 79 6e 63 29 20 0a 20 20 20 7c 7c 20  >noSync) .   || 
a0f0: 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
a100: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
a110: 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49  pPager->fd)&SQLI
a120: 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
a130: 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20  PEND) .  ){.    
a140: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
a150: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
a160: 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66  alMagic)], 0xfff
a170: 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  fffff);.  }else{
a180: 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26  .    put32bits(&
a190: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
a1a0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
a1b0: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  0);.  }..  /* Th
a1c0: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
a1d0: 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20  ash initialiser 
a1e0: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  */ .  sqlite3_ra
a1f0: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
a200: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
a210: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
a220: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
a230: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
a240: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
a250: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
a260: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
a270: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
a280: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
a290: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
a2a0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
a2b0: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
a2c0: 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
a2d0: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
a2e0: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
a2f0: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
a300: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
a310: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
a320: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
a330: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
a340: 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  e);.  if( pPager
a350: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3d 3d 30 20  ->journalHdr==0 
a360: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
a370: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 70  ge size */.    p
a380: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
a390: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
a3a0: 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61  lMagic)+16], pPa
a3b0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
a3c0: 20 20 7d 0a 0a 20 20 66 6f 72 28 6e 57 72 69 74    }..  for(nWrit
a3d0: 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e=0; rc==SQLITE_
a3e0: 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e  OK&&nWrite<JOURN
a3f0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
a400: 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64  ); nWrite+=nHead
a410: 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  er){.    IOTRACE
a420: 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20  (("JHDR %p %lld 
a430: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
a440: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
a450: 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20  r, nHeader)).   
a460: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
a470: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
a480: 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64  , zHeader, nHead
a490: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
a4a0: 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50 61  nalOff);.    pPa
a4b0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
a4c0: 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a  += nHeader;.  }.
a4d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a4e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
a4f0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
a500: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69  open when this i
a510: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
a520: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a  nal header file.
a530: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
a540: 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61  SZ bytes) is rea
a550: 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  d from the curre
a560: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
a570: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
a580: 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  le. See comments
a590: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
a5a0: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
a5b0: 29 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  ) for a descript
a5c0: 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f  ion of.** the jo
a5d0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
a5e0: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
a5f0: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
a600: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
a610: 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74  nRec is set to t
a620: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
a630: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c  page records fol
a640: 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64  lowing this head
a650: 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69  er and *dbSize i
a660: 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a  s set to the siz
a670: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
a680: 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20  base before the 
a690: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61  transaction bega
a6a0: 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73  n, in pages. Als
a6b0: 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  o, pPager->cksum
a6c0: 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74  Init.** is set t
a6d0: 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  o the value read
a6e0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
a6f0: 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45  l header. SQLITE
a700: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
a710: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
a720: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
a730: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
a740: 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
a750: 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
a760: 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74  E_DONE is.** ret
a770: 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20  urned and *nRec 
a780: 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20  and *dbSize are 
a790: 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55  not set.  If JOU
a7a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
a7b0: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
a7c0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
a7d0: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
a7e0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
a7f0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
a800: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
a810: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
a820: 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e  er, .  i64 journ
a830: 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70  alSize,.  u32 *p
a840: 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44  NRec, .  u32 *pD
a850: 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72  bSize.){.  int r
a860: 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  c;.  unsigned ch
a870: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a  ar aMagic[8]; /*
a880: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
a890: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
a8a0: 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c  er */.  i64 jrnl
a8b0: 4f 66 66 3b 0a 20 20 69 6e 74 20 69 50 61 67 65  Off;.  int iPage
a8c0: 53 69 7a 65 3b 0a 0a 20 20 73 65 65 6b 4a 6f 75  Size;..  seekJou
a8d0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
a8e0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
a8f0: 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41  ournalOff+JOURNA
a900: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
a910: 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29   > journalSize )
a920: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
a930: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
a940: 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  jrnlOff = pPager
a950: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
a960: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
a970: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
a980: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
a990: 61 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66  aMagic), jrnlOff
a9a0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
a9b0: 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f  turn rc;.  jrnlO
a9c0: 66 66 20 2b 3d 20 73 69 7a 65 6f 66 28 61 4d 61  ff += sizeof(aMa
a9d0: 67 69 63 29 3b 0a 0a 20 20 69 66 28 20 6d 65 6d  gic);..  if( mem
a9e0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
a9f0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
aa00: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
aa10: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
aa20: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20  TE_DONE;.  }..  
aa30: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
aa40: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
aa50: 6c 4f 66 66 2c 20 70 4e 52 65 63 29 3b 0a 20 20  lOff, pNRec);.  
aa60: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
aa70: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
aa80: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
aa90: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20 26  fd, jrnlOff+4, &
aaa0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
aab0: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
aac0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
aad0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
aae0: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
aaf0: 66 2b 38 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20  f+8, pDbSize);. 
ab00: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
ab10: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
ab20: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
ab30: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 36 2c  jfd, jrnlOff+16,
ab40: 20 28 75 33 32 20 2a 29 26 69 50 61 67 65 53 69   (u32 *)&iPageSi
ab50: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ze);.  if( rc==S
ab60: 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20  QLITE_OK .   && 
ab70: 69 50 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 0a  iPageSize>=512 .
ab80: 20 20 20 26 26 20 69 50 61 67 65 53 69 7a 65 3c     && iPageSize<
ab90: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
aba0: 5f 53 49 5a 45 20 0a 20 20 20 26 26 20 28 28 69  _SIZE .   && ((i
abb0: 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67  PageSize-1)&iPag
abc0: 65 53 69 7a 65 29 3d 3d 30 20 0a 20 20 29 7b 0a  eSize)==0 .  ){.
abd0: 20 20 20 20 75 31 36 20 70 61 67 65 73 69 7a 65      u16 pagesize
abe0: 20 3d 20 69 50 61 67 65 53 69 7a 65 3b 0a 20 20   = iPageSize;.  
abf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
ac00: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
ac10: 50 61 67 65 72 2c 20 26 70 61 67 65 73 69 7a 65  Pager, &pagesize
ac20: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20  );.  }.  if( rc 
ac30: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
ac40: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73  /* Update the as
ac50: 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a  sumed sector-siz
ac60: 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76  e to match the v
ac70: 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20  alue used by .  
ac80: 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ** the process t
ac90: 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73  hat created this
aca0: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69   journal. If thi
acb0: 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  s journal was.  
acc0: 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ** created by a 
acd0: 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68  process other th
ace0: 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65  an this one, the
acf0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  n this routine. 
ad00: 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
ad10: 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
ad20: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
ad30: 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
ad40: 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e  e.  ** of Pager.
ad50: 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
ad60: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
ad70: 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
ad80: 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72  e..  */.  rc = r
ad90: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
ada0: 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31  ->jfd, jrnlOff+1
adb0: 32 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67 65  2, (u32 *)&pPage
adc0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
add0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
ade0: 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d  n rc;..  pPager-
adf0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
ae00: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
ae10: 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
ae20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
ae30: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
ae40: 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a  upplied master j
ae50: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f  ournal name into
ae60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ae70: 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70  e for pager.** p
ae80: 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72  Pager at the cur
ae90: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54  rent location. T
aea0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
aeb0: 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74  l name must be t
aec0: 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67  he last.** thing
aed0: 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f   written to a jo
aee0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
aef0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66  he pager is in f
af00: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74  ull-sync mode, t
af10: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
af20: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
af30: 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65   advanced to the
af40: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
af50: 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ndary before.** 
af60: 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74  anything is writ
af70: 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20  ten. The format 
af80: 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79  is:.**.** + 4 by
af90: 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47  tes: PAGER_MJ_PG
afa0: 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73  NO..** + N bytes
afb0: 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74  : length of mast
afc0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
afd0: 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  .** + 4 bytes: N
afe0: 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d  .** + 4 bytes: M
aff0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
b000: 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  me checksum..** 
b010: 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
b020: 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
b030: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
b040: 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
b050: 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
b060: 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
b070: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
b080: 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  nal name..**.** 
b090: 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20  If zMaster is a 
b0a0: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63  NULL pointer (oc
b0b0: 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  curs for a singl
b0c0: 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
b0d0: 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69  action), .** thi
b0e0: 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
b0f0: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
b100: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
b110: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
b120: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
b130: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
b140: 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20  c;.  int len; . 
b150: 20 69 6e 74 20 69 3b 20 0a 20 20 69 36 34 20 6a   int i; .  i64 j
b160: 72 6e 6c 4f 66 66 3b 0a 20 20 69 36 34 20 6a 72  rnlOff;.  i64 jr
b170: 6e 6c 53 69 7a 65 3b 0a 20 20 75 33 32 20 63 6b  nlSize;.  u32 ck
b180: 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  sum = 0;.  char 
b190: 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  zBuf[sizeof(aJou
b1a0: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b  rnalMagic)+2*4];
b1b0: 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ..  if( !zMaster
b1c0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d   || pPager->setM
b1d0: 61 73 74 65 72 29 20 72 65 74 75 72 6e 20 53 51  aster) return SQ
b1e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
b1f0: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
b200: 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  ;..  len = strle
b210: 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f  n(zMaster);.  fo
b220: 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b  r(i=0; i<len; i+
b230: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
b240: 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d   zMaster[i];.  }
b250: 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c  ..  /* If in ful
b260: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76  l-sync mode, adv
b270: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
b280: 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66   disk sector bef
b290: 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a  ore writing.  **
b2a0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
b2b0: 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69  nal name. This i
b2c0: 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72  s in case the pr
b2d0: 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74  evious page writ
b2e0: 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ten to.  ** the 
b2f0: 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65  journal has alre
b300: 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  ady been synced.
b310: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
b320: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
b330: 20 20 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48      seekJournalH
b340: 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  dr(pPager);.  }.
b350: 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67    jrnlOff = pPag
b360: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
b370: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
b380: 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29  lOff += (len+20)
b390: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
b3a0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
b3b0: 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 50 41 47 45  d, jrnlOff, PAGE
b3c0: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
b3d0: 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ));.  if( rc!=SQ
b3e0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
b3f0: 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b   rc;.  jrnlOff +
b400: 3d 20 34 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  = 4;..  rc = sql
b410: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
b420: 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
b430: 2c 20 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b  , len, jrnlOff);
b440: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
b450: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
b460: 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c  ;.  jrnlOff += l
b470: 65 6e 3b 0a 0a 20 20 70 75 74 33 32 62 69 74 73  en;..  put32bits
b480: 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70  (zBuf, len);.  p
b490: 75 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b 34  ut32bits(&zBuf[4
b4a0: 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d  ], cksum);.  mem
b4b0: 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a  cpy(&zBuf[8], aJ
b4c0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
b4d0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
b4e0: 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  c));.  rc = sqli
b4f0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
b500: 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b  r->jfd, zBuf, 8+
b510: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
b520: 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b  agic), jrnlOff);
b530: 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 38 2b  .  jrnlOff += 8+
b540: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
b550: 61 67 69 63 29 3b 0a 20 20 70 50 61 67 65 72 2d  agic);.  pPager-
b560: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
b570: 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20  ger->noSync;..  
b580: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
b590: 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d  is in peristent-
b5a0: 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68  journal mode, th
b5b0: 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  en the physical 
b5c0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69  .  ** journal-fi
b5d0: 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61  le may extend pa
b5e0: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
b5f0: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
b600: 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38   name.  ** and 8
b610: 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20   bytes of magic 
b620: 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65  data just writte
b630: 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  n to the file. T
b640: 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e  his is .  ** dan
b650: 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74  gerous because t
b660: 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62  he code to rollb
b670: 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
b680: 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c  l file.  ** will
b690: 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
b6a0: 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d  find the master-
b6b0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20  journal name to 
b6c0: 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
b6d0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
b6e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
b6f0: 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  t. .  **.  ** Ea
b700: 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64  siest thing to d
b710: 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72  o in this scenar
b720: 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74  io is to truncat
b730: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  e the journal . 
b740: 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20   ** file to the 
b750: 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20  required size.. 
b760: 20 2a 2f 20 0a 20 20 69 66 28 20 28 72 63 3d 3d   */ .  if( (rc==
b770: 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 26 26  SQLITE_OK).   &&
b780: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
b790: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
b7a0: 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29  >jfd, &jrnlSize)
b7b0: 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  )==SQLITE_OK.   
b7c0: 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 6a 72 6e 6c  && jrnlSize>jrnl
b7d0: 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  Off.  ){.    rc 
b7e0: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
b7f0: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
b800: 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20   jrnlOff);.  }. 
b810: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b820: 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f  *.** Add or remo
b830: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
b840: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
b850: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  ages that are in
b860: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
b870: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
b880: 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73   The Pager keeps
b890: 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74   a separate list
b8a0: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61   of pages that a
b8b0: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a  re currently in.
b8c0: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
b8d0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
b8e0: 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65  helps the sqlite
b8f0: 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74  3PagerStmtCommit
b900: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75  ().** routine ru
b910: 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f  n MUCH faster fo
b920: 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
b930: 65 20 77 68 65 72 65 20 74 68 65 72 65 20 61 72  e where there ar
b940: 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20  e many.** pages 
b950: 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e  in memory but on
b960: 6c 79 20 61 20 66 65 77 20 61 72 65 20 69 6e 20  ly a few are in 
b970: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
b980: 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
b990: 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74   void page_add_t
b9a0: 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64  o_stmt_list(PgHd
b9b0: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
b9c0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
b9d0: 70 50 61 67 65 72 3b 0a 20 20 50 67 48 69 73 74  pPager;.  PgHist
b9e0: 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
b9f0: 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
ba00: 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72  pPager);.  asser
ba10: 74 28 20 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  t( MEMDB );.  if
ba20: 28 20 21 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74  ( !pHist->inStmt
ba30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ba40: 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74  pHist->pPrevStmt
ba50: 3d 3d 30 20 26 26 20 70 48 69 73 74 2d 3e 70 4e  ==0 && pHist->pN
ba60: 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  extStmt==0 );.  
ba70: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53    if( pPager->pS
ba80: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 50 47 48  tmt ){.      PGH
ba90: 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 61 67 65  DR_TO_HIST(pPage
baa0: 72 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72  r->pStmt, pPager
bab0: 29 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  )->pPrevStmt = p
bac0: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 48  Pg;.    }.    pH
bad0: 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  ist->pNextStmt =
bae0: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a   pPager->pStmt;.
baf0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
bb00: 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 48 69  t = pPg;.    pHi
bb10: 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a  st->inStmt = 1;.
bb20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e    }.}../*.** Fin
bb30: 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
bb40: 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e  hash table given
bb50: 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72   its page number
bb60: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
bb70: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
bb80: 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  ge or NULL if no
bb90: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
bba0: 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
bbb0: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
bbc0: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
bbd0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20  {.  PgHdr *p;.  
bbe0: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
bbf0: 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  h==0 ) return 0;
bc00: 0a 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 61  .  p = pPager->a
bc10: 48 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50 61  Hash[pgno & (pPa
bc20: 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a  ger->nHash-1)];.
bc30: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
bc40: 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20  >pgno!=pgno ){. 
bc50: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48     p = p->pNextH
bc60: 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ash;.  }.  retur
bc70: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  n p;.}../*.** Cl
bc80: 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ear the in-memor
bc90: 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  y cache.  This r
bca0: 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74  outine.** sets t
bcb0: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
bcc0: 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68  pager back to wh
bcd0: 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69  at it was when i
bce0: 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f  t was first.** o
bcf0: 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73  pened.  Any outs
bd00: 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
bd10: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e  e invalidated an
bd20: 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74  d subsequent att
bd30: 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65  empts.** to acce
bd40: 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77  ss those pages w
bd50: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
bd60: 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
bd70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bd80: 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
bd90: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
bda0: 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
bdb0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
bdc0: 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e  errCode ) return
bdd0: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
bde0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
bdf0: 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 49  Pg=pNext){.    I
be00: 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20  OTRACE(("PGFREE 
be10: 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
be20: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
be30: 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
be40: 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72  lite3_pager_pgfr
be50: 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 70  ee_count);.    p
be60: 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
be70: 74 41 6c 6c 3b 0a 20 20 20 20 6c 72 75 4c 69 73  tAll;.    lruLis
be80: 74 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 20 20  tRemove(pPg);.  
be90: 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
bea0: 65 28 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20  e(pPg->pData);. 
beb0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
bec0: 70 50 67 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  pPg);.  }.  asse
bed0: 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  rt(pPager->lru.p
bee0: 46 69 72 73 74 3d 3d 30 29 3b 0a 20 20 61 73 73  First==0);.  ass
bef0: 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e  ert(pPager->lru.
bf00: 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 29  pFirstSynced==0)
bf10: 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
bf20: 72 2d 3e 6c 72 75 2e 70 4c 61 73 74 3d 3d 30 29  r->lru.pLast==0)
bf30: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  ;.  pPager->pStm
bf40: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
bf50: 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  >pAll = 0;.  pPa
bf60: 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ger->pDirty = 0;
bf70: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  .  pPager->nHash
bf80: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
bf90: 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61  free(pPager->aHa
bfa0: 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  sh);.  pPager->n
bfb0: 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Page = 0;.  pPag
bfc0: 65 72 2d 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20  er->aHash = 0;. 
bfd0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
bfe0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  0;.}../*.** Unlo
bff0: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ck the database 
c000: 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
c010: 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72  the pager is cur
c020: 72 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72 20  rently in error 
c030: 73 74 61 74 65 2c 20 64 69 73 63 61 72 64 20 74  state, discard t
c040: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a  he contents of .
c050: 2a 2a 20 74 68 65 20 63 61 63 68 65 20 61 6e 64  ** the cache and
c060: 20 72 65 73 65 74 20 74 68 65 20 50 61 67 65 72   reset the Pager
c070: 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 65 72   structure inter
c080: 6e 61 6c 20 73 74 61 74 65 2e 20 49 66 20 74 68  nal state. If th
c090: 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65  ere is.** an ope
c0a0: 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20  n journal-file, 
c0b0: 74 68 65 6e 20 74 68 65 20 6e 65 78 74 20 74 69  then the next ti
c0c0: 6d 65 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b  me a shared-lock
c0d0: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
c0e0: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  on the pager fil
c0f0: 65 20 28 62 79 20 74 68 69 73 20 6f 72 20 61 6e  e (by this or an
c100: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 29  y other process)
c110: 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  , it will be.** 
c120: 74 72 65 61 74 65 64 20 61 73 20 61 20 68 6f 74  treated as a hot
c130: 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c  -journal and rol
c140: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  led back..*/.sta
c150: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75  tic void pager_u
c160: 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  nlock(Pager *pPa
c170: 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ger){.  if( !pPa
c180: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
c190: 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21 4d  de ){.    if( !M
c1a0: 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 69 6e  EMDB ){.      in
c1b0: 74 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28  t rc = osUnlock(
c1c0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
c1d0: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
c1e0: 72 63 20 29 20 70 50 61 67 65 72 2d 3e 65 72 72  rc ) pPager->err
c1f0: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 20  Code = rc;.     
c200: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
c210: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 49 4f 54 52  = -1;.      IOTR
c220: 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c  ACE(("UNLOCK %p\
c230: 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20  n", pPager))..  
c240: 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 63 6c      /* Always cl
c250: 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ose the journal 
c260: 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69  file when droppi
c270: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
c280: 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 4f  lock..      ** O
c290: 74 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68 65  therwise, anothe
c2a0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  r connection wit
c2b0: 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64  h journal_mode=d
c2c0: 65 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20 20  elete might.    
c2d0: 20 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20    ** delete the 
c2e0: 66 69 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e  file out from un
c2f0: 64 65 72 20 75 73 2e 0a 20 20 20 20 20 20 2a 2f  der us..      */
c300: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
c310: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
c320: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
c330: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
c340: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 70  >jfd);.        p
c350: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
c360: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  en = 0;.        
c370: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
c380: 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
c390: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
c3a0: 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
c3b0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
c3c0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 50  }..      /* If P
c3d0: 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20  ager.errCode is 
c3e0: 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  set, the content
c3f0: 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
c400: 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20  ache cannot be. 
c410: 20 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e       ** trusted.
c420: 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61   Now that the pa
c430: 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ger file is unlo
c440: 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e  cked, the conten
c450: 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  ts of the.      
c460: 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65 20  ** cache can be 
c470: 64 69 73 63 61 72 64 65 64 20 61 6e 64 20 74 68  discarded and th
c480: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66  e error code saf
c490: 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20  ely cleared..   
c4a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
c4b0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
c4c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
c4d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
c4e0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
c4f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
c500: 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
c510: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
c520: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
c530: 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  tOpen ){.       
c540: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
c550: 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b  e(pPager->stfd);
c560: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c570: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
c580: 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29  pPager->pInStmt)
c590: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
c5a0: 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30 3b  er->pInStmt = 0;
c5b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c5c0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
c5d0: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pen = 0;.       
c5e0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
c5f0: 73 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  se = 0;.        
c600: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c610: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ff = 0;.        
c620: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
c630: 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
c640: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
c650: 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  Autoopen = 0;.  
c660: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72        pPager->or
c670: 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20  igDbSize = 0;.  
c680: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
c690: 20 69 66 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70   if( !MEMDB || p
c6a0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
c6b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c6c0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
c6d0: 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
c6e0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63  .      pPager->c
c6f0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
c700: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
c710: 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
c720: 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74   rollback if a t
c730: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
c740: 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tive and unlock 
c750: 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
c760: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
c770: 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ger has already 
c780: 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f  entered the erro
c790: 72 20 73 74 61 74 65 2c 20 0a 2a 2a 20 64 6f 20  r state, .** do 
c7a0: 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68 65 20  not attempt the 
c7b0: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  rollback..*/.sta
c7c0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
c7d0: 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
c7e0: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 2f 2a 20  Pager *p){.  /* 
c7f0: 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65  assert( p->state
c800: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
c810: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70   || p->journalOp
c820: 65 6e 3d 3d 30 20 29 3b 20 2a 2f 0a 20 20 69 66  en==0 ); */.  if
c830: 28 20 70 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ( p->errCode==SQ
c840: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 73 74  LITE_OK && p->st
c850: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
c860: 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  VED ){.    sqlit
c870: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
c880: 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  loc();.    sqlit
c890: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
c8a0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  p);.    sqlite3E
c8b0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
c8c0: 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e  ;.  }.  pager_un
c8d0: 6c 6f 63 6b 28 70 29 3b 0a 23 69 66 20 30 0a 20  lock(p);.#if 0. 
c8e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43   assert( p->errC
c8f0: 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e  ode || !p->journ
c900: 61 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65 78  alOpen || (p->ex
c910: 63 6c 75 73 69 76 65 4d 6f 64 65 26 26 21 70 2d  clusiveMode&&!p-
c920: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b 0a  >journalOff) );.
c930: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72    assert( p->err
c940: 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d 74  Code || !p->stmt
c950: 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c 75  Open || p->exclu
c960: 73 69 76 65 4d 6f 64 65 20 29 3b 0a 23 65 6e 64  siveMode );.#end
c970: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  if.}../*.** This
c980: 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20   routine ends a 
c990: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20  transaction.  A 
c9a0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
c9b0: 6e 64 65 64 20 62 79 20 65 69 74 68 65 72 0a 2a  nded by either.*
c9c0: 2a 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  * a COMMIT or a 
c9d0: 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20  ROLLBACK..**.** 
c9e0: 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
c9f0: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
ca00: 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 6a   pager has the j
ca10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
ca20: 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56   and.** a RESERV
ca30: 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
ca40: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
ca50: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
ca60: 69 6e 65 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  ine will release
ca70: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
ca80: 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72   lock and acquir
ca90: 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  es a SHARED lock
caa0: 20 69 6e 20 69 74 73 20 70 6c 61 63 65 20 69 66   in its place if
cab0: 20 74 68 61 74 20 69 73 0a 2a 2a 20 74 68 65 20   that is.** the 
cac0: 61 70 70 72 6f 70 72 69 61 74 65 20 74 68 69 6e  appropriate thin
cad0: 67 20 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73  g to do.  Releas
cae0: 65 20 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20  e locks usually 
caf0: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2c 0a  is appropriate,.
cb00: 2a 2a 20 75 6e 6c 65 73 73 20 77 65 20 61 72 65  ** unless we are
cb10: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
cb20: 63 65 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c  cess mode or unl
cb30: 65 73 73 20 74 68 69 73 20 69 73 20 61 20 0a 2a  ess this is a .*
cb40: 2a 20 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47  * COMMIT AND BEG
cb50: 49 4e 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41  IN or ROLLBACK A
cb60: 4e 44 20 42 45 47 49 4e 20 6f 70 65 72 61 74 69  ND BEGIN operati
cb70: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  on..**.** The jo
cb80: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 65 69  urnal file is ei
cb90: 74 68 65 72 20 64 65 6c 65 74 65 64 20 6f 72 20  ther deleted or 
cba0: 74 72 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  truncated..**.**
cbb0: 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20   TODO: Consider 
cbc0: 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72  keeping the jour
cbd0: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f  nal file open fo
cbe0: 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
cbf0: 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d  bases..** This m
cc00: 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66  ight give a perf
cc10: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
cc20: 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77  ent on windows w
cc30: 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  here opening.** 
cc40: 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70  a file is an exp
cc50: 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  ensive operation
cc60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cc70: 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
cc80: 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
cc90: 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
cca0: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
ccb0: 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
ccc0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
ccd0: 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  c2 = SQLITE_OK;.
cce0: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
ccf0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
cd00: 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
cd10: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
cd20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
cd30: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67    }.  sqlite3Pag
cd40: 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61  erStmtCommit(pPa
cd50: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
cd60: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20  er->stmtOpen && 
cd70: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
cd80: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  veMode ){.    sq
cd90: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
cda0: 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20  ger->stfd);.    
cdb0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
cdc0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
cdd0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cde0: 70 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70  pen ){.    if( p
cdf0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
ce00: 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20 70 50  Mode .     || pP
ce10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
ce20: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
ce30: 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
ce40: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a   ){.      rc = z
ce50: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eroJournalHdr(pP
ce60: 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29  ager, hasMaster)
ce70: 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  ;.      pager_er
ce80: 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
ce90: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
cea0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
ceb0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
cec0: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
ced0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
cee0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
cef0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
cf00: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
cf10: 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  rnalOpen = 0;.  
cf20: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
cf30: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
cf40: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
cf50: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
cf60: 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
cf70: 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
cf80: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
cf90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
cfa0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
cfb0: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
cfc0: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
cfd0: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
cfe0: 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70  l = 0;.    for(p
cff0: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
d000: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
d010: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
d020: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
d030: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64   0;.      pPg->d
d040: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
d050: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
d060: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 61 6c  0;.      pPg->al
d070: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30  waysRollback = 0
d080: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
d090: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
d0a0: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
d0b0: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
d0c0: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
d0d0: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
d0e0: 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
d0f0: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
d100: 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  he = 0;.    pPag
d110: 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
d120: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
d130: 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
d140: 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a  urnal==0 );.  }.
d150: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
d160: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
d170: 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c  .    rc2 = osUnl
d180: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
d190: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
d1a0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
d1b0: 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
d1c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
d1d0: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
d1e0: 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70  _SYNCED ){.    p
d1f0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
d200: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
d210: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72    }.  pPager->or
d220: 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20  igDbSize = 0;.  
d230: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
d240: 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
d250: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
d260: 20 6c 72 75 4c 69 73 74 53 65 74 46 69 72 73 74   lruListSetFirst
d270: 53 79 6e 63 65 64 28 70 50 61 67 65 72 29 3b 0a  Synced(pPager);.
d280: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
d290: 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d   = -1;.  pPager-
d2a0: 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b  >dbModified = 0;
d2b0: 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
d2c0: 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
d2d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  );.}../*.** Comp
d2e0: 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ute and return a
d2f0: 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68   checksum for th
d300: 65 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a  e page of data..
d310: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
d320: 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
d330: 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79  m.  It is really
d340: 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66   just the sum of
d350: 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20   the .** random 
d360: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e  initial value an
d370: 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
d380: 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e  r.  We experimen
d390: 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68  ted with.** a ch
d3a0: 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e  ecksum of the en
d3b0: 74 69 72 65 20 64 61 74 61 2c 20 62 75 74 20 74  tire data, but t
d3c0: 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f  hat was found to
d3d0: 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a   be too slow..**
d3e0: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
d3f0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
d400: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 62   stored at the b
d410: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
d420: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63   and.** the chec
d430: 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61  ksum is stored a
d440: 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73  t the end.  This
d450: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20   is important.  
d460: 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  If journal.** co
d470: 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20  rruption occurs 
d480: 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66  due to a power f
d490: 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74  ailure, the most
d4a0: 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f   likely scenario
d4b0: 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20  .** is that one 
d4c0: 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
d4d0: 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
d4e0: 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
d4f0: 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c   It is.** much l
d500: 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
d510: 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
d520: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
d530: 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
d540: 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
d550: 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
d560: 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
d570: 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
d580: 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
d590: 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
d5a0: 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
d5b0: 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
d5c0: 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46  ruption..**.** F
d5d0: 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72  IX ME:  Consider
d5e0: 20 61 64 64 69 6e 67 20 65 76 65 72 79 20 32 30   adding every 20
d5f0: 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65  0th (or so) byte
d600: 20 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f 20   of the data to 
d610: 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e  the.** checksum.
d620: 20 20 54 68 61 74 20 77 61 79 20 69 66 20 61 20    That way if a 
d630: 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e  single page span
d640: 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b  s 3 or more disk
d650: 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20   sectors and.** 
d660: 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20  only the middle 
d670: 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70  sector is corrup
d680: 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c  t, we will still
d690: 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62   have a reasonab
d6a0: 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20  le.** chance of 
d6b0: 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63  failing the chec
d6c0: 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65  ksum and thus de
d6d0: 74 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62  tecting the prob
d6e0: 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lem..*/.static u
d6f0: 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50  32 pager_cksum(P
d700: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
d710: 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a  nst u8 *aData){.
d720: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50    u32 cksum = pP
d730: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
d740: 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65  .  int i = pPage
d750: 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b  r->pageSize-200;
d760: 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b  .  while( i>0 ){
d770: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44  .    cksum += aD
d780: 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d  ata[i];.    i -=
d790: 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   200;.  }.  retu
d7a0: 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20  rn cksum;.}../* 
d7b0: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
d7c0: 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion */.static vo
d7d0: 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48  id makeClean(PgH
d7e0: 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  dr*);../*.** Rea
d7f0: 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
d800: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
d810: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20   file opened on 
d820: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
d830: 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63  ** jfd.  Playbac
d840: 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e  k this one page.
d850: 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73  .**.** If useCks
d860: 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  um==0 it means t
d870: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  his journal does
d880: 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75   not use checksu
d890: 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a  ms.  Checksums.*
d8a0: 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69  * are not used i
d8b0: 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  n statement jour
d8c0: 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73 74 61  nals because sta
d8d0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20  tement journals 
d8e0: 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74  do not.** need t
d8f0: 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65 72 20  o survive power 
d900: 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61  failures..*/.sta
d910: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
d920: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
d930: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
d940: 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  , .  sqlite3_fil
d950: 65 20 2a 6a 66 64 2c 0a 20 20 69 36 34 20 6f 66  e *jfd,.  i64 of
d960: 66 73 65 74 2c 0a 20 20 69 6e 74 20 75 73 65 43  fset,.  int useC
d970: 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ksum.){.  int rc
d980: 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20  ;.  PgHdr *pPg; 
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9a0: 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
d9b0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
d9c0: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  he */.  Pgno pgn
d9d0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
d9e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
d9f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61  e number of a pa
da00: 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ge in journal */
da10: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da30: 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65   /* Checksum use
da40: 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65  d for sanity che
da50: 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61  cking */.  u8 *a
da60: 44 61 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61  Data = (u8 *)pPa
da70: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20  ger->pTmpSpace; 
da80: 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
da90: 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a  e for a page */.
daa0: 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73  .  /* useCksum s
dab0: 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f  hould be true fo
dac0: 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  r the main journ
dad0: 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72  al and false for
dae0: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
daf0: 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66  journals.  Verif
db00: 79 20 74 68 61 74 20 74 68 69 73 20 69 73 20 61  y that this is a
db10: 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20  lways the case. 
db20: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66   */.  assert( jf
db30: 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f  d == (useCksum ?
db40: 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70   pPager->jfd : p
db50: 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a  Pager->stfd) );.
db60: 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
db70: 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  );..  rc = read3
db80: 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65  2bits(jfd, offse
db90: 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  t, &pgno);.  if(
dba0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
dbb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
dbc0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
dbd0: 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61  (jfd, aData, pPa
dbe0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
dbf0: 66 66 73 65 74 2b 34 29 3b 0a 20 20 69 66 28 20  ffset+4);.  if( 
dc00: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
dc10: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61  return rc;.  pPa
dc20: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
dc30: 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
dc40: 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53  ize + 4;..  /* S
dc50: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
dc60: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
dc70: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
dc80: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
dc90: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
dca0: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
dcb0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
dcc0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
dcd0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
dce0: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
dcf0: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
dd00: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
dd10: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
dd20: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
dd30: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
dd40: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
dd50: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
dd60: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
dd70: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
dd80: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
dd90: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
dda0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
ddb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
ddc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
ddd0: 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  >(unsigned)pPage
dde0: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
ddf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
de00: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65  K;.  }.  if( use
de10: 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  Cksum ){.    rc 
de20: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
de30: 2c 20 6f 66 66 73 65 74 2b 70 50 61 67 65 72 2d  , offset+pPager-
de40: 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b  >pageSize+4, &ck
de50: 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
de60: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
de70: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
de80: 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69  lOff += 4;.    i
de90: 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  f( pager_cksum(p
dea0: 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63  Pager, aData)!=c
deb0: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
dec0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
ded0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
dee0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
def0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
df00: 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  RVED || pPager->
df10: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
df20: 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20  LUSIVE );..  /* 
df30: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
df40: 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74  in RESERVED stat
df50: 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
df60: 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
df70: 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
df80: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
df90: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
dfa0: 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
dfb0: 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
dfc0: 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
dfd0: 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
dfe0: 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
dff0: 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
e000: 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ase..  **.  ** A
e010: 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  n exception to t
e020: 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49  he above rule: I
e030: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
e040: 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
e050: 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67  e.  ** and a pag
e060: 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e  e is moved durin
e070: 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g an incremental
e080: 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65   vacuum then the
e090: 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e   page may.  ** n
e0a0: 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67  ot be in the pag
e0b0: 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a  er cache. Later:
e0c0: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f   if a malloc() o
e0d0: 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  r IO error occur
e0e0: 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20  s.  ** during a 
e0f0: 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c  Movepage() call,
e100: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
e110: 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ay not be in the
e120: 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68   cache.  ** eith
e130: 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69  er. So the condi
e140: 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69  tion described i
e150: 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61  n the above para
e160: 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a  graph is not.  *
e170: 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a  * assert()able..
e180: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
e190: 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c  EXCLUSIVE state,
e1a0: 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20   then we update 
e1b0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
e1c0: 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a  if it exists.  *
e1d0: 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66  * and the main f
e1e0: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
e1f0: 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74   then marked not
e200: 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a   dirty..  **.  *
e210: 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20  * Ticket #1171: 
e220: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   The statement j
e230: 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
e240: 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e  tain page conten
e250: 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64  t that is.  ** d
e260: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
e270: 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
e280: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
e290: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
e2a0: 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73    ** This occurs
e2b0: 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20   when a page is 
e2c0: 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f  changed prior to
e2d0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
e2e0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
e2f0: 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69  hen changed agai
e300: 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  n within the sta
e310: 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f  tement.  When ro
e320: 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20  lling back such 
e330: 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
e340: 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69   we must not wri
e350: 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  te to the origin
e360: 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65  al database unle
e370: 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20  ss we know.  ** 
e380: 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74  for certain that
e390: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
e3a0: 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63  ontents are sync
e3b0: 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  ed into the main
e3c0: 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
e3d0: 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69  ournal.  Otherwi
e3e0: 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73  se, a power loss
e3f0: 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64   might leave mod
e400: 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68  ified data in th
e410: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
e420: 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20  file without an 
e430: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c  entry in the rol
e440: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68  lback journal th
e450: 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74  at can.  ** rest
e460: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
e470: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
e480: 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64   form.  Two cond
e490: 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20  itions must be. 
e4a0: 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77   ** met before w
e4b0: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
e4c0: 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31  tabase files. (1
e4d0: 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
e4e0: 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b  ust be.  ** lock
e4f0: 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77  ed.  (2) we know
e500: 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
e510: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  al page content 
e520: 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a  is fully synced.
e530: 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e    ** in the main
e540: 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20   journal either 
e550: 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
e560: 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
e570: 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68   or else.  ** th
e580: 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  e page is marked
e590: 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e   as needSync==0.
e5a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d  .  **.  ** 2008-
e5b0: 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74  04-14:  When att
e5c0: 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75  empting to vacuu
e5d0: 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
e5e0: 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20  base file, it.  
e5f0: 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
e600: 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65  o fail a stateme
e610: 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  nt on a database
e620: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79   that does not y
e630: 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44  et exist..  ** D
e640: 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
e650: 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61   write if databa
e660: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65  se file has neve
e670: 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20  r been opened.. 
e680: 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65   */.  pPg = page
e690: 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
e6a0: 20 70 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54   pgno);.  PAGERT
e6b0: 52 41 43 45 34 28 22 50 4c 41 59 42 41 43 4b 20  RACE4("PLAYBACK 
e6c0: 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
e6d0: 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
e6e0: 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
e6f0: 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
e700: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
e710: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
e720: 20 61 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20   aData));.  if( 
e730: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
e740: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26  AGER_EXCLUSIVE &
e750: 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67  & (pPg==0 || pPg
e760: 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29 0a 20  ->needSync==0). 
e770: 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72         && pPager
e780: 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
e790: 7b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  {.    i64 offset
e7a0: 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
e7b0: 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
e7c0: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
e7d0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
e7e0: 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50  r->fd, aData, pP
e7f0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
e800: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28  offset);.    if(
e810: 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 6d 61   pPg ){.      ma
e820: 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
e830: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
e840: 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
e850: 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
e860: 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f  be explicitly ro
e870: 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69  lled back that i
e880: 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74  s in use, except
e890: 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  .    ** for page
e8a0: 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64   1 which is held
e8b0: 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72   in use in order
e8c0: 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63   to keep the loc
e8d0: 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
e8e0: 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e  database active.
e8f0: 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20   However such a 
e900: 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c  page may be roll
e910: 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
e920: 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e  ult.    ** of an
e930: 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
e940: 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
e950: 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74  automatic call t
e960: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
e970: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e  PagerRollback().
e980: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
e990: 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20   *pData;.    /* 
e9a0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
e9b0: 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  f==0 || pPg->pgn
e9c0: 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70  o==1 ); */.    p
e9d0: 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Data = PGHDR_TO_
e9e0: 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d  DATA(pPg);.    m
e9f0: 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61  emcpy(pData, aDa
ea00: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
ea10: 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Size);.    if( p
ea20: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
ea30: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
ea40: 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 2c  ->xReiniter(pPg,
ea50: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
ea60: 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  e);.    }.#ifdef
ea70: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
ea80: 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
ea90: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
eaa0: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
eab0: 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  dif.    /* If th
eac0: 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
ead0: 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
eae0: 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
eaf0: 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
eb00: 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
eb10: 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
eb20: 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
eb30: 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
eb40: 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
eb50: 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
eb60: 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
eb70: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
eb80: 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
eb90: 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
eba0: 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
ebb0: 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
ebc0: 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
ebd0: 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
ebe0: 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  3);.  }.  return
ebf0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
ec00: 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
ec10: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
ec20: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ec30: 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
ec40: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
ec50: 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
ec60: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
ec70: 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
ec80: 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
ec90: 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
eca0: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
ecb0: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
ecc0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
ecd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
ece0: 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
ecf0: 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
ed00: 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
ed10: 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
ed20: 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
ed30: 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
ed40: 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
ed50: 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
ed60: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
ed70: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  *.**.** The mast
ed80: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
ed90: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
eda0: 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20  es of all child 
edb0: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20  journals..** To 
edc0: 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72  tell if a master
edd0: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
ede0: 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74  deleted, check t
edf0: 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a  o each of the.**
ee00: 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61   children.  If a
ee10: 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20  ll children are 
ee20: 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f  either missing o
ee30: 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74  r do not refer t
ee40: 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74  o.** a different
ee50: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c   master journal,
ee60: 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65   then this maste
ee70: 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  r journal can be
ee80: 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61   deleted..*/.sta
ee90: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65  tic int pager_de
eea0: 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70  lmaster(Pager *p
eeb0: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
eec0: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73  r *zMaster){.  s
eed0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
eee0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
eef0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
ef00: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30   master_open = 0
ef10: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
ef20: 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c   *pMaster;.  sql
ef30: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72  ite3_file *pJour
ef40: 6e 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61  nal;.  char *zMa
ef50: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sterJournal = 0;
ef60: 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20   /* Contents of 
ef70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
ef80: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61  ile */.  i64 nMa
ef90: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
efa0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
efb0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
efc0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  e */..  /* Open 
efd0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
efe0: 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76  al file exclusiv
eff0: 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65  ely in case some
f000: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20   other process. 
f010: 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74   ** is running t
f020: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
f030: 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61  . Not that it ma
f040: 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66  kes too much dif
f050: 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20  ference..  */.  
f060: 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74  pMaster = (sqlit
f070: 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65  e3_file *)sqlite
f080: 33 4d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 73 7a  3Malloc(pVfs->sz
f090: 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70  OsFile * 2);.  p
f0a0: 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74  Journal = (sqlit
f0b0: 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20  e3_file *)(((u8 
f0c0: 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66  *)pMaster) + pVf
f0d0: 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20  s->szOsFile);.  
f0e0: 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a  if( !pMaster ){.
f0f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f100: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
f110: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
f120: 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
f130: 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
f140: 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
f150: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
f160: 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
f170: 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72  zMaster, pMaster
f180: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  , flags, 0);.  }
f190: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
f1a0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
f1b0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73  aster_out;.  mas
f1c0: 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20  ter_open = 1;.. 
f1d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
f1e0: 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
f1f0: 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
f200: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
f210: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
f220: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
f230: 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  if( nMasterJourn
f240: 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72  al>0 ){.    char
f250: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20   *zJournal;.    
f260: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
f270: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d   = 0;.    int nM
f280: 61 73 74 65 72 50 74 72 20 3d 20 70 50 61 67 65  asterPtr = pPage
f290: 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
f2a0: 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c  ame+1;..    /* L
f2b0: 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d  oad the entire m
f2c0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
f2d0: 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  le into space ob
f2e0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20  tained from.    
f2f0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
f300: 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
f310: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
f320: 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
f330: 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
f340: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
f350: 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72  e3Malloc(nMaster
f360: 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65  Journal + nMaste
f370: 72 50 74 72 29 3b 0a 20 20 20 20 69 66 28 20 21  rPtr);.    if( !
f380: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
f390: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
f3a0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
f3b0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
f3c0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  out;.    }.    z
f3d0: 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61  MasterPtr = &zMa
f3e0: 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
f3f0: 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20  terJournal];.   
f400: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
f410: 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61  ead(pMaster, zMa
f420: 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61  sterJournal, nMa
f430: 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  sterJournal, 0);
f440: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
f450: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
f460: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
f470: 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
f480: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
f490: 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
f4a0: 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
f4b0: 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
f4c0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
f4d0: 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20 3d  ists;.      rc =
f4e0: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
f4f0: 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
f500: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
f510: 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
f520: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
f530: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f540: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
f550: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
f560: 20 20 20 20 20 20 69 66 28 20 65 78 69 73 74 73        if( exists
f570: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
f580: 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
f590: 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
f5a0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
f5b0: 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
f5c0: 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
f5d0: 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
f5e0: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
f5f0: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
f600: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
f610: 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
f620: 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
f630: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
f640: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
f650: 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
f660: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
f670: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
f680: 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
f690: 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
f6a0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
f6b0: 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
f6c0: 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
f6d0: 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
f6e0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
f6f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f700: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
f710: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
f720: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
f730: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
f740: 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
f750: 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
f760: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
f770: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
f780: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
f790: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f7a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
f7b0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
f7c0: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
f7d0: 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
f7e0: 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
f7f0: 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
f800: 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
f810: 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
f820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
f830: 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
f840: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
f850: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
f860: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
f870: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
f880: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
f890: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
f8a0: 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65  ournal += (strle
f8b0: 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  n(zJournal)+1);.
f8c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72      }.  }.  .  r
f8d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
f8e0: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
f8f0: 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  r, 0);..delmaste
f900: 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61  r_out:.  if( zMa
f910: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
f920: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f930: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  zMasterJournal);
f940: 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73  .  }  .  if( mas
f950: 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20  ter_open ){.    
f960: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
f970: 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 73  Master);.  }.  s
f980: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73  qlite3_free(pMas
f990: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
f9a0: 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f  c;.}...static vo
f9b0: 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  id pager_truncat
f9c0: 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70  e_cache(Pager *p
f9d0: 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  Pager);../*.** T
f9e0: 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e  runcate the main
f9f0: 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76   file of the giv
fa00: 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65 20  en pager to the 
fa10: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
fa20: 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 20 41 6c  ** indicated. Al
fa30: 73 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  so truncate the 
fa40: 63 61 63 68 65 64 20 72 65 70 72 65 73 65 6e 74  cached represent
fa50: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c  ation of the fil
fa60: 65 2e 0a 2a 2a 0a 2a 2a 20 4d 69 67 68 74 20 6d  e..**.** Might m
fa70: 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
fa80: 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f   that the file o
fa90: 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65  n disk is smalle
faa0: 72 20 74 68 61 6e 20 6e 50 61 67 65 2e 0a 2a 2a  r than nPage..**
fab0: 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
fac0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  , for example, i
fad0: 66 20 77 65 20 61 72 65 20 69 6e 20 74 68 65 20  f we are in the 
fae0: 6d 69 64 64 6c 65 20 6f 66 20 61 20 74 72 61 6e  middle of a tran
faf0: 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68  saction.** which
fb00: 20 68 61 73 20 65 78 74 65 6e 64 65 64 20 74 68   has extended th
fb10: 65 20 66 69 6c 65 20 73 69 7a 65 20 61 6e 64 20  e file size and 
fb20: 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 61 72  the new pages ar
fb30: 65 20 73 74 69 6c 6c 20 61 6c 6c 20 68 65 6c 64  e still all held
fb40: 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2c 20 74 68  .** in cache, th
fb50: 65 6e 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20  en an INSERT or 
fb60: 55 50 44 41 54 45 20 64 6f 65 73 20 61 20 73 74  UPDATE does a st
fb70: 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b  atement rollback
fb80: 2e 20 20 53 6f 6d 65 0a 2a 2a 20 6f 70 65 72 61  .  Some.** opera
fb90: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
fba0: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
fbb0: 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
fbc0: 79 6f 75 20 74 72 79 20 74 6f 0a 2a 2a 20 74 72  you try to.** tr
fbd0: 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f  uncate a file to
fbe0: 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20   some size that 
fbf0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
fc00: 74 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 0a  t currently is,.
fc10: 2a 2a 20 73 6f 20 64 65 74 65 63 74 20 74 68 69  ** so detect thi
fc20: 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65  s case and write
fc30: 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62   a single zero b
fc40: 79 74 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  yte to the end o
fc50: 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20 66 69 6c  f the new.** fil
fc60: 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 73 74  e instead..*/.st
fc70: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
fc80: 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
fc90: 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65  Pager, int nPage
fca0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
fcb0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
fcc0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
fcd0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26  GER_EXCLUSIVE &&
fce0: 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
fcf0: 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69 36 34  thods ){.    i64
fd00: 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65   currentSize, ne
fd10: 77 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  wSize;.    rc = 
fd20: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
fd30: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63  e(pPager->fd, &c
fd40: 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20  urrentSize);.   
fd50: 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67 65   newSize = pPage
fd60: 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
fd70: 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  )nPage;.    if( 
fd80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
fd90: 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65   currentSize!=ne
fda0: 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  wSize ){.      i
fdb0: 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e  f( currentSize>n
fdc0: 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
fdd0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
fde0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
fdf0: 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20  >fd, newSize);. 
fe00: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fe10: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
fe20: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
fe30: 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53 69  fd, "", 1, newSi
fe40: 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ze-1);.      }. 
fe50: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
fe60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
fe70: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
fe80: 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
fe90: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63  pager_truncate_c
fea0: 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20  ache(pPager);.  
feb0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
fec0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
fed0: 73 65 63 74 6f 72 53 69 7a 65 20 66 6f 72 20 74  sectorSize for t
fee0: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
fef0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 74 6f 72  **.** The sector
ff00: 20 73 69 7a 65 20 69 73 20 61 74 20 6c 65 61 73   size is at leas
ff10: 74 20 61 73 20 62 69 67 20 61 73 20 74 68 65 20  t as big as the 
ff20: 73 65 63 74 6f 72 20 73 69 7a 65 20 72 65 70 6f  sector size repo
ff30: 72 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74  rted.** by sqlit
ff40: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
ff50: 2e 20 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73  .  The minimum s
ff60: 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 35 31  ector size is 51
ff70: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
ff80: 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
ff90: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
ffa0: 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
ffb0: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
ffc0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
ffd0: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
ffe0: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
fff0: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
10000 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66  doesn't matter f
10010 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
10020 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69  es. Also, the fi
10030 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  le.    ** may no
10040 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
10050 65 64 20 79 65 74 2c 20 69 6e 20 77 68 63 69 68  ed yet, in whcih
10060 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74   case the OsSect
10070 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
10080 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75  call will segfau
10090 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  lt..    */.    p
100a0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
100b0 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  e = sqlite3OsSec
100c0 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
100d0 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  fd);.  }.  if( p
100e0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
100f0 65 3c 35 31 32 20 29 7b 0a 20 20 20 20 70 50 61  e<512 ){.    pPa
10100 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
10110 3d 20 35 31 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = 512;.  }.}../*
10120 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
10130 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
10140 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
10150 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
10160 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
10170 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
10180 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
10190 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
101a0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
101b0 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
101c0 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
101d0 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
101e0 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
101f0 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
10200 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
10210 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
10220 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
10230 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
10240 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
10250 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
10260 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
10270 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
10280 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
10290 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
102a0 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
102b0 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
102c0 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
102d0 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
102e0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
102f0 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
10300 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
10310 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
10320 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
10330 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
10340 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
10350 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
10360 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
10370 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
10380 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
10390 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
103a0 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
103b0 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
103c0 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20  h is the sector 
103d0 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65  size.  The heade
103e0 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68  r.**       is th
103f0 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e  is many bytes in
10400 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20   size..**  (6)  
10410 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
10420 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
10430 69 73 20 74 68 65 20 70 61 67 65 20 63 61 73 65  is the page case
10440 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20 62 79 74  ..**  (7)  4 byt
10450 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
10460 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
10470 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
10480 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
10490 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65        name.  The
104a0 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65   value may be ze
104b0 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61  ro (indicate tha
104c0 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  t there is no ma
104d0 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
104e0 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29 20  urnal.).**  (8) 
104f0 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   N bytes of the 
10500 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10510 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77  ame.  The name w
10520 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69  ill be nul-termi
10530 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61  nated.**       a
10540 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  nd might be shor
10550 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c  ter than the val
10560 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29  ue read from (5)
10570 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20  .  If the first 
10580 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66  byte.**       of
10590 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30   the name is \00
105a0 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  0 then there is 
105b0 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
105c0 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a  l.  The master.*
105d0 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  *       journal 
105e0 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69  name is stored i
105f0 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39 29  n UTF-8..**  (9)
10600 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
10610 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
10620 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
10630 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
10640 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
10650 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
10660 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
10670 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
10680 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
10690 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
106a0 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
106b0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
106c0 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
106d0 68 65 20 66 69 72 73 74 20 38 20 69 74 65 6d 73  he first 8 items
106e0 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
106f0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
10700 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
10710 6e 63 65 20 6f 66 20 74 68 65 20 39 74 68 20 69  nce of the 9th i
10720 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
10730 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
10740 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
10750 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
10760 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
10770 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
10780 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
10790 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
107a0 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
107b0 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
107c0 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
107d0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
107e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
107f0 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
10800 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
10810 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
10820 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
10830 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
10840 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
10850 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
10860 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10870 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
10880 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
10890 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
108a0 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
108b0 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
108c0 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
108d0 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
108e0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
108f0 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
10900 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
10910 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
10920 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
10930 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
10940 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
10950 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
10960 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
10970 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
10980 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
10990 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
109a0 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
109b0 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
109c0 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
109d0 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
109e0 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
109f0 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
10a00 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
10a10 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
10a20 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
10a30 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
10a40 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
10a50 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
10a60 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
10a70 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
10a80 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
10a90 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
10aa0 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
10ab0 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
10ac0 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
10ad0 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
10ae0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
10af0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
10b00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
10b10 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
10b20 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
10b30 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
10b40 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
10b50 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
10b60 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
10b70 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
10b80 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
10b90 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
10ba0 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
10bb0 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
10bc0 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
10bd0 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
10be0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
10bf0 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
10c00 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
10c10 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
10c20 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
10c30 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
10c40 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
10c50 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
10c60 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
10c70 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
10c80 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
10c90 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
10ca0 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
10cb0 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b  pVfs;.  i64 szJ;
10cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cd0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
10ce0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
10cf0 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
10d00 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
10d10 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10d20 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
10d30 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
10d40 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
10d50 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
10d60 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
10d70 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
10d80 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
10d90 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
10da0 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
10db0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10dd0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
10de0 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
10df0 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
10e00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
10e10 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
10e20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  by sqlite3OsAcce
10e30 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ss() */.  char *
10e40 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
10e50 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
10e60 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10e70 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f  e if any */..  /
10e80 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
10e90 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
10ea0 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
10eb0 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
10ec0 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
10ed0 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
10ee0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
10ef0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
10f00 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
10f10 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
10f20 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
10f30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10f40 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b  _OK || szJ==0 ){
10f50 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
10f60 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
10f70 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
10f80 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
10f90 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
10fa0 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
10fb0 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
10fc0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10fd0 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
10fe0 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
10ff0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
11000 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
11010 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
11020 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
11030 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
11040 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
11050 63 6b 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74  ck..  */.  zMast
11060 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
11070 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72  pSpace;.  rc = r
11080 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
11090 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
110a0 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
110b0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
110c0 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  1);.  if( rc==SQ
110d0 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
110e0 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20  er[0] ){.    rc 
110f0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
11100 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
11110 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
11120 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
11130 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b  }.  zMaster = 0;
11140 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
11150 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a  E_OK || !res ){.
11160 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
11170 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61  yback;.  }.  pPa
11180 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
11190 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  = 0;..  /* This 
111a0 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20  loop terminates 
111b0 65 69 74 68 65 72 20 77 68 65 6e 20 74 68 65 20  either when the 
111c0 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29  readJournalHdr()
111d0 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20   call returns.  
111e0 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ** SQLITE_DONE o
111f0 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  r an IO error oc
11200 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65  curs. */.  while
11210 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52  ( 1 ){..    /* R
11220 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
11230 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
11240 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
11250 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
11260 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
11270 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
11280 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
11290 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
112a0 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
112b0 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
112c0 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
112d0 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65  ss must of faile
112e0 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
112f0 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  it..    ** This 
11300 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e  indicates nothin
11310 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20  g more needs to 
11320 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
11330 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
11340 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
11350 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65  Pager, szJ, &nRe
11360 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69  c, &mxPg);.    i
11370 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11380 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72   ){ .      if( r
11390 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
113a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
113b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
113c0 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
113d0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
113e0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
113f0 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
11400 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61  then this journa
11410 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  l was created by
11420 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a   a process.    *
11430 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d  * working in no-
11440 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20  sync mode. This 
11450 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72  means that the r
11460 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
11470 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  al.    ** file c
11480 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73  onsists of pages
11490 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  , there are no m
114a0 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ore journal head
114b0 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20  ers. Compute.   
114c0 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
114d0 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74   nRec based on t
114e0 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a  his assumption..
114f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
11500 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20  Rec==0xffffffff 
11510 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
11520 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11530 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
11540 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
11550 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a       nRec = (szJ
11560 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   - JOURNAL_HDR_S
11570 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e  Z(pPager))/JOURN
11580 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
11590 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
115a0 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
115b0 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
115c0 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
115d0 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
115e0 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
115f0 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
11600 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
11610 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
11620 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
11630 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
11640 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
11650 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
11660 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
11670 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
11680 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
11690 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
116a0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
116b0 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
116c0 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
116d0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
116e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
116f0 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
11700 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
11710 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
11720 23 32 35 36 35 2e 0a 20 20 20 20 2a 2f 0a 20 20  #2565..    */.  
11730 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26    if( nRec==0 &&
11740 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20   !isHot &&.     
11750 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
11760 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
11770 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
11780 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11790 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   ){.      nRec =
117a0 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e   (szJ - pPager->
117b0 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f  journalOff) / JO
117c0 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
117d0 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
117e0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
117f0 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
11800 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
11810 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
11820 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
11830 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
11840 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
11850 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
11860 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
11870 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
11880 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
11890 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
118a0 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
118b0 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69  , mxPg);.      i
118c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
118d0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
118e0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
118f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
11900 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
11910 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
11920 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
11930 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
11940 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
11950 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b   */.    for(u=0;
11960 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20   u<nRec; u++){. 
11970 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
11980 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
11990 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
119a0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
119b0 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20  ournalOff, 1);. 
119c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
119d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
119e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
119f0 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
11a00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
11a10 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  K;.          pPa
11a20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
11a30 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
11a40 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
11a50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
11a60 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
11a70 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
11a80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11a90 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
11aa0 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
11ab0 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
11ac0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11ad0 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65  OK ){.    zMaste
11ae0 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
11af0 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20  Space;.    rc = 
11b00 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
11b10 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  l(pPager->jfd, z
11b20 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
11b30 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
11b40 2b 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  +1);.  }.  if( r
11b50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11b60 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
11b70 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
11b80 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30  Pager, zMaster[0
11b90 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 7d 0a 20 20  ]!='\0');.  }.  
11ba0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11bb0 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
11bc0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
11bd0 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
11be0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
11bf0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
11c00 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20  turn success,.  
11c10 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
11c20 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
11c30 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
11c40 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
11c50 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64      rc = pager_d
11c60 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c  elmaster(pPager,
11c70 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a   zMaster);.  }..
11c80 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
11c90 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
11ca0 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
11cb0 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
11cc0 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
11cd0 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
11ce0 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
11cf0 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
11d00 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a   sector size.  *
11d10 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
11d20 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
11d30 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
11d40 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
11d50 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
11d60 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
11d70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  rc;.}../*.** Pla
11d80 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  yback the statem
11d90 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ent journal..**.
11da0 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  ** This is simil
11db0 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  ar to playing ba
11dc0 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
11dd0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77  on journal but w
11de0 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74  ith.** a few ext
11df0 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  ra twists..**.**
11e00 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d      (1)  The num
11e10 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
11e20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11e30 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
11e40 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65  f.**         the
11e50 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74   statement is st
11e60 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e  ored in pPager->
11e70 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e  stmtSize, not in
11e80 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
11e90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73  journal file its
11ea0 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  elf..**.**    (2
11eb0 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  )  In addition t
11ec0 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
11ed0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
11ee0 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20  rnal, also.**   
11ef0 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61        playback a
11f00 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20  ll pages of the 
11f10 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
11f20 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a  nal beginning.**
11f30 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73           at offs
11f40 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  et pPager->stmtJ
11f50 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
11f60 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  int pager_stmt_p
11f70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
11f80 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a  Pager){.  i64 sz
11f90 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
11fa0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
11fb0 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a  e full journal *
11fc0 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a  /.  i64 hdrOff;.
11fd0 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
11fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
11ff0 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
12000 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12020 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
12030 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a  .  int rc;..  sz
12040 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J = pPager->jour
12050 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 53 65  nalOff;..  /* Se
12060 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74  t hdrOff to be t
12070 68 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61  he offset just a
12080 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20  fter the end of 
12090 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c  the last journal
120a0 0a 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74  .  ** page writt
120b0 65 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  en before the fi
120c0 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
120d0 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74  er for this stat
120e0 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73  ement.  ** trans
120f0 61 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74  action was writt
12100 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f  en, or the end o
12110 66 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f  f the file if no
12120 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65   journal.  ** he
12130 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e  ader was written
12140 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20  ..  */.  hdrOff 
12150 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64  = pPager->stmtHd
12160 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  rOff;.  assert( 
12170 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
12180 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20   || !hdrOff );. 
12190 20 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a   if( !hdrOff ){.
121a0 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a      hdrOff = szJ
121b0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72  ;.  }.  .  /* Tr
121c0 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
121d0 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ase back to its 
121e0 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
121f0 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
12200 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
12210 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  , pPager->stmtSi
12220 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ze);.  assert( p
12230 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
12240 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20  GER_SHARED );.. 
12250 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
12260 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
12270 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
12280 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ment journal..  
12290 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
122a0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
122b0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
122c0 6c 4f 70 65 6e 20 29 3b 0a 20 20 6e 52 65 63 20  lOpen );.  nRec 
122d0 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52  = pPager->stmtNR
122e0 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79  ec;.  .  /* Copy
122f0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
12300 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61 74 65  out of the state
12310 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ment journal and
12320 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20   back into the. 
12330 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
12340 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68  e.  Note that th
12350 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
12360 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73  nal omits checks
12370 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61  ums from.  ** ea
12380 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20  ch record since 
12390 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65  power-failure re
123a0 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d  covery is not im
123b0 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65  portant to state
123c0 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  ment.  ** journa
123d0 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ls..  */.  for(i
123e0 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29  =0; i<nRec; i++)
123f0 7b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  {.    i64 offset
12400 20 3d 20 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e   = i*(4+pPager->
12410 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72  pageSize);.    r
12420 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
12430 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
12440 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64  er, pPager->stfd
12450 2c 20 6f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20  , offset, 0);.  
12460 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
12470 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
12480 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12490 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
124a0 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
124b0 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20  ..  /* Now roll 
124c0 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20  some pages back 
124d0 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63  from the transac
124e0 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61  tion journal. Pa
124f0 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20  ger.stmtJSize.  
12500 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65 20  ** was the size 
12510 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
12520 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73 74  ile when this st
12530 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72  atement was star
12540 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65  ted, so.  ** eve
12550 72 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68  rything after th
12560 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  at needs to be r
12570 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68  olled back, eith
12580 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  er into the.  **
12590 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d   database, the m
125a0 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20  emory cache, or 
125b0 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  both..  **.  ** 
125c0 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72  If it is not zer
125d0 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74  o, then Pager.st
125e0 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68 65 20  mtHdrOff is the 
125f0 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
12600 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
12610 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
12620 61 64 65 72 20 77 72 69 74 74 65 6e 20 64 75 72  ader written dur
12630 69 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65  ing this stateme
12640 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
12650 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a    */.  pPager->j
12660 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67  ournalOff = pPag
12670 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20  er->stmtJSize;. 
12680 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
12690 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  it = pPager->stm
126a0 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28  tCksum;.  while(
126b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
126c0 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a  Off < hdrOff ){.
126d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
126e0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
126f0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
12700 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
12710 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20  urnalOff, 1);.  
12720 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
12730 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
12740 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12750 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
12760 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
12770 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65  ..  while( pPage
12780 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20  r->journalOff < 
12790 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  szJ ){.    u32 n
127a0 4a 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  JRec;         /*
127b0 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e   Number of Journ
127c0 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al Records */.  
127d0 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
127e0 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
127f0 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a  lHdr(pPager, szJ
12800 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
12810 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
12820 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12830 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
12840 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
12850 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74     goto end_stmt
12860 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
12870 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
12880 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63  0 ){.      nJRec
12890 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72   = (szJ - pPager
128a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
128b0 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
128c0 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e+8);.    }.    
128d0 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69  for(i=nJRec-1; i
128e0 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  >=0 && pPager->j
128f0 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b  ournalOff < szJ;
12900 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20   i--){.      rc 
12910 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
12920 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
12930 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  , pPager->jfd, p
12940 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
12950 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73  f, 1);.      ass
12960 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
12970 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66  DONE );.      if
12980 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12990 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
129a0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
129b0 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
129c0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
129d0 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  .  .end_stmt_pla
129e0 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d  yback:.  if( rc=
129f0 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20  =SQLITE_OK) {.  
12a00 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12a10 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
12a20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f  /* pager_reload_
12a30 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a  cache(pPager); *
12a40 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  /.  }.  return r
12a50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
12a60 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
12a70 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
12a80 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
12a90 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f  e allowed..*/.vo
12aa0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
12ab0 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
12ac0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
12ad0 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
12ae0 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70  Page>10 ){.    p
12af0 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
12b00 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b  mxPage;.  }else{
12b10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
12b20 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a  age = 10;.  }.}.
12b30 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
12b40 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
12b50 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
12b60 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
12b70 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
12b80 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
12b90 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
12ba0 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
12bb0 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
12bc0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
12bd0 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
12be0 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
12bf0 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
12c00 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
12c10 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
12c20 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
12c30 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
12c40 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
12c50 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
12c60 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
12c70 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
12c80 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
12c90 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
12ca0 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
12cb0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
12cc0 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
12cd0 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
12ce0 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
12cf0 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
12d00 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
12d10 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
12d20 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
12d30 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
12d50 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
12d60 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
12d70 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
12d80 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
12d90 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
12da0 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
12db0 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
12dc0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
12dd0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
12de0 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
12df0 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
12e00 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
12e10 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
12e20 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
12e30 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
12e50 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
12e60 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
12e70 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
12e80 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
12e90 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
12ea0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
12eb0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
12ec0 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
12ed0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
12ee0 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
12ef0 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
12f00 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
12f10 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
12f20 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
12f30 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
12f40 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
12f50 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
12f60 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
12f70 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
12f80 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
12f90 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
12fa0 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
12fb0 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
12fc0 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
12fd0 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
12fe0 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
12ff0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
13000 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
13010 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
13020 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
13030 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
13040 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
13050 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
13060 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
13070 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20  fetyLevel(Pager 
13080 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76  *pPager, int lev
13090 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79  el, int full_fsy
130a0 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nc){.  pPager->n
130b0 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d  oSync =  level==
130c0 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  1 || pPager->tem
130d0 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
130e0 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65  >fullSync = leve
130f0 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d  l==3 && !pPager-
13100 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
13110 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20  ger->sync_flags 
13120 3d 20 28 66 75 6c 6c 5f 66 73 79 6e 63 3f 53 51  = (full_fsync?SQ
13130 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53  LITE_SYNC_FULL:S
13140 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
13150 4c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  L);.  if( pPager
13160 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65  ->noSync ) pPage
13170 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
13180 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
13190 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
131a0 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
131b0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
131c0 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61  enever the libra
131d0 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ry.** attempts t
131e0 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
131f0 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  ry file.  This i
13200 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
13210 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
13220 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
13230 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66  nly.  .*/.#ifdef
13240 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
13250 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
13260 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  p_count = 0;.#en
13270 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  dif../*.** Open 
13280 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
13290 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  . .**.** Write t
132a0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
132b0 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65  or into *fd.  Re
132c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
132d0 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d  n success or som
132e0 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72  e.** other error
132f0 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c   code if we fail
13300 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75  . The OS will au
13310 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
13320 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
13330 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 69 74  .** file when it
13340 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73   is closed..*/.s
13350 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
13360 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a  3PagerOpentemp(.
13370 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
13380 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
13390 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
133a0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
133b0 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
133c0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
133d0 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tor here */.  in
133e0 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
133f0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
13400 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74  sed through to t
13410 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69  he VFS */.){.  i
13420 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53  nt rc;..#ifdef S
13430 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
13440 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
13450 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
13460 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
13470 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
13480 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
13490 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
134a0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
134b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
134c0 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
134d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
134e0 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
134f0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
13500 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
13510 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  e3OsOpen(pPager-
13520 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c  >pVfs, 0, pFile,
13530 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
13540 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
13550 49 54 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d  ITE_OK || pFile-
13560 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 72  >pMethods );.  r
13570 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13580 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
13590 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70  page cache and p
135a0 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
135b0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  the page cache i
135c0 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54  n *ppPager..** T
135d0 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
135e0 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78  ched need not ex
135f0 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69  ist.  The file i
13600 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74  s not locked unt
13610 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  il.** the first 
13620 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
13630 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 69 73  agerGet() and is
13640 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20   only held open 
13650 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73  until the.** las
13660 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
13670 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
13680 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a  PagerUnref()..**
13690 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
136a0 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
136b0 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
136c0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
136d0 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
136e0 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
136f0 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20   to be cached.  
13700 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  The file will be
13710 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
13720 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69  matically when i
13730 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
13740 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
13750 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
13760 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  en all informati
13770 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
13780 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65  che..** It is ne
13790 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64  ver written to d
137a0 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62  isk.  This can b
137b0 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
137c0 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d  ent an.** in-mem
137d0 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  ory database..*/
137e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
137f0 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
13800 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
13810 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
13820 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
13830 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
13840 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
13850 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
13860 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
13870 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
13880 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
13890 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
138a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
138b0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
138c0 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
138d0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
138e0 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
138f0 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
13900 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ge */.  int flag
13910 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
13920 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f   /* flags contro
13930 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20  lling this file 
13940 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
13950 73 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s             /*
13960 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   flags passed th
13970 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
13980 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
13990 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20  ){.  u8 *pPtr;. 
139a0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
139b0 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
139c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
139d0 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c  i;.  int tempFil
139e0 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d  e = 0;.  int mem
139f0 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  Db = 0;.  int re
13a00 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e  adOnly = 0;.  in
13a10 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  t useJournal = (
13a20 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d  flags & PAGER_OM
13a30 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a  IT_JOURNAL)==0;.
13a40 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b    int noReadlock
13a50 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
13a60 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d  R_NO_READLOCK)!=
13a70 30 3b 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c  0;.  int journal
13a80 46 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74  FileSize = sqlit
13a90 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
13aa0 66 73 29 3b 0a 20 20 69 6e 74 20 73 7a 50 61 67  fs);.  int szPag
13ab0 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44  eDflt = SQLITE_D
13ac0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
13ad0 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  ;.  char *zPathn
13ae0 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ame = 0;.  int n
13af0 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 0a 20  Pathname = 0;.. 
13b00 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20   /* The default 
13b10 72 65 74 75 72 6e 20 69 73 20 61 20 4e 55 4c 4c  return is a NULL
13b20 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 2a 70   pointer */.  *p
13b30 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f  pPager = 0;..  /
13b40 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74  * Compute and st
13b50 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ore the full pat
13b60 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f  hname in an allo
13b70 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69  cated buffer poi
13b80 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20  nted.  ** to by 
13b90 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74  zPathname, lengt
13ba0 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c  h nPathname. Or,
13bb0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65   if this is a te
13bc0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20  mporary file,.  
13bd0 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50  ** leave both nP
13be0 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74  athname and zPat
13bf0 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a  hname set to 0..
13c00 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
13c10 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
13c20 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74  e[0] ){.    nPat
13c30 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
13c40 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
13c50 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
13c60 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e  te3Malloc(nPathn
13c70 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20  ame*2);.    if( 
13c80 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zPathname==0 ){.
13c90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
13ca0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
13cb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13cc0 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
13cd0 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
13ce0 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a  lename,":memory:
13cf0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ")==0 ){.      m
13d00 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  emDb = 1;.      
13d10 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30  zPathname[0] = 0
13d20 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
13d30 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72  if.    {.      r
13d40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  c = sqlite3OsFul
13d50 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
13d60 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68  zFilename, nPath
13d70 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29  name, zPathname)
13d80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13d90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13da0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
13db0 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
13dc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
13dd0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 74 68  .    }.    nPath
13de0 6e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 50  name = strlen(zP
13df0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20  athname);.  }.. 
13e00 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
13e10 6f 72 79 20 66 6f 72 20 74 68 65 20 70 61 67 65  ory for the page
13e20 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
13e30 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
13e40 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  3MallocZero(.   
13e50 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29   sizeof(*pPager)
13e60 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
13e70 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
13e80 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  */.    journalFi
13e90 6c 65 53 69 7a 65 20 2b 20 20 20 20 20 20 20 20  leSize +        
13ea0 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
13eb0 6c 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  l file structure
13ec0 20 2a 2f 20 0a 20 20 20 20 70 56 66 73 2d 3e 73   */ .    pVfs->s
13ed0 7a 4f 73 46 69 6c 65 20 2a 20 33 20 2b 20 20 20  zOsFile * 3 +   
13ee0 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
13ef0 20 64 62 20 61 6e 64 20 74 77 6f 20 6a 6f 75 72   db and two jour
13f00 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20  nal files */ .  
13f10 20 20 33 2a 6e 50 61 74 68 6e 61 6d 65 20 2b 20    3*nPathname + 
13f20 34 30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  40            /*
13f30 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69 72   zFilename, zDir
13f40 65 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c  ectory, zJournal
13f50 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 21   */.  );.  if( !
13f60 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 73 71  pPager ){.    sq
13f70 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
13f80 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  name);.    retur
13f90 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
13fa0 20 20 7d 0a 20 20 70 50 74 72 20 3d 20 28 75 38    }.  pPtr = (u8
13fb0 20 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20   *)&pPager[1];. 
13fc0 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
13fd0 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 20 20  s = vfsFlags;.  
13fe0 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 28 73 71  pPager->fd = (sq
13ff0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74  lite3_file*)&pPt
14000 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  r[pVfs->szOsFile
14010 2a 30 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  *0];.  pPager->s
14020 74 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  tfd = (sqlite3_f
14030 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d  ile*)&pPtr[pVfs-
14040 3e 73 7a 4f 73 46 69 6c 65 2a 31 5d 3b 0a 20 20  >szOsFile*1];.  
14050 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 28 73  pPager->jfd = (s
14060 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50  qlite3_file*)&pP
14070 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  tr[pVfs->szOsFil
14080 65 2a 32 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  e*2];.  pPager->
14090 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
140a0 72 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73  r*)&pPtr[pVfs->s
140b0 7a 4f 73 46 69 6c 65 2a 32 2b 6a 6f 75 72 6e 61  zOsFile*2+journa
140c0 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50  lFileSize];.  pP
140d0 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
140e0 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c   = &pPager->zFil
140f0 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b  ename[nPathname+
14100 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a  1];.  pPager->zJ
14110 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72  ournal = &pPager
14120 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 50 61  ->zDirectory[nPa
14130 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61  thname+1];.  pPa
14140 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  ger->pVfs = pVfs
14150 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d  ;.  if( zPathnam
14160 65 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  e ){.    memcpy(
14170 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
14180 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  e, zPathname, nP
14190 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20  athname+1);.    
141a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
141b0 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20  thname);.  }..  
141c0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65  /* Open the page
141d0 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  r file..  */.  i
141e0 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
141f0 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20  zFilename[0] && 
14200 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 66  !memDb ){.    if
14210 28 20 6e 50 61 74 68 6e 61 6d 65 3e 28 70 56 66  ( nPathname>(pVf
14220 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 2d 20  s->mxPathname - 
14230 73 69 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c  sizeof("-journal
14240 22 29 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ")) ){.      rc 
14250 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
14260 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  N;.    }else{.  
14270 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
14280 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14290 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
142a0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
142b0 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 0a  me, pPager->fd,.
142c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142d0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
142e0 3e 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74  >vfsFlags, &fout
142f0 29 3b 0a 20 20 20 20 20 20 72 65 61 64 4f 6e 6c  );.      readOnl
14300 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45  y = (fout&SQLITE
14310 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
14320 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
14330 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65  e file was succe
14340 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ssfully opened f
14350 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
14360 63 65 73 73 2c 0a 20 20 20 20 20 20 2a 2a 20 63  cess,.      ** c
14370 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20  hoose a default 
14380 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73  page size in cas
14390 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65  e we have to cre
143a0 61 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ate the.      **
143b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
143c0 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  The default page
143d0 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78   size is the max
143e0 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 20 20 2a  imum of:.      *
143f0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20  *.      **    + 
14400 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
14410 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20  AGE_SIZE,.      
14420 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75  **    + The valu
14430 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
14440 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
14450 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  e().      **    
14460 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61  + The largest pa
14470 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e  ge size that can
14480 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
14490 69 63 61 6c 6c 79 2e 0a 20 20 20 20 20 20 2a 2f  ically..      */
144a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
144b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61  QLITE_OK && !rea
144c0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
144d0 20 69 6e 74 20 69 53 65 63 74 6f 72 53 69 7a 65   int iSectorSize
144e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
144f0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
14500 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  d);.        if( 
14510 73 7a 50 61 67 65 44 66 6c 74 3c 69 53 65 63 74  szPageDflt<iSect
14520 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  orSize ){.      
14530 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
14540 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20   iSectorSize;.  
14550 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
14560 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
14570 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
14580 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e    {.          in
14590 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
145a0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
145b0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
145c0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  d);.          in
145d0 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  t ii;.          
145e0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
145f0 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
14600 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  512>>8));.      
14610 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
14620 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
14630 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
14640 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
14650 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  (SQLITE_MAX_DEFA
14660 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36  ULT_PAGE_SIZE<=6
14670 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20  5536);.         
14680 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66   for(ii=szPageDf
14690 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d  lt; ii<=SQLITE_M
146a0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
146b0 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a  SIZE; ii=ii*2){.
146c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
146d0 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  iDc&(SQLITE_IOCA
146e0 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29  P_ATOMIC|(ii>>8)
146f0 29 20 29 20 73 7a 50 61 67 65 44 66 6c 74 20 3d  ) ) szPageDflt =
14700 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   ii;.          }
14710 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
14720 66 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  f.        if( sz
14730 50 61 67 65 44 66 6c 74 3e 53 51 4c 49 54 45 5f  PageDflt>SQLITE_
14740 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
14750 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
14760 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
14770 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
14780 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
14790 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
147a0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
147b0 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  ( !memDb ){.    
147c0 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
147d0 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
147e0 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
147f0 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
14800 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
14810 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
14820 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
14830 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
14840 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
14850 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
14860 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
14870 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
14880 65 28 29 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20  e()..    */ .   
14890 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20   tempFile = 1;. 
148a0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
148b0 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
148c0 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  VE;.  }..  if( p
148d0 50 61 67 65 72 20 26 26 20 72 63 3d 3d 53 51 4c  Pager && rc==SQL
148e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
148f0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
14900 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
14910 6c 6f 63 28 73 7a 50 61 67 65 44 66 6c 74 29 3b  loc(szPageDflt);
14920 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
14930 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69   error occured i
14940 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  n either of the 
14950 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2e 0a 20 20  blocks above..  
14960 2a 2a 20 46 72 65 65 20 74 68 65 20 50 61 67 65  ** Free the Page
14970 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
14980 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  close the file..
14990 20 20 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 70    ** Since the p
149a0 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  ager is not allo
149b0 63 61 74 65 64 20 74 68 65 72 65 20 69 73 20 6e  cated there is n
149c0 6f 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20  o need to set . 
149d0 20 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72   ** any Pager.er
149e0 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e  rMask variables.
149f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
14a00 67 65 72 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  ger || !pPager->
14a10 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
14a20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
14a30 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
14a40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
14a50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
14a60 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  n ((rc==SQLITE_O
14a70 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a  K)?SQLITE_NOMEM:
14a80 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  rc);.  }..  PAGE
14a90 52 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64  RTRACE3("OPEN %d
14aa0 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
14ab0 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29  LEID(pPager->fd)
14ac0 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
14ad0 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ame);.  IOTRACE(
14ae0 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c  ("OPEN %p %s\n",
14af0 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
14b00 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20  >zFilename))..  
14b10 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72  /* Fill in Pager
14b20 2e 7a 44 69 72 65 63 74 6f 72 79 5b 5d 20 2a 2f  .zDirectory[] */
14b30 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72  .  memcpy(pPager
14b40 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 70 50  ->zDirectory, pP
14b50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
14b60 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20   nPathname+1);. 
14b70 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 70 50   for(i=strlen(pP
14b80 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
14b90 29 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65 72  ); i>0 && pPager
14ba0 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31  ->zDirectory[i-1
14bb0 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20  ]!='/'; i--){}. 
14bc0 20 69 66 28 20 69 3e 30 20 29 20 70 50 61 67 65   if( i>0 ) pPage
14bd0 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d  r->zDirectory[i-
14be0 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69  1] = 0;..  /* Fi
14bf0 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 4a 6f 75  ll in Pager.zJou
14c00 72 6e 61 6c 5b 5d 20 2a 2f 0a 20 20 69 66 28 20  rnal[] */.  if( 
14c10 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  zPathname ){.   
14c20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
14c30 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
14c40 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  ->zFilename, nPa
14c50 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
14c60 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
14c70 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  urnal[nPathname]
14c80 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 39 29  , "-journal", 9)
14c90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
14ca0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
14cb0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 70  = 0;.  }..  /* p
14cc0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
14cd0 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  en = 0; */.  pPa
14ce0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
14cf0 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20  = useJournal && 
14d00 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  !memDb;.  pPager
14d10 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e  ->noReadlock = n
14d20 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61  oReadlock && rea
14d30 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67  dOnly;.  /* pPag
14d40 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
14d50 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
14d60 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
14d70 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
14d80 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20  >nRef = 0; */.  
14d90 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
14da0 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67   memDb-1;.  pPag
14db0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 73  er->pageSize = s
14dc0 7a 50 61 67 65 44 66 6c 74 3b 0a 20 20 2f 2a 20  zPageDflt;.  /* 
14dd0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
14de0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
14df0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
14e00 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
14e10 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
14e20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
14e30 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 70 50 61  age = 100;.  pPa
14e40 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51  ger->mxPgno = SQ
14e50 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f  LITE_MAX_PAGE_CO
14e60 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  UNT;.  /* pPager
14e70 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
14e80 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73  UNLOCK; */.  ass
14e90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
14ea0 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20  te == (tempFile 
14eb0 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ? PAGER_EXCLUSIV
14ec0 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  E : PAGER_UNLOCK
14ed0 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  ) );.  /* pPager
14ee0 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a  ->errMask = 0; *
14ef0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  /.  pPager->temp
14f00 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b  File = tempFile;
14f10 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46  .  assert( tempF
14f20 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
14f30 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20  NGMODE_NORMAL . 
14f40 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70           || temp
14f50 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
14f60 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
14f70 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
14f80 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
14f90 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b  _EXCLUSIVE==1 );
14fa0 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
14fb0 73 69 76 65 4d 6f 64 65 20 3d 20 74 65 6d 70 46  siveMode = tempF
14fc0 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e  ile; .  pPager->
14fd0 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20  memDb = memDb;. 
14fe0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
14ff0 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20  y = readOnly;.  
15000 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  /* pPager->needS
15010 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ync = 0; */.  pP
15020 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70  ager->noSync = p
15030 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
15040 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a  || !useJournal;.
15050 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
15060 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f  nc = (pPager->no
15070 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61  Sync?0:1);.  pPa
15080 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20  ger->sync_flags 
15090 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
150a0 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65  RMAL;.  /* pPage
150b0 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a  r->pFirst = 0; *
150c0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
150d0 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
150e0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
150f0 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  >pLast = 0; */. 
15100 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
15110 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e  = FORCE_ALIGNMEN
15120 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 70 50 61  T(nExtra);.  pPa
15130 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
15140 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44  Limit = SQLITE_D
15150 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53  EFAULT_JOURNAL_S
15160 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73  IZE_LIMIT;.  ass
15170 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e  ert(pPager->fd->
15180 70 4d 65 74 68 6f 64 73 7c 7c 6d 65 6d 44 62 7c  pMethods||memDb|
15190 7c 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66  |tempFile);.  if
151a0 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  ( !memDb ){.    
151b0 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
151c0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  ager);.  }.  /* 
151d0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
151e0 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  dler = 0; */.  /
151f0 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d  * memset(pPager-
15200 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
15210 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
15220 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  ); */.  *ppPager
15230 20 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65   = pPager;.#ifde
15240 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
15250 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
15260 54 0a 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55  T.  pPager->iInU
15270 73 65 4d 4d 20 3d 20 30 3b 0a 20 20 70 50 61 67  seMM = 0;.  pPag
15280 65 72 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 30  er->iInUseDB = 0
15290 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20 29  ;.  if( !memDb )
152a0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
152b0 5f 4d 55 54 45 58 5f 4e 4f 4f 50 0a 20 20 20 20  _MUTEX_NOOP.    
152c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
152d0 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
152e0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
152f0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d  MUTEX_STATIC_MEM
15300 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  2);.#endif.    s
15310 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
15320 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 70  er(mutex);.    p
15330 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20 73  Pager->pNext = s
15340 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b  qlite3PagerList;
15350 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
15360 50 61 67 65 72 4c 69 73 74 20 29 7b 0a 20 20 20  PagerList ){.   
15370 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
15380 65 33 50 61 67 65 72 4c 69 73 74 2d 3e 70 50 72  e3PagerList->pPr
15390 65 76 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ev==0 );.      s
153a0 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 2d  qlite3PagerList-
153b0 3e 70 50 72 65 76 20 3d 20 70 50 61 67 65 72 3b  >pPrev = pPager;
153c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
153d0 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  r->pPrev = 0;.  
153e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69    sqlite3PagerLi
153f0 73 74 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20  st = pPager;.   
15400 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
15410 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 7d  eave(mutex);.  }
15420 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
15430 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
15440 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
15450 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
15460 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
15470 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
15480 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a 70 50  andler(Pager *pP
15490 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64 6c 65  ager, BusyHandle
154a0 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 29  r *pBusyHandler)
154b0 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73  {.  pPager->pBus
154c0 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75 73 79  yHandler = pBusy
154d0 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  Handler;.}../*.*
154e0 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 72 75  * Set the destru
154f0 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61  ctor for this pa
15500 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
15510 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  L, the destructo
15520 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77  r is called.** w
15530 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63  hen the referenc
15540 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20  e count on each 
15550 70 61 67 65 20 72 65 61 63 68 65 73 20 7a 65 72  page reaches zer
15560 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75 63 74  o.  The destruct
15570 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65  or can.** be use
15580 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e  d to clean up in
15590 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
155a0 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61   extra segment a
155b0 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20  ppended to each 
155c0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
155d0 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f  destructor is no
155e0 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65  t called as a re
155f0 73 75 6c 74 20 73 71 6c 69 74 65 33 50 61 67 65  sult sqlite3Page
15600 72 43 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44  rClose().  .** D
15610 65 73 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f  estructors are o
15620 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71  nly called by sq
15630 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
15640 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
15650 65 33 50 61 67 65 72 53 65 74 44 65 73 74 72 75  e3PagerSetDestru
15660 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  ctor(Pager *pPag
15670 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63  er, void (*xDesc
15680 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b  )(DbPage*,int)){
15690 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  .  pPager->xDest
156a0 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a  ructor = xDesc;.
156b0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
156c0 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66   reinitializer f
156d0 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
156e0 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
156f0 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a   reinitializer.*
15700 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  * is called when
15710 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
15720 61 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20  a page in cache 
15730 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
15740 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76  ts original.** v
15750 61 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c 74  alue as a result
15760 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20   of a rollback. 
15770 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69   The callback gi
15780 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c  ves higher-level
15790 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f   code.** an oppo
157a0 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f  rtunity to resto
157b0 72 65 20 74 68 65 20 45 58 54 52 41 20 73 65 63  re the EXTRA sec
157c0 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69  tion to agree wi
157d0 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a  th the restored.
157e0 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  ** page data..*/
157f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
15800 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 50 61  erSetReiniter(Pa
15810 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
15820 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50  d (*xReinit)(DbP
15830 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50  age*,int)){.  pP
15840 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
15850 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a  = xReinit;.}../*
15860 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67 65  .** Set the page
15870 20 73 69 7a 65 20 74 6f 20 2a 70 50 61 67 65 53   size to *pPageS
15880 69 7a 65 2e 20 49 66 20 74 68 65 20 73 75 67 67  ize. If the sugg
15890 65 73 74 20 6e 65 77 20 70 61 67 65 20 73 69 7a  est new page siz
158a0 65 20 69 73 0a 2a 2a 20 69 6e 61 70 70 72 6f 70  e is.** inapprop
158b0 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61  riate, then an a
158c0 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20  lternative page 
158d0 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  size is set to t
158e0 68 61 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65 66  hat.** value bef
158f0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
15900 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
15910 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61  erSetPagesize(Pa
15920 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36  ger *pPager, u16
15930 20 2a 70 50 61 67 65 53 69 7a 65 29 7b 0a 20 20   *pPageSize){.  
15940 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15950 4f 4b 3b 0a 20 20 75 31 36 20 70 61 67 65 53 69  OK;.  u16 pageSi
15960 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b  ze = *pPageSize;
15970 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53  .  assert( pageS
15980 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53  ize==0 || (pageS
15990 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
159a0 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
159b0 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20  _PAGE_SIZE) );. 
159c0 20 69 66 28 20 70 61 67 65 53 69 7a 65 20 26 26   if( pageSize &&
159d0 20 70 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65   pageSize!=pPage
159e0 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20  r->pageSize .   
159f0 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  && !pPager->memD
15a00 62 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65  b && pPager->nRe
15a10 66 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20 63  f==0 .  ){.    c
15a20 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61  har *pNew = (cha
15a30 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d  r *)sqlite3PageM
15a40 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b  alloc(pageSize);
15a50 0a 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29  .    if( !pNew )
15a60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
15a70 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
15a80 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65  else{.      page
15a90 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
15aa0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
15ab0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
15ac0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
15ad0 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
15ae0 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a      setSectorSiz
15af0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
15b00 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
15b10 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
15b20 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ce);.      pPage
15b30 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70  r->pTmpSpace = p
15b40 4e 65 77 3b 0a 20 20 20 20 20 20 70 61 67 65 72  New;.      pager
15b50 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
15b60 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 50 61 67     }.  }.  *pPag
15b70 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
15b80 70 61 67 65 53 69 7a 65 3b 0a 20 20 72 65 74 75  pageSize;.  retu
15b90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15ba0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
15bb0 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61   to the "tempora
15bc0 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20  ry page" buffer 
15bd0 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  held internally.
15be0 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e  ** by the pager.
15bf0 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66    This is a buff
15c00 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65  er that is big e
15c10 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
15c20 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74  e.** entire cont
15c30 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  ent of a databas
15c40 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75  e page.  This bu
15c50 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74  ffer is used int
15c60 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e  ernally.** durin
15c70 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77  g rollback and w
15c80 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74  ill be overwritt
15c90 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  en whenever a ro
15ca0 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73  llback.** occurs
15cb0 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64  .  But other mod
15cc0 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f  ules are free to
15cd0 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20   use it too, as 
15ce0 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f  long as.** no ro
15cf0 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70  llbacks are happ
15d00 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ening..*/.void *
15d10 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
15d20 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61  Space(Pager *pPa
15d30 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
15d40 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
15d50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
15d60 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61  pt to set the ma
15d70 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70  ximum database p
15d80 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50  age count if mxP
15d90 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
15da0 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61   .** Make no cha
15db0 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69  nges if mxPage i
15dc0 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  s zero or negati
15dd0 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72  ve.  And never r
15de0 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78  educe the.** max
15df0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
15e00 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e  below the curren
15e10 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
15e20 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  tabase..**.** Re
15e30 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61  gardless of mxPa
15e40 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63  ge, return the c
15e50 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70  urrent maximum p
15e60 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
15e70 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  t sqlite3PagerMa
15e80 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72  xPageCount(Pager
15e90 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
15ea0 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
15eb0 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61  age>0 ){.    pPa
15ec0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78  ger->mxPgno = mx
15ed0 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Page;.  }.  sqli
15ee0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
15ef0 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  t(pPager, 0);.  
15f00 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d  return pPager->m
15f10 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xPgno;.}../*.** 
15f20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  The following se
15f30 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  t of routines ar
15f40 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c  e used to disabl
15f50 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a  e the simulated.
15f60 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63  ** I/O error mec
15f70 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72  hanism.  These r
15f80 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
15f90 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61   to avoid simula
15fa0 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e  ted.** errors in
15fb0 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65   places where we
15fc0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
15fd0 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ut errors..**.**
15fe0 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45   Unless -DSQLITE
15ff0 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c  _TEST=1 is used,
16000 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
16010 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
16020 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e  * and generate n
16030 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65  o code..*/.#ifde
16040 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78  f SQLITE_TEST.ex
16050 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
16060 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
16070 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
16080 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
16090 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  it;.static int s
160a0 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64  aved_cnt;.void d
160b0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
160c0 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
160d0 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
160e0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
160f0 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
16100 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
16110 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
16120 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
16130 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
16140 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
16150 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
16160 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
16170 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73  lse.# define dis
16180 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
16190 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
161a0 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
161b0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
161c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
161d0 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
161e0 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
161f0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
16200 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
16210 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
16220 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a  oints to. .**.**
16230 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69   No error checki
16240 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20  ng is done. The 
16250 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69  rational for thi
16260 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  s is that this f
16270 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20  unction .** may 
16280 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69  be called even i
16290 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  f the file does 
162a0 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e  not exist or con
162b0 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49  tain a header. I
162c0 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65  n .** these case
162d0 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  s sqlite3OsRead(
162e0 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e  ) will return an
162f0 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68   error, to which
16300 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a   the correct .**
16310 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20   response is to 
16320 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20  zero the memory 
16330 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e  at pDest and con
16340 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49  tinue.  A real I
16350 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c  O error .** will
16360 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75   presumably recu
16370 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20  r and be picked 
16380 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20  up later (Todo: 
16390 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73  Think about this
163a0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
163b0 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
163c0 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
163d0 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
163e0 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
163f0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16400 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
16410 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
16420 20 61 73 73 65 72 74 28 4d 45 4d 44 42 7c 7c 70   assert(MEMDB||p
16430 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
16440 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d  ods||pPager->tem
16450 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 50  pFile);.  if( pP
16460 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
16470 64 73 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  ds ){.    IOTRAC
16480 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
16490 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
164a0 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
164b0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
164c0 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
164d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
164e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
164f0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
16500 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16510 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
16520 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16530 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
16540 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
16550 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
16560 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
16570 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a  h.** pPager. .**
16580 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49  .** If the PENDI
16590 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20  NG_BYTE lies on 
165a0 74 68 65 20 70 61 67 65 20 64 69 72 65 63 74 6c  the page directl
165b0 79 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20  y after the end 
165c0 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20  of the.** file, 
165d0 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68  then consider th
165e0 69 73 20 70 61 67 65 20 70 61 72 74 20 6f 66 20  is page part of 
165f0 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f  the file too. Fo
16600 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a  r example, if.**
16610 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73   PENDING_BYTE is
16620 20 62 79 74 65 20 34 30 39 36 20 28 74 68 65 20   byte 4096 (the 
16630 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 70 61  first byte of pa
16640 67 65 20 35 29 20 61 6e 64 20 74 68 65 20 73 69  ge 5) and the si
16650 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  ze of the.** fil
16660 65 20 69 73 20 34 30 39 36 20 62 79 74 65 73 2c  e is 4096 bytes,
16670 20 35 20 69 73 20 72 65 74 75 72 6e 65 64 20 69   5 is returned i
16680 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a  nstead of 4..*/.
16690 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
166a0 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
166b0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e  *pPager, int *pn
166c0 50 61 67 65 29 7b 0a 20 20 69 36 34 20 6e 20 3d  Page){.  i64 n =
166d0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
166e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
166f0 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
16700 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
16710 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
16720 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
16730 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
16740 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d  ze>=0 ){.    n =
16750 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
16760 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
16770 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66  assert(pPager->f
16780 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61  d->pMethods||pPa
16790 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
167a0 20 20 20 20 69 66 28 20 28 70 50 61 67 65 72 2d      if( (pPager-
167b0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 20  >fd->pMethods). 
167c0 20 20 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c      && (rc = sql
167d0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
167e0 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21  Pager->fd, &n))!
167f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16800 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
16810 2b 2b 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f  ++;.      pager_
16820 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
16830 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
16840 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20 72  >nRef--;.      r
16850 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
16860 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e      if( n>0 && n
16870 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  <pPager->pageSiz
16880 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31  e ){.      n = 1
16890 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
168a0 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e     n /= pPager->
168b0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a  pageSize;.    }.
168c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
168d0 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
168e0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
168f0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b  ger->dbSize = n;
16900 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
16910 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54   n==(PENDING_BYT
16920 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  E/pPager->pageSi
16930 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a  ze) ){.    n++;.
16940 20 20 7d 0a 20 20 69 66 28 20 6e 3e 70 50 61 67    }.  if( n>pPag
16950 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
16960 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
16970 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = n;.  }.  if( 
16980 70 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70  pnPage ){.    *p
16990 6e 50 61 67 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20  nPage = n;.  }. 
169a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
169b0 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  K;.}...#ifndef S
169c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
169d0 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  YDB./*.** Clear 
169e0 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63  a PgHistory bloc
169f0 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  k.*/.static void
16a00 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67   clearHistory(Pg
16a10 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b  History *pHist){
16a20 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  .  sqlite3PageFr
16a30 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29  ee(pHist->pOrig)
16a40 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  ;.  sqlite3PageF
16a50 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
16a60 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69  );.  pHist->pOri
16a70 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e  g = 0;.  pHist->
16a80 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c  pStmt = 0;.}.#el
16a90 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72  se.#define clear
16aa0 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69  History(x).#endi
16ab0 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  f../*.** Forward
16ac0 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
16ad0 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
16ae0 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a  ournal(Pager*);.
16af0 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50  ./*.** Unlink pP
16b00 67 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20  g from its hash 
16b10 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20  chain. Also set 
16b20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
16b30 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65  to 0 to indicate
16b40 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
16b50 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  e is not part of
16b60 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e   any hash chain.
16b70 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
16b80 64 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a  d because the.**
16b90 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
16ba0 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20  epage() routine 
16bb0 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65  can leave a page
16bc0 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78   in the .** pNex
16bd0 74 46 72 65 65 2f 70 50 72 65 76 46 72 65 65 20  tFree/pPrevFree 
16be0 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74  list that is not
16bf0 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68   a part of any h
16c00 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74  ash-chain..*/.st
16c10 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b  atic void unlink
16c20 48 61 73 68 43 68 61 69 6e 28 50 61 67 65 72 20  HashChain(Pager 
16c30 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
16c40 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
16c50 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  >pgno==0 ){.    
16c60 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
16c70 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67  xtHash==0 && pPg
16c80 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
16c90 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
16ca0 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
16cb0 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50  xtHash ){.    pP
16cc0 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
16cd0 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  revHash = pPg->p
16ce0 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20  PrevHash;.  }.  
16cf0 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61  if( pPg->pPrevHa
16d00 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  sh ){.    assert
16d10 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
16d20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61  pPg->pgno & (pPa
16d30 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21 3d  ger->nHash-1)]!=
16d40 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
16d50 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74  pPrevHash->pNext
16d60 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Hash = pPg->pNex
16d70 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tHash;.  }else{.
16d80 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67 2d      int h = pPg-
16d90 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d  >pgno & (pPager-
16da0 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 70  >nHash-1);.    p
16db0 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
16dc0 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  = pPg->pNextHash
16dd0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44  ;.  }.  if( MEMD
16de0 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48 69  B ){.    clearHi
16df0 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48  story(PGHDR_TO_H
16e00 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
16e10 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67  );.  }.  pPg->pg
16e20 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70  no = 0;.  pPg->p
16e30 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
16e40 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d  pPrevHash = 0;.}
16e50 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61  ../*.** Unlink a
16e60 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
16e70 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69  ree list (the li
16e80 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
16e90 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a  where nRef==0).*
16ea0 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68  * and from its h
16eb0 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68  ash collision ch
16ec0 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ain..*/.static v
16ed0 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50  oid unlinkPage(P
16ee0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
16ef0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
16f00 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  g->pPager;..  /*
16f10 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 66 72 65   Unlink from fre
16f20 65 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20  e page list */. 
16f30 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70   lruListRemove(p
16f40 50 67 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  Pg);..  /* Unlin
16f50 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20  k from the pgno 
16f60 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
16f70 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
16f80 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a  pPager, pPg);.}.
16f90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
16fa0 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 74  ine is used to t
16fb0 72 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68  runcate the cach
16fc0 65 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73  e when a databas
16fd0 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61 74 65  e.** is truncate
16fe0 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20 74 68  d.  Drop from th
16ff0 65 20 63 61 63 68 65 20 61 6c 6c 20 70 61 67 65  e cache all page
17000 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a  s whose pgno is.
17010 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  ** larger than p
17020 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e  Pager->dbSize an
17030 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65  d is unreference
17040 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e  d..**.** Referen
17050 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72  ced pages larger
17060 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
17070 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  Size are zeroed.
17080 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  .**.** Actually,
17090 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68   at the point th
170a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
170b0 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64 20 62  lled, it would b
170c0 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  e.** an error to
170d0 20 68 61 76 65 20 61 20 72 65 66 65 72 65 6e 63   have a referenc
170e0 65 64 20 70 61 67 65 2e 20 20 42 75 74 20 72 61  ed page.  But ra
170f0 74 68 65 72 20 74 68 61 6e 20 64 65 6c 65 74 65  ther than delete
17100 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 61 6e  .** that page an
17110 64 20 67 75 61 72 61 6e 74 65 65 20 61 20 73 75  d guarantee a su
17120 62 73 65 71 75 65 6e 74 20 73 65 67 66 61 75 6c  bsequent segfaul
17130 74 2c 20 69 74 20 73 65 65 6d 73 20 62 65 74 74  t, it seems bett
17140 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74  er.** to zero it
17150 20 61 6e 64 20 68 6f 70 65 20 74 68 61 74 20 77   and hope that w
17160 65 20 65 72 72 6f 72 20 6f 75 74 20 73 61 6e 65  e error out sane
17170 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
17180 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  id pager_truncat
17190 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70  e_cache(Pager *p
171a0 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
171b0 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a  *pPg;.  PgHdr **
171c0 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69  ppPg;.  int dbSi
171d0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
171e0 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26  ize;..  ppPg = &
171f0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20  pPager->pAll;.  
17200 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70  while( (pPg = *p
17210 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  pPg)!=0 ){.    i
17220 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62  f( pPg->pgno<=db
17230 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70  Size ){.      pp
17240 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74  Pg = &pPg->pNext
17250 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  All;.    }else i
17260 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  f( pPg->nRef>0 )
17270 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
17280 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
17290 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  ), 0, pPager->pa
172a0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  geSize);.      p
172b0 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
172c0 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tAll;.    }else{
172d0 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70  .      *ppPg = p
172e0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 23 69  Pg->pNextAll;.#i
172f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
17300 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
17310 4d 45 4e 54 0a 20 20 20 20 20 20 69 66 28 20 2a  MENT.      if( *
17320 70 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ppPg ){.        
17330 28 2a 70 70 50 67 29 2d 3e 70 50 72 65 76 41 6c  (*ppPg)->pPrevAl
17340 6c 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 41 6c  l = pPg->pPrevAl
17350 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  l;.      }.#endi
17360 66 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  f.      IOTRACE(
17370 28 22 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e  ("PGFREE %p %d\n
17380 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
17390 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41  pgno));.      PA
173a0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
173b0 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f  _pager_pgfree_co
173c0 75 6e 74 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69  unt);.      unli
173d0 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  nkPage(pPg);.   
173e0 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
173f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17400 50 61 67 65 46 72 65 65 28 70 50 67 2d 3e 70 44  PageFree(pPg->pD
17410 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ata);.      sqli
17420 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a 20  te3_free(pPg);. 
17430 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61       pPager->nPa
17440 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ge--;.    }.  }.
17450 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
17460 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e  obtain a lock on
17470 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65   a file.  Invoke
17480 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
17490 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a  ck if the lock.*
174a0 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  * is currently n
174b0 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52  ot available.  R
174c0 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20  epeat until the 
174d0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
174e0 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f  turns.** false o
174f0 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b  r until the lock
17500 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
17510 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
17520 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
17530 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
17540 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
17550 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a  in.** the lock..
17560 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
17570 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
17580 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
17590 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
175a0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
175b0 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65  he OS lock value
175c0 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  s must be the sa
175d0 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20  me as the Pager 
175e0 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20  lock values */. 
175f0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53   assert( PAGER_S
17600 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f  HARED==SHARED_LO
17610 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
17620 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d  PAGER_RESERVED==
17630 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
17640 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
17650 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c  _EXCLUSIVE==EXCL
17660 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  USIVE_LOCK );.. 
17670 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
17680 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c  is currently unl
17690 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73  ocked then the s
176a0 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e  ize must be unkn
176b0 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  own */.  assert(
176c0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
176d0 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
176e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30  pPager->dbSize<0
176f0 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20   || MEMDB );..  
17700 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
17710 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
17720 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
17730 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
17740 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 75 73  if( pPager->pBus
17750 79 48 61 6e 64 6c 65 72 20 29 20 70 50 61 67 65  yHandler ) pPage
17760 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d  r->pBusyHandler-
17770 3e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20  >nBusy = 0;.    
17780 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  do {.      rc = 
17790 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
177a0 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79  ager->fd, lockty
177b0 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  pe);.    }while(
177c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
177d0 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b   && sqlite3Invok
177e0 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61  eBusyHandler(pPa
177f0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
17800 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  r) );.    if( rc
17810 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17820 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
17830 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  te = locktype;. 
17840 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
17850 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
17860 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29  ager, locktype))
17870 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17880 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17890 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   Truncate the fi
178a0 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  le to the number
178b0 20 6f 66 20 70 61 67 65 73 20 73 70 65 63 69 66   of pages specif
178c0 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ied..*/.int sqli
178d0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
178e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
178f0 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
17900 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
17910 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
17920 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
17930 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c 69 74  MEMDB );.  sqlit
17940 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
17950 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 69  (pPager, 0);.  i
17960 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
17970 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  de ){.    rc = p
17980 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
17990 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
179a0 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d   }.  if( nPage>=
179b0 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
179c0 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
179d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
179e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44  ;.  }.  if( MEMD
179f0 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
17a00 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
17a10 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  .    pager_trunc
17a20 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72  ate_cache(pPager
17a30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
17a40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
17a50 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
17a60 29 3b 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f  );.  rc = syncJo
17a70 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
17a80 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
17a90 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
17aa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17ab0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
17ac0 20 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c    /* Get an excl
17ad0 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
17ae0 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
17af0 65 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f  e truncating. */
17b00 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
17b10 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61  ager);.  rc = pa
17b20 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
17b30 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
17b40 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 70 61 67 65  VE_LOCK);.  page
17b50 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
17b60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17b70 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
17b80 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  n rc;.  }..  rc 
17b90 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
17ba0 28 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b  (pPager, nPage);
17bb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17bc0 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
17bd0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
17be0 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
17bf0 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66   and close all f
17c00 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iles..**.** If a
17c10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
17c20 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65   in progress whe
17c30 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
17c40 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a  s called, that.*
17c50 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
17c60 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41   rolled back.  A
17c70 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ll outstanding p
17c80 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
17c90 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69  ated.** and thei
17ca0 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65  r memory is free
17cb0 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  d.  Any attempt 
17cc0 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73  to use a page as
17cd0 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
17ce0 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65   this page cache
17cf0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
17d00 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c  tion returns wil
17d10 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
17d20 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
17d30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
17d40 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63  ction always suc
17d50 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e  ceeds. If a tran
17d60 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
17d70 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20  e an attempt.** 
17d80 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20  is made to roll 
17d90 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65  it back. If an e
17da0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
17db0 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ng the rollback 
17dc0 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  .** a hot journa
17dd0 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e  l may be left in
17de0 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
17df0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20  but no error is 
17e00 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74  returned.** to t
17e10 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e  he caller..*/.in
17e20 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  t sqlite3PagerCl
17e30 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
17e40 72 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  r){.#ifdef SQLIT
17e50 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
17e60 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28  MANAGEMENT.  if(
17e70 20 21 4d 45 4d 44 42 20 29 7b 0a 23 69 66 6e 64   !MEMDB ){.#ifnd
17e80 65 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  ef SQLITE_MUTEX_
17e90 4e 4f 4f 50 0a 20 20 20 20 73 71 6c 69 74 65 33  NOOP.    sqlite3
17ea0 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 20 3d 20  _mutex *mutex = 
17eb0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
17ec0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
17ed0 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 23 65 6e  TATIC_MEM2);.#en
17ee0 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
17ef0 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
17f00 78 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  x);.    if( pPag
17f10 65 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  er->pPrev ){.   
17f20 20 20 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76     pPager->pPrev
17f30 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 67 65 72  ->pNext = pPager
17f40 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
17f50 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
17f60 33 50 61 67 65 72 4c 69 73 74 20 3d 20 70 50 61  3PagerList = pPa
17f70 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ger->pNext;.    
17f80 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
17f90 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
17fa0 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 2d 3e   pPager->pNext->
17fb0 70 50 72 65 76 20 3d 20 70 50 61 67 65 72 2d 3e  pPrev = pPager->
17fc0 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20  pPrev;.    }.   
17fd0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
17fe0 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 7d  eave(mutex);.  }
17ff0 0a 23 65 6e 64 69 66 0a 0a 20 20 64 69 73 61 62  .#endif..  disab
18000 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
18010 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69  errors();.  sqli
18020 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
18030 6c 6c 6f 63 28 29 3b 0a 20 20 70 50 61 67 65 72  lloc();.  pPager
18040 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
18050 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
18060 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61  veMode = 0;.  pa
18070 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
18080 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  );.  pagerUnlock
18090 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
180a0 65 72 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69  er);.  enable_si
180b0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
180c0 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e  s();.  sqlite3En
180d0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
180e0 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
180f0 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47  CLOSE %d\n", PAG
18100 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
18110 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45   IOTRACE(("CLOSE
18120 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
18130 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
18140 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
18150 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
18160 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
18170 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76   }.  sqlite3Bitv
18180 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
18190 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
181a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
181b0 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  tOpen ){.    sql
181c0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
181d0 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20  er->stfd);.  }. 
181e0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
181f0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f  pPager->fd);.  /
18200 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65  * Temp files are
18210 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
18220 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53  eleted by the OS
18230 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72  .  ** if( pPager
18240 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
18250 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65  **   sqlite3OsDe
18260 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69  lete(pPager->zFi
18270 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a  lename);.  ** }.
18280 20 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f    */..  sqlite3_
18290 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61  free(pPager->aHa
182a0 73 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  sh);.  sqlite3Pa
182b0 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
182c0 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c  TmpSpace);.  sql
182d0 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
182e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
182f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64  TE_OK;.}..#if !d
18300 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
18310 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
18320 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
18330 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
18340 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65  ber for the give
18350 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  n page data..*/.
18360 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65  Pgno sqlite3Page
18370 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61  rPagenumber(DbPa
18380 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ge *p){.  return
18390 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64   p->pgno;.}.#end
183a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  if../*.** The pa
183b0 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f  ge_ref() functio
183c0 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  n increments the
183d0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
183e0 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20   for a page..** 
183f0 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 63  If the page is c
18400 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
18410 66 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65  freelist (the re
18420 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
18430 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72   zero) then.** r
18440 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68  emove it from th
18450 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a  e freelist..**.*
18460 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73  * For non-test s
18470 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66  ystems, page_ref
18480 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68  () is a macro th
18490 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72  at calls _page_r
184a0 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f  ef().** online o
184b0 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  f the reference 
184c0 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20  count is zero.  
184d0 46 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d 73  For test systems
184e0 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20  , page_ref().** 
184f0 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  is a real functi
18500 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  on so that we ca
18510 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74  n set breakpoint
18520 73 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a  s and trace it..
18530 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f  */.static void _
18540 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a  page_ref(PgHdr *
18550 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
18560 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
18570 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63  /* The page is c
18580 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
18590 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76  freelist.  Remov
185a0 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 6c 72 75  e it. */.    lru
185b0 4c 69 73 74 52 65 6d 6f 76 65 28 70 50 67 29 3b  ListRemove(pPg);
185c0 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
185d0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
185e0 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 23  pPg->nRef++;.}.#
185f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
18600 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
18610 20 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20   page_ref(PgHdr 
18620 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70  *pPg){.    if( p
18630 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
18640 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70       _page_ref(p
18650 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
18660 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b        pPg->nRef+
18670 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  +;.    }.  }.#el
18680 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
18690 5f 72 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e  _ref(P)   ((P)->
186a0 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65  nRef==0?_page_re
186b0 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e  f(P):(void)(P)->
186c0 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a  nRef++).#endif..
186d0 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
186e0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
186f0 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  unt for a page. 
18700 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74   The input point
18710 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72  er is.** a refer
18720 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
18730 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71   data..*/.int sq
18740 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62  lite3PagerRef(Db
18750 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 70 61  Page *pPg){.  pa
18760 67 65 72 45 6e 74 65 72 28 70 50 67 2d 3e 70 50  gerEnter(pPg->pP
18770 61 67 65 72 29 3b 0a 20 20 70 61 67 65 5f 72 65  ager);.  page_re
18780 66 28 70 50 67 29 3b 0a 20 20 70 61 67 65 72 4c  f(pPg);.  pagerL
18790 65 61 76 65 28 70 50 67 2d 3e 70 50 61 67 65 72  eave(pPg->pPager
187a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
187b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
187c0 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
187d0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
187e0 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  s, make sure all
187f0 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
18800 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69  have.** been wri
18810 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
18820 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c  nal have actuall
18830 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75  y reached the su
18840 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  rface of the.** 
18850 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74  disk.  It is not
18860 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20   safe to modify 
18870 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
18880 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c  abase file until
18890 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f   after.** the jo
188a0 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73  urnal has been s
188b0 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f  ynced.  If the o
188c0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
188d0 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66   is modified bef
188e0 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ore.** the journ
188f0 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64  al is synced and
18900 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
18910 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73   occurs, the uns
18920 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ynced journal.**
18930 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c   data would be l
18940 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64  ost and we would
18950 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f   be unable to co
18960 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63  mpletely rollbac
18970 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
18980 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61  e changes.  Data
18990 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
189a0 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20  would occur..** 
189b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
189c0 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68   also updates th
189d0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20  e nRec field in 
189e0 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68  the header of th
189f0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53  e journal..** (S
18a00 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74  ee comments on t
18a10 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
18a20 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  k() routine for 
18a30 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
18a40 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74  mation.).** If t
18a50 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  he sync mode is 
18a60 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20  FULL, two syncs 
18a70 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72  will occur.  Fir
18a80 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75  st the whole jou
18a90 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65  rnal.** is synce
18aa0 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63  d, then the nRec
18ab0 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
18ac0 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64  d, then a second
18ad0 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
18ae0 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
18af0 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20  y databases, we 
18b00 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77  do not care if w
18b10 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f  e are able to ro
18b20 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20  llback.** after 
18b30 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
18b40 20 73 6f 20 6e 6f 20 73 79 6e 63 20 6f 63 63 75   so no sync occu
18b50 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  rs..**.** If the
18b60 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41   IOCAP_SEQUENTIA
18b70 4c 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f  L flag is set fo
18b80 72 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  r the persistent
18b90 20 6d 65 64 69 61 20 6f 6e 20 77 68 69 63 68 0a   media on which.
18ba0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
18bb0 69 73 20 73 74 6f 72 65 64 2c 20 74 68 65 6e 20  is stored, then 
18bc0 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
18bd0 72 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  r called on the 
18be0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e  journal.** file.
18bf0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c   In this case al
18c00 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
18c10 65 64 20 69 73 20 74 6f 20 75 70 64 61 74 65 20  ed is to update 
18c20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
18c30 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n.** the journal
18c40 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   header..**.** T
18c50 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
18c60 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  rs the needSync 
18c70 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70  field of every p
18c80 61 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64  age current held
18c90 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a   in.** memory..*
18ca0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
18cb0 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  cJournal(Pager *
18cc0 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
18cd0 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20   *pPg;.  int rc 
18ce0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
18cf0 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
18d00 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  nal before modif
18d10 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61  ying the main da
18d20 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73  tabase.  ** (ass
18d30 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 61  uming there is a
18d40 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20   journal and it 
18d50 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
18d60 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ed.).  */.  if( 
18d70 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
18d80 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
18d90 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
18da0 0a 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d  .      int iDc =
18db0 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
18dc0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
18dd0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
18de0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
18df0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
18e00 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ;..      if( 0==
18e10 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
18e20 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
18e30 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  {.        /* Wri
18e40 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
18e50 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
18e60 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  al file header. 
18e70 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  If in.        **
18e80 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75   full-synchronou
18e90 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  s mode, sync the
18ea0 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20   journal first. 
18eb0 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
18ec0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  t.        ** all
18ed0 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79   data has really
18ee0 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65   hit the disk be
18ef0 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64  fore nRec is upd
18f00 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20  ated to mark.   
18f10 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20       ** it as a 
18f20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f  candidate for ro
18f30 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20  llback..        
18f40 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
18f50 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
18f60 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73  ed if the persis
18f70 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f  tent media suppo
18f80 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  rts the.        
18f90 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  ** SAFE_APPEND p
18fa0 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65  roperty. Because
18fb0 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   in this case it
18fc0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
18fd0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72   .        ** for
18fe0 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f   garbage data to
18ff0 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20   be appended to 
19000 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52  the file, the nR
19010 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20  ec field.       
19020 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64   ** is populated
19030 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46   with 0xFFFFFFFF
19040 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
19050 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74  l header is writ
19060 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ten.        ** a
19070 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74  nd never needs t
19080 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20  o be updated..  
19090 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
190a0 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20   i64 jrnlOff;.  
190b0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
190c0 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d  ->fullSync && 0=
190d0 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
190e0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
190f0 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  {.          PAGE
19100 52 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f  RTRACE2("SYNC jo
19110 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
19120 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
19130 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  ;.          IOTR
19140 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
19150 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
19160 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19170 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
19180 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
19190 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  nc_flags);.     
191a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
191b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
191c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 6a      }..        j
191d0 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  rnlOff = pPager-
191e0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69  >journalHdr + si
191f0 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
19200 69 63 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  ic);.        IOT
19210 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
19220 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
19230 72 2c 20 6a 72 6e 6c 4f 66 66 2c 20 34 29 29 3b  r, jrnlOff, 4));
19240 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
19250 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
19260 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20  ->jfd, jrnlOff, 
19270 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20  pPager->nRec);. 
19280 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
19290 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
192a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d   }.      if( 0==
192b0 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
192c0 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
192d0 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
192e0 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE2("SYNC journ
192f0 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
19300 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
19310 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
19320 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
19330 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
19340 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
19350 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
19360 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
19370 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  s| .          (p
19380 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
19390 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  s==SQLITE_SYNC_F
193a0 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL?SQLITE_SYNC_
193b0 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20  DATAONLY:0).    
193c0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
193d0 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72  f( rc!=0 ) retur
193e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
193f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
19400 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a  nalStarted = 1;.
19410 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
19420 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
19430 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68  .    /* Erase th
19440 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
19450 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e  from every page.
19460 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
19470 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
19480 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
19490 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
194a0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
194b0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 72   0;.    }.    lr
194c0 75 4c 69 73 74 53 65 74 46 69 72 73 74 53 79 6e  uListSetFirstSyn
194d0 63 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ced(pPager);.  }
194e0 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
194f0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67  .  /* If the Pag
19500 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
19510 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74   is clear then t
19520 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
19530 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74  c.  ** flag must
19540 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66   also be clear f
19550 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56  or all pages.  V
19560 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 0a  erify that this.
19570 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69    ** invariant i
19580 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65  s true..  */.  e
19590 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67  lse{.    for(pPg
195a0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
195b0 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
195c0 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73  xtAll){.      as
195d0 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53  sert( pPg->needS
195e0 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  ync==0 );.    }.
195f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
19600 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79  er->lru.pFirstSy
19610 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 6c 72  nced==pPager->lr
19620 75 2e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a  u.pFirst );.  }.
19630 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
19640 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65   rc;.}../*.** Me
19650 72 67 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66  rge two lists of
19660 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
19670 20 62 79 20 70 44 69 72 74 79 20 61 6e 64 20 69   by pDirty and i
19680 6e 20 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a  n pgno order..**
19690 20 44 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69 78   Do not both fix
196a0 69 6e 67 20 74 68 65 20 70 50 72 65 76 44 69 72  ing the pPrevDir
196b0 74 79 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a  ty pointers..*/.
196c0 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 6d 65  static PgHdr *me
196d0 72 67 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  rge_pagelist(PgH
196e0 64 72 20 2a 70 41 2c 20 50 67 48 64 72 20 2a 70  dr *pA, PgHdr *p
196f0 42 29 7b 0a 20 20 50 67 48 64 72 20 72 65 73 75  B){.  PgHdr resu
19700 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54  lt, *pTail;.  pT
19710 61 69 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20  ail = &result;. 
19720 20 77 68 69 6c 65 28 20 70 41 20 26 26 20 70 42   while( pA && pB
19730 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
19740 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b  pgno<pB->pgno ){
19750 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  .      pTail->pD
19760 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 20 20 20  irty = pA;.     
19770 20 70 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20   pTail = pA;.   
19780 20 20 20 70 41 20 3d 20 70 41 2d 3e 70 44 69 72     pA = pA->pDir
19790 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ty;.    }else{. 
197a0 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72       pTail->pDir
197b0 74 79 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70  ty = pB;.      p
197c0 54 61 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20  Tail = pB;.     
197d0 20 70 42 20 3d 20 70 42 2d 3e 70 44 69 72 74 79   pB = pB->pDirty
197e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
197f0 28 20 70 41 20 29 7b 0a 20 20 20 20 70 54 61 69  ( pA ){.    pTai
19800 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a  l->pDirty = pA;.
19810 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 20 29    }else if( pB )
19820 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69  {.    pTail->pDi
19830 72 74 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73  rty = pB;.  }els
19840 65 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  e{.    pTail->pD
19850 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  irty = 0;.  }.  
19860 72 65 74 75 72 6e 20 72 65 73 75 6c 74 2e 70 44  return result.pD
19870 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  irty;.}../*.** S
19880 6f 72 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ort the list of 
19890 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
198a0 6e 67 20 6f 72 64 65 72 20 62 79 20 70 67 6e 6f  ng order by pgno
198b0 2e 20 20 50 61 67 65 73 20 61 72 65 0a 2a 2a 20  .  Pages are.** 
198c0 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
198d0 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 20 20 54  rty pointers.  T
198e0 68 65 20 70 50 72 65 76 44 69 72 74 79 20 70 6f  he pPrevDirty po
198f0 69 6e 74 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f  inters are.** co
19900 72 72 75 70 74 65 64 20 62 79 20 74 68 69 73 20  rrupted by this 
19910 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  sort..*/.#define
19920 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41   N_SORT_BUCKET_A
19930 4c 4c 4f 43 20 32 35 0a 23 64 65 66 69 6e 65 20  LLOC 25.#define 
19940 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 20 20  N_SORT_BUCKET   
19950 20 20 20 20 32 35 0a 23 69 66 64 65 66 20 53 51      25.#ifdef SQ
19960 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
19970 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f  sqlite3_pager_n_
19980 73 6f 72 74 5f 62 75 63 6b 65 74 20 3d 20 30 3b  sort_bucket = 0;
19990 0a 20 20 23 75 6e 64 65 66 20 4e 5f 53 4f 52 54  .  #undef N_SORT
199a0 5f 42 55 43 4b 45 54 0a 20 20 23 64 65 66 69 6e  _BUCKET.  #defin
199b0 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20  e N_SORT_BUCKET 
199c0 5c 0a 20 20 20 28 73 71 6c 69 74 65 33 5f 70 61  \.   (sqlite3_pa
199d0 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65  ger_n_sort_bucke
199e0 74 3f 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t?sqlite3_pager_
199f0 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3a 4e 5f  n_sort_bucket:N_
19a00 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f  SORT_BUCKET_ALLO
19a10 43 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  C).#endif.static
19a20 20 50 67 48 64 72 20 2a 73 6f 72 74 5f 70 61 67   PgHdr *sort_pag
19a30 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 49 6e  elist(PgHdr *pIn
19a40 29 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f  ){.  PgHdr *a[N_
19a50 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f  SORT_BUCKET_ALLO
19a60 43 5d 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  C], *p;.  int i;
19a70 0a 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20  .  memset(a, 0, 
19a80 73 69 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77 68  sizeof(a));.  wh
19a90 69 6c 65 28 20 70 49 6e 20 29 7b 0a 20 20 20 20  ile( pIn ){.    
19aa0 70 20 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e  p = pIn;.    pIn
19ab0 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20   = p->pDirty;.  
19ac0 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b    p->pDirty = 0;
19ad0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
19ae0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b  N_SORT_BUCKET-1;
19af0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
19b00 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20   a[i]==0 ){.    
19b10 20 20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20      a[i] = p;.  
19b20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19b30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19b40 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65    p = merge_page
19b50 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20  list(a[i], p);. 
19b60 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b         a[i] = 0;
19b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19b80 20 20 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54     if( i==N_SORT
19b90 5f 42 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20  _BUCKET-1 ){.   
19ba0 20 20 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20     /* Coverage: 
19bb0 54 6f 20 67 65 74 20 68 65 72 65 2c 20 74 68 65  To get here, the
19bc0 72 65 20 6e 65 65 64 20 74 6f 20 62 65 20 32 5e  re need to be 2^
19bd0 28 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 29 20  (N_SORT_BUCKET) 
19be0 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e  .      ** elemen
19bf0 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20  ts in the input 
19c00 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 70 6f  list. This is po
19c10 73 73 69 62 6c 65 2c 20 62 75 74 20 69 6d 70 72  ssible, but impr
19c20 61 63 74 69 63 61 6c 2e 0a 20 20 20 20 20 20 2a  actical..      *
19c30 2a 20 54 65 73 74 69 6e 67 20 74 68 69 73 20 6c  * Testing this l
19c40 69 6e 65 20 69 73 20 74 68 65 20 70 6f 69 6e 74  ine is the point
19c50 20 6f 66 20 67 6c 6f 62 61 6c 20 76 61 72 69 61   of global varia
19c60 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  ble.      ** sql
19c70 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72  ite3_pager_n_sor
19c80 74 5f 62 75 63 6b 65 74 2e 0a 20 20 20 20 20 20  t_bucket..      
19c90 2a 2f 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d 20  */.      a[i] = 
19ca0 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61  merge_pagelist(a
19cb0 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20  [i], p);.    }. 
19cc0 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a 20   }.  p = a[0];. 
19cd0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f   for(i=1; i<N_SO
19ce0 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29 7b  RT_BUCKET; i++){
19cf0 0a 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70  .    p = merge_p
19d00 61 67 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d 29  agelist(p, a[i])
19d10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
19d20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
19d30 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73   a list of pages
19d40 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74   (connected by t
19d50 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
19d60 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a  pointer) write.*
19d70 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74  * every one of t
19d80 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74  hose pages out t
19d90 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
19da0 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65  ile and mark the
19db0 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61  m all.** as clea
19dc0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
19dd0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
19de0 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69  elist(PgHdr *pLi
19df0 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  st){.  Pager *pP
19e00 61 67 65 72 3b 0a 20 20 50 67 48 64 72 20 2a 70  ager;.  PgHdr *p
19e10 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
19e20 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
19e30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19e40 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74    pPager = pList
19e50 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
19e60 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
19e70 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65  ere may be eithe
19e80 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
19e90 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
19ea0 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
19eb0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
19ec0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
19ed0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
19ee0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
19ef0 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
19f00 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65  ite3OsLock() are
19f10 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20   no-ops..  **.  
19f20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f  ** Moving the lo
19f30 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44  ck from RESERVED
19f40 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63   to EXCLUSIVE ac
19f50 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20  tually involves 
19f60 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75  going.  ** throu
19f70 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61  gh an intermedia
19f80 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47  te state PENDING
19f90 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  .   A PENDING lo
19fa0 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a  ck prevents new.
19fb0 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f    ** readers fro
19fc0 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74  m attaching to t
19fd0 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20  he database but 
19fe0 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20  is unsufficient 
19ff0 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77  for us to.  ** w
1a000 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20  rite.  The idea 
1a010 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  of a PENDING loc
1a020 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20  k is to prevent 
1a030 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d  new readers from
1a040 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20  .  ** coming in 
1a050 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f  while we wait fo
1a060 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65  r existing reade
1a070 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a  rs to clear..  *
1a080 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65  *.  ** While the
1a090 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
1a0a0 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
1a0b0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
1a0c0 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a  tabase file.  **
1a0d0 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   is unchanged an
1a0e0 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63  d we can rollbac
1a0f0 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
1a100 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65   to playback the
1a110 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e  .  ** journal in
1a120 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
1a130 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1a140 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69  Once we transiti
1a150 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55  on to.  ** EXCLU
1a160 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74  SIVE, it means t
1a170 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1a180 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65   has been change
1a190 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61  d and any rollba
1a1a0 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71  ck.  ** will req
1a1b0 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70  uire a journal p
1a1c0 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  layback..  */.  
1a1d0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
1a1e0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
1a1f0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
1a200 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1a210 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
1a220 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 4c  rn rc;.  }..  pL
1a230 69 73 74 20 3d 20 73 6f 72 74 5f 70 61 67 65 6c  ist = sort_pagel
1a240 69 73 74 28 70 4c 69 73 74 29 3b 0a 20 20 66 6f  ist(pList);.  fo
1a250 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
1a260 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1a270 61 73 73 65 72 74 28 20 70 2d 3e 64 69 72 74 79  assert( p->dirty
1a280 20 29 3b 0a 20 20 20 20 70 2d 3e 64 69 72 74 79   );.    p->dirty
1a290 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c   = 0;.  }.  whil
1a2a0 65 28 20 70 4c 69 73 74 20 29 7b 0a 0a 20 20 20  e( pList ){..   
1a2b0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
1a2c0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
1a2d0 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
1a2e0 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 66 28   now. */.    if(
1a2f0 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d   !pPager->fd->pM
1a300 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
1a310 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 74  assert(pPager->t
1a320 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  empFile);.      
1a330 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1a340 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
1a350 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  , pPager->fd, pP
1a360 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b  ager->vfsFlags);
1a370 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
1a380 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1a390 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
1a3a0 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65  e are dirty page
1a3b0 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
1a3c0 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75  che with page nu
1a3d0 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20  mbers greater.  
1a3e0 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
1a3f0 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61  dbSize, this mea
1a400 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  ns sqlite3PagerT
1a410 72 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61  runcate() was ca
1a420 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
1a430 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
1a440 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
1a450 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
1a460 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
1a470 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
1a480 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
1a490 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
1a4a0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
1a4b0 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o<=pPager->dbSiz
1a4c0 65 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f  e ){.      i64 o
1a4d0 66 66 73 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e  ffset = (pList->
1a4e0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
1a4f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1a500 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
1a510 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
1a520 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
1a530 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70  pList), pList->p
1a540 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 50  gno, 6);.      P
1a550 41 47 45 52 54 52 41 43 45 34 28 22 53 54 4f 52  AGERTRACE4("STOR
1a560 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  E %d page %d has
1a570 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
1a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1a590 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1a5a0 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67  pList->pgno, pag
1a5b0 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  er_pagehash(pLis
1a5c0 74 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  t));.      IOTRA
1a5d0 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64  CE(("PGOUT %p %d
1a5e0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69  \n", pPager, pLi
1a5f0 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  st->pgno));.    
1a600 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a610 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
1a620 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
1a630 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
1a640 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  t);.      PAGER_
1a650 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
1a660 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
1a670 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
1a680 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69  NCR(pPager->nWri
1a690 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  te);.      if( p
1a6a0 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b  List->pgno==1 ){
1a6b0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1a6c0 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
1a6d0 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c  ers, &pData[24],
1a6e0 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
1a6f0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
1a700 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e      }.    }.#ifn
1a710 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65  def NDEBUG.    e
1a720 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52  lse{.      PAGER
1a730 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20  TRACE3("NOSTORE 
1a740 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
1a750 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1a760 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
1a770 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
1a780 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1a790 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  c;.#ifdef SQLITE
1a7a0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
1a7b0 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68   pList->pageHash
1a7c0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
1a7d0 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66  h(pList);.#endif
1a7e0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69  .    pList = pLi
1a7f0 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a  st->pDirty;.  }.
1a800 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a810 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c  OK;.}../*.** Col
1a820 6c 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79  lect every dirty
1a830 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72   page into a dir
1a840 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72  ty list and.** r
1a850 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1a860 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74  to the head of t
1a870 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70  hat list.  All p
1a880 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c  ages are.** coll
1a890 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68  ected even if th
1a8a0 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  ey are still in 
1a8b0 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  use..*/.static P
1a8c0 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f  gHdr *pager_get_
1a8d0 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
1a8e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1a8f0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1a900 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20    /* Verify the 
1a910 73 61 6e 69 74 79 20 6f 66 20 74 68 65 20 64 69  sanity of the di
1a920 72 74 79 20 6c 69 73 74 20 77 68 65 6e 20 77 65  rty list when we
1a930 20 61 72 65 20 72 75 6e 6e 69 6e 67 0a 20 20 2a   are running.  *
1a940 2a 20 69 6e 20 64 65 62 75 67 67 69 6e 67 20 6d  * in debugging m
1a950 6f 64 65 2e 20 20 54 68 69 73 20 69 73 20 65 78  ode.  This is ex
1a960 70 65 6e 73 69 76 65 2c 20 73 6f 20 64 6f 20 6e  pensive, so do n
1a970 6f 74 0a 20 20 2a 2a 20 64 6f 20 74 68 69 73 20  ot.  ** do this 
1a980 6f 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c  on a normal buil
1a990 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 31 20 3d  d. */.  int n1 =
1a9a0 20 30 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 30   0;.  int n2 = 0
1a9b0 3b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20  ;.  PgHdr *p;.  
1a9c0 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41  for(p=pPager->pA
1a9d0 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  ll; p; p=p->pNex
1a9e0 74 41 6c 6c 29 7b 20 69 66 28 20 70 2d 3e 64 69  tAll){ if( p->di
1a9f0 72 74 79 20 29 20 6e 31 2b 2b 3b 20 7d 0a 20 20  rty ) n1++; }.  
1aa00 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 44  for(p=pPager->pD
1aa10 69 72 74 79 3b 20 70 3b 20 70 3d 70 2d 3e 70 44  irty; p; p=p->pD
1aa20 69 72 74 79 29 7b 20 6e 32 2b 2b 3b 20 7d 0a 20  irty){ n2++; }. 
1aa30 20 61 73 73 65 72 74 28 20 6e 31 3d 3d 6e 32 20   assert( n1==n2 
1aa40 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74  );.#endif..  ret
1aa50 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 44 69 72  urn pPager->pDir
1aa60 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ty;.}../*.** Ret
1aa70 75 72 6e 20 31 20 69 66 20 74 68 65 72 65 20 69  urn 1 if there i
1aa80 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
1aa90 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
1aaa0 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75  er..** A hot jou
1aab0 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74  rnal is one that
1aac0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
1aad0 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  yed back..**.** 
1aae0 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  If the current s
1aaf0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1ab00 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75  ase file is 0 bu
1ab10 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  t a journal file
1ab20 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74  .** exists, that
1ab30 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20   is probably an 
1ab40 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  old journal left
1ab50 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69   over from a pri
1ab60 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  or.** database w
1ab70 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
1ab80 65 2e 20 20 4a 75 73 74 20 64 65 6c 65 74 65 20  e.  Just delete 
1ab90 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
1aba0 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  ** Return negati
1abb0 76 65 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  ve if unable to 
1abc0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 74  determine the st
1abd0 61 74 75 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  atus of the jour
1abe0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nal..**.** This 
1abf0 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
1ac00 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   open the journa
1ac10 6c 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e  l file to examin
1ac20 65 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74  e its.** content
1ac30 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 6a 6f  .  Hence, the jo
1ac40 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
1ac50 61 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ain the name of 
1ac60 61 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  a master.** jour
1ac70 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 68 61  nal file that ha
1ac80 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20  s been deleted, 
1ac90 61 6e 64 20 68 65 6e 63 65 20 6e 6f 74 20 62 65  and hence not be
1aca0 20 68 6f 74 2e 20 20 4f 72 0a 2a 2a 20 74 68 65   hot.  Or.** the
1acb0 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a   header of the j
1acc0 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 62 65 20  ournal might be 
1acd0 7a 65 72 6f 65 64 20 6f 75 74 2e 20 20 54 68 69  zeroed out.  Thi
1ace0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65  s routine.** doe
1acf0 73 20 6e 6f 74 20 64 69 73 63 6f 76 65 72 20 74  s not discover t
1ad00 68 65 73 65 20 63 61 73 65 73 20 6f 66 20 61 20  hese cases of a 
1ad10 6e 6f 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  non-hot journal 
1ad20 2d 20 69 66 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  - if the.** jour
1ad30 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
1ad40 61 6e 64 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  and is not empty
1ad50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73   this routine as
1ad60 73 75 6d 65 73 20 69 74 0a 2a 2a 20 69 73 20 68  sumes it.** is h
1ad70 6f 74 2e 20 20 54 68 65 20 70 61 67 65 72 5f 70  ot.  The pager_p
1ad80 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  layback() routin
1ad90 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20  e will discover 
1ada0 74 68 61 74 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  that the.** jour
1adb0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
1adc0 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 77  really hot and w
1add0 69 6c 6c 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  ill no-op..*/.st
1ade0 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a  atic int hasHotJ
1adf0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
1ae00 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
1ae10 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
1ae20 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
1ae30 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20   res = 0;.  if( 
1ae40 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1ae50 61 6c 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64  al && pPager->fd
1ae60 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
1ae70 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e    int rc;.    in
1ae80 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20 69 6e  t exists;.    in
1ae90 74 20 6c 6f 63 6b 65 64 3b 0a 0a 20 20 20 20 72  t locked;..    r
1aea0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1aeb0 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
1aec0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
1aed0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1aee0 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20  , &exists);.    
1aef0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1af00 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20  K && exists ){. 
1af10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1af20 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
1af30 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
1af40 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 7d   &locked);.    }
1af50 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
1af60 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74  LITE_OK && exist
1af70 73 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  s && !locked ){.
1af80 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b        int nPage;
1af90 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1afa0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1afb0 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
1afc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1afd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50  =SQLITE_OK && nP
1afe0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
1aff0 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
1b000 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
1b010 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
1b020 20 20 20 20 20 20 65 78 69 73 74 73 20 3d 20 30        exists = 0
1b030 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b040 0a 20 20 20 20 72 65 73 20 3d 20 28 72 63 21 3d  .    res = (rc!=
1b050 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 2d 31 20 3a  SQLITE_OK ? -1 :
1b060 20 28 65 78 69 73 74 73 20 26 26 20 21 6c 6f 63   (exists && !loc
1b070 6b 65 64 29 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ked));.  }..  re
1b080 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
1b090 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61  ** Try to find a
1b0a0 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
1b0b0 68 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 72  he that can be r
1b0c0 65 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  ecycled. .**.** 
1b0d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
1b0e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1b0f0 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c  OERR, SQLITE_FUL
1b100 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  L or SQLITE_OK. 
1b110 49 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  It .** does not 
1b120 73 65 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e  set the pPager->
1b130 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
1b140 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b150 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61  pager_recycle(Pa
1b160 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
1b170 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 50 67  dr **ppPg){.  Pg
1b180 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70 70 50  Hdr *pPg;.  *ppP
1b190 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 74 20  g = 0;..  /* It 
1b1a0 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61  is illegal to ca
1b1b0 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
1b1c0 20 75 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   unless the page
1b1d0 72 20 6f 62 6a 65 63 74 0a 20 20 2a 2a 20 70 6f  r object.  ** po
1b1e0 69 6e 74 65 64 20 74 6f 20 62 79 20 70 50 61 67  inted to by pPag
1b1f0 65 72 20 68 61 73 20 61 74 20 6c 65 61 73 74 20  er has at least 
1b200 6f 6e 65 20 66 72 65 65 20 70 61 67 65 20 28 70  one free page (p
1b210 61 67 65 20 77 69 74 68 20 6e 52 65 66 3d 3d 30  age with nRef==0
1b220 29 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  )..  */ .  asser
1b230 74 28 21 4d 45 4d 44 42 29 3b 0a 20 20 61 73 73  t(!MEMDB);.  ass
1b240 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e  ert(pPager->lru.
1b250 70 46 69 72 73 74 29 3b 0a 0a 20 20 2f 2a 20 46  pFirst);..  /* F
1b260 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72 65  ind a page to re
1b270 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c  cycle.  Try to l
1b280 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68 61  ocate a page tha
1b290 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  t does not.  ** 
1b2a0 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f  require us to do
1b2b0 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74   an fsync() on t
1b2c0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  he journal..  */
1b2d0 0a 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d  .  pPg = pPager-
1b2e0 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65  >lru.pFirstSynce
1b2f0 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  d;..  /* If we c
1b300 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20  ould not find a 
1b310 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
1b320 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73  ot require an fs
1b330 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68  ync().  ** on th
1b340 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
1b350 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f  hen fsync the jo
1b360 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69  urnal file.  Thi
1b370 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65 72 79  s is a.  ** very
1b380 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c   slow operation,
1b390 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64   so we work hard
1b3a0 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42   to avoid it.  B
1b3b0 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a  ut sometimes.  *
1b3c0 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68 65  * it can't be he
1b3d0 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lped..  */.  if(
1b3e0 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61 67 65   pPg==0 && pPage
1b3f0 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 20 29 7b  r->lru.pFirst ){
1b400 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
1b410 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
1b420 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c     int iDc = sql
1b430 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
1b440 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
1b450 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69  er->fd);.      i
1b460 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  nt rc = syncJour
1b470 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1b480 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
1b490 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1b4a0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
1b4b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
1b4c0 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63  lSync && 0==(iDc
1b4d0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
1b4e0 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20  FE_APPEND) ){.  
1b4f0 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20 66        /* If in f
1b500 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77  ull-sync mode, w
1b510 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e  rite a new journ
1b520 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20 74  al header into t
1b530 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  he.        ** jo
1b540 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
1b550 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69   is done to avoi
1b560 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67  d ever modifying
1b570 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20   a journal.     
1b580 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61     ** header tha
1b590 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  t is involved in
1b5a0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66   the rollback of
1b5b0 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
1b5c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  .        ** alre
1b5d0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1b5e0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1b5f0 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68 65   (in case the he
1b600 61 64 65 72 20 69 73 0a 20 20 20 20 20 20 20 20  ader is.        
1b610 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20  ** trashed when 
1b620 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
1b630 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20  s updated)..    
1b640 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
1b650 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
1b660 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1b670 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b680 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20  Off > 0 );.     
1b690 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1b6a0 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20  r->doNotSync==0 
1b6b0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1b6c0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
1b6d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1b6e0 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1b6f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1b700 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1b710 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1b720 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72 75  Pg = pPager->lru
1b730 2e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 20 20  .pFirst;.  }..  
1b740 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
1b750 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72  f==0 );..  /* Wr
1b760 69 74 65 20 74 68 65 20 70 61 67 65 20 74 6f 20  ite the page to 
1b770 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b780 65 20 69 66 20 69 74 20 69 73 20 64 69 72 74 79  e if it is dirty
1b790 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
1b7a0 2d 3e 64 69 72 74 79 20 26 26 20 21 70 50 61 67  ->dirty && !pPag
1b7b0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
1b7c0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61     int rc;.    a
1b7d0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64  ssert( pPg->need
1b7e0 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d  Sync==0 );.    m
1b7f0 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
1b800 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
1b810 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72  1;.    pPg->pDir
1b820 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ty = 0;.    rc =
1b830 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
1b840 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20  elist( pPg );.  
1b850 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
1b860 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1b870 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b880 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b890 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
1b8a0 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 7c 7c  pPg->dirty==0 ||
1b8b0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1b8c0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1b8d0 20 70 61 67 65 20 77 65 20 61 72 65 20 72 65 63   page we are rec
1b8e0 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64  ycling is marked
1b8f0 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   as alwaysRollba
1b900 63 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65  ck, then.  ** se
1b910 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77  t the global alw
1b920 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67  aysRollback flag
1b930 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67  , thus disabling
1b940 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
1b950 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
1b960 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ck() optimizatio
1b970 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f  n for the rest o
1b980 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1b990 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e  on..  ** It is n
1b9a0 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74  ecessary to do t
1b9b0 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20  his because the 
1b9c0 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61  page marked alwa
1b9d0 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  ysRollback.  ** 
1b9e0 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65  might be reloade
1b9f0 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d  d at a later tim
1ba00 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70 6f  e but at that po
1ba10 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d  int we won't rem
1ba20 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74 20  ember.  ** that 
1ba30 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c  is was marked al
1ba40 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54  waysRollback.  T
1ba50 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61  his means that a
1ba60 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20  ll pages must.  
1ba70 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ** be marked as 
1ba80 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
1ba90 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e  rom here on out.
1baa0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
1bab0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1bac0 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
1bad0 22 41 4c 57 41 59 53 5f 52 4f 4c 4c 42 41 43 4b  "ALWAYS_ROLLBACK
1bae0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
1baf0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77  .    pPager->alw
1bb00 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  aysRollback = 1;
1bb10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  .  }..  /* Unlin
1bb20 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66  k the old page f
1bb30 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73  rom the free lis
1bb40 74 20 61 6e 64 20 74 68 65 20 68 61 73 68 20 74  t and the hash t
1bb50 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69  able.  */.  unli
1bb60 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 61  nkPage(pPg);.  a
1bb70 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
1bb80 3d 3d 30 20 29 3b 0a 0a 20 20 2a 70 70 50 67 20  ==0 );..  *ppPg 
1bb90 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20  = pPg;.  return 
1bba0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1bbb0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1bbc0 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
1bbd0 4d 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  MENT./*.** This 
1bbe0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1bbf0 65 64 20 74 6f 20 66 72 65 65 20 73 75 70 65 72  ed to free super
1bc00 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c  fluous dynamical
1bc10 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d  ly allocated mem
1bc20 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74  ory.** held by t
1bc30 68 65 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e  he pager system.
1bc40 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   Memory in use b
1bc50 79 20 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67  y any SQLite pag
1bc60 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  er allocated.** 
1bc70 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  by the current t
1bc80 68 72 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c  hread may be sql
1bc90 69 74 65 33 5f 66 72 65 65 28 29 65 64 2e 0a 2a  ite3_free()ed..*
1bca0 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74 68 65  *.** nReq is the
1bcb0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1bcc0 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71 75 69   of memory requi
1bcd0 72 65 64 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d  red. Once this m
1bce0 75 63 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  uch has.** been 
1bcf0 72 65 6c 65 61 73 65 64 2c 20 74 68 65 20 66 75  released, the fu
1bd00 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20  nction returns. 
1bd10 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
1bd20 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
1bd30 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65  mber .** of byte
1bd40 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65  s of memory rele
1bd50 61 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ased..*/.int sql
1bd60 69 74 65 33 50 61 67 65 72 52 65 6c 65 61 73 65  ite3PagerRelease
1bd70 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71 29  Memory(int nReq)
1bd80 7b 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65  {.  int nRelease
1bd90 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
1bda0 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f  /* Bytes of memo
1bdb0 72 79 20 72 65 6c 65 61 73 65 64 20 73 6f 20 66  ry released so f
1bdc0 61 72 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70  ar */.  Pager *p
1bdd0 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20  Pager;          
1bde0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1bdf0 6e 67 20 6f 76 65 72 20 70 61 67 65 72 73 20 2a  ng over pagers *
1be00 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20  /.  BusyHandler 
1be10 2a 73 61 76 65 64 42 75 73 79 3b 20 20 20 20 20  *savedBusy;     
1be20 2f 2a 20 53 61 76 65 64 20 63 6f 70 79 20 6f 66  /* Saved copy of
1be30 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1be40 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
1be50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
1be60 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 65 6d   Acquire the mem
1be70 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 6d  ory-management m
1be80 75 74 65 78 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  utex.  */.#ifnde
1be90 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e  f SQLITE_MUTEX_N
1bea0 4f 4f 50 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  OOP.  sqlite3_mu
1beb0 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20  tex *mutex;     
1bec0 20 20 2f 2a 20 54 68 65 20 4d 45 4d 32 20 6d 75    /* The MEM2 mu
1bed0 74 65 78 20 2a 2f 0a 20 20 6d 75 74 65 78 20 3d  tex */.  mutex =
1bee0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
1bef0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
1bf00 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 23 65  STATIC_MEM2);.#e
1bf10 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
1bf20 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
1bf30 29 3b 0a 0a 20 20 2f 2a 20 53 69 67 6e 61 6c 20  );..  /* Signal 
1bf40 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e  all database con
1bf50 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 6d 65  nections that me
1bf60 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20  mory management 
1bf70 77 61 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 68 61  wants.  ** to ha
1bf80 76 65 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  ve access to the
1bf90 20 70 61 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20   pagers..  */.  
1bfa0 66 6f 72 28 70 50 61 67 65 72 3d 73 71 6c 69 74  for(pPager=sqlit
1bfb0 65 33 50 61 67 65 72 4c 69 73 74 3b 20 70 50 61  e3PagerList; pPa
1bfc0 67 65 72 3b 20 70 50 61 67 65 72 3d 70 50 61 67  ger; pPager=pPag
1bfd0 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
1bfe0 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d   pPager->iInUseM
1bff0 4d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 77 68  M = 1;.  }..  wh
1c000 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1c010 4f 4b 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c  OK && (nReq<0 ||
1c020 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29   nReleased<nReq)
1c030 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1c040 50 67 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70  Pg;.    PgHdr *p
1c050 52 65 63 79 63 6c 65 64 3b 0a 20 0a 20 20 20 20  Recycled;. .    
1c060 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61  /* Try to find a
1c070 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65   page to recycle
1c080 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
1c090 65 71 75 69 72 65 20 61 20 73 79 6e 63 28 29 2e  equire a sync().
1c0a0 20 49 66 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   If.    ** this 
1c0b0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c  is not possible,
1c0c0 20 66 69 6e 64 20 6f 6e 65 20 74 68 61 74 20 64   find one that d
1c0d0 6f 65 73 20 72 65 71 75 69 72 65 20 61 20 73 79  oes require a sy
1c0e0 6e 63 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nc()..    */.   
1c0f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1c100 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65  nter(sqlite3Mute
1c110 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
1c120 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29  TEX_STATIC_LRU))
1c130 3b 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69  ;.    pPg = sqli
1c140 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70  te3LruPageList.p
1c150 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 20 20 20  FirstSynced;.   
1c160 20 77 68 69 6c 65 28 20 70 50 67 20 26 26 20 28   while( pPg && (
1c170 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c  pPg->needSync ||
1c180 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 69 49   pPg->pPager->iI
1c190 6e 55 73 65 44 42 29 20 29 7b 0a 20 20 20 20 20  nUseDB) ){.     
1c1a0 20 70 50 67 20 3d 20 70 50 67 2d 3e 67 66 72 65   pPg = pPg->gfre
1c1b0 65 2e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  e.pNext;.    }. 
1c1c0 20 20 20 69 66 28 20 21 70 50 67 20 29 7b 0a 20     if( !pPg ){. 
1c1d0 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74       pPg = sqlit
1c1e0 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46  e3LruPageList.pF
1c1f0 69 72 73 74 3b 0a 20 20 20 20 20 20 77 68 69 6c  irst;.      whil
1c200 65 28 20 70 50 67 20 26 26 20 70 50 67 2d 3e 70  e( pPg && pPg->p
1c210 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 44 42 20  Pager->iInUseDB 
1c220 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d  ){.        pPg =
1c230 20 70 50 67 2d 3e 67 66 72 65 65 2e 70 4e 65 78   pPg->gfree.pNex
1c240 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1c250 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
1c260 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
1c270 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
1c280 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c  E_MUTEX_STATIC_L
1c290 52 55 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  RU));..    /* If
1c2a0 20 70 50 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68   pPg==0, then th
1c2b0 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 20 68 61  e block above ha
1c2c0 73 20 66 61 69 6c 65 64 20 74 6f 20 66 69 6e 64  s failed to find
1c2d0 20 61 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a   a page to.    *
1c2e0 2a 20 72 65 63 79 63 6c 65 2e 20 49 6e 20 74 68  * recycle. In th
1c2f0 69 73 20 63 61 73 65 20 72 65 74 75 72 6e 20 65  is case return e
1c300 61 72 6c 79 20 2d 20 6e 6f 20 66 75 72 74 68 65  arly - no furthe
1c310 72 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 0a 20 20  r memory will.  
1c320 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64    ** be released
1c330 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1c340 20 21 70 50 67 20 29 20 62 72 65 61 6b 3b 0a 0a   !pPg ) break;..
1c350 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67      pPager = pPg
1c360 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 61 73  ->pPager;.    as
1c370 73 65 72 74 28 21 70 50 67 2d 3e 6e 65 65 64 53  sert(!pPg->needS
1c380 79 6e 63 20 7c 7c 20 70 50 67 3d 3d 70 50 61 67  ync || pPg==pPag
1c390 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29 3b  er->lru.pFirst);
1c3a0 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 67 2d  .    assert(pPg-
1c3b0 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70 50 67  >needSync || pPg
1c3c0 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  ==pPager->lru.pF
1c3d0 69 72 73 74 53 79 6e 63 65 64 29 3b 0a 20 20 0a  irstSynced);.  .
1c3e0 20 20 20 20 73 61 76 65 64 42 75 73 79 20 3d 20      savedBusy = 
1c3f0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
1c400 64 6c 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72  dler;.    pPager
1c410 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
1c420 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   0;.    rc = pag
1c430 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65  er_recycle(pPage
1c440 72 2c 20 26 70 52 65 63 79 63 6c 65 64 29 3b 0a  r, &pRecycled);.
1c450 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73      pPager->pBus
1c460 79 48 61 6e 64 6c 65 72 20 3d 20 73 61 76 65 64  yHandler = saved
1c470 42 75 73 79 3b 0a 20 20 20 20 61 73 73 65 72 74  Busy;.    assert
1c480 28 70 52 65 63 79 63 6c 65 64 3d 3d 70 50 67 20  (pRecycled==pPg 
1c490 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
1c4a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1c4b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c4c0 20 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e 64    /* We've found
1c4d0 20 61 20 70 61 67 65 20 74 6f 20 66 72 65 65 2e   a page to free.
1c4e0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
1c4f0 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
1c500 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76   .      ** remov
1c510 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
1c520 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65   hash-table, fre
1c530 65 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65  e-list and synce
1c540 64 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 2a 2a  d-list .      **
1c550 20 28 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e   (pFirstSynced).
1c560 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20   It is still in 
1c570 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70  the all pages (p
1c580 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20  All) list. .    
1c590 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20 66    ** Remove it f
1c5a0 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 62 65  rom this list be
1c5b0 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a 20 20  fore freeing..  
1c5c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1c5d0 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65 20  Todo: Check the 
1c5e0 50 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73 74  Pager.pStmt list
1c5f0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
1c600 69 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20  is is Ok. It .  
1c610 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
1c620 69 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20 20  is though..     
1c630 20 2a 2f 0a 20 20 20 20 20 20 50 67 48 64 72 20   */.      PgHdr 
1c640 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 61 73 73  *pTmp;.      ass
1c650 65 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20  ert( pPg );.    
1c660 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65    if( pPg==pPage
1c670 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20  r->pAll ){.     
1c680 20 20 20 20 61 73 73 65 72 74 28 70 50 67 2d 3e      assert(pPg->
1c690 70 50 72 65 76 41 6c 6c 3d 3d 30 29 3b 0a 20 20  pPrevAll==0);.  
1c6a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50         assert(pP
1c6b0 67 2d 3e 70 4e 65 78 74 41 6c 6c 3d 3d 30 20 7c  g->pNextAll==0 |
1c6c0 7c 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 2d  | pPg->pNextAll-
1c6d0 3e 70 50 72 65 76 41 6c 6c 3d 3d 70 50 67 29 3b  >pPrevAll==pPg);
1c6e0 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72  .         pPager
1c6f0 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e  ->pAll = pPg->pN
1c700 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20  extAll;.        
1c710 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c   if( pPager->pAl
1c720 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
1c730 70 50 61 67 65 72 2d 3e 70 41 6c 6c 2d 3e 70 50  pPager->pAll->pP
1c740 72 65 76 41 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  revAll = 0;.    
1c750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1c760 73 65 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73  se{.         ass
1c770 65 72 74 28 70 50 67 2d 3e 70 50 72 65 76 41 6c  ert(pPg->pPrevAl
1c780 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 61 73 73  l);.         ass
1c790 65 72 74 28 70 50 67 2d 3e 70 50 72 65 76 41 6c  ert(pPg->pPrevAl
1c7a0 6c 2d 3e 70 4e 65 78 74 41 6c 6c 3d 3d 70 50 67  l->pNextAll==pPg
1c7b0 29 3b 0a 20 20 20 20 20 20 20 20 20 70 54 6d 70  );.         pTmp
1c7c0 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 41 6c 6c   = pPg->pPrevAll
1c7d0 3b 0a 20 20 20 20 20 20 20 20 20 70 54 6d 70 2d  ;.         pTmp-
1c7e0 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 67 2d  >pNextAll = pPg-
1c7f0 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20  >pNextAll;.     
1c800 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 4e      if( pTmp->pN
1c810 65 78 74 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20  extAll ){.      
1c820 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74       pTmp->pNext
1c830 41 6c 6c 2d 3e 70 50 72 65 76 41 6c 6c 20 3d 20  All->pPrevAll = 
1c840 70 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 20 7d  pTmp;.         }
1c850 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
1c860 52 65 6c 65 61 73 65 64 20 2b 3d 20 28 0a 20 20  Released += (.  
1c870 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
1c880 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70  pPg) + pPager->p
1c890 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20  ageSize.        
1c8a0 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20    + sizeof(u32) 
1c8b0 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  + pPager->nExtra
1c8c0 0a 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d  .          + MEM
1c8d0 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74  DB*sizeof(PgHist
1c8e0 6f 72 79 29 20 0a 20 20 20 20 20 20 29 3b 0a 20  ory) .      );. 
1c8f0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
1c900 47 46 52 45 45 20 25 70 20 25 64 20 2a 5c 6e 22  GFREE %p %d *\n"
1c910 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
1c920 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47  gno));.      PAG
1c930 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
1c940 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75  pager_pgfree_cou
1c950 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
1c960 65 33 50 61 67 65 46 72 65 65 28 70 50 67 2d 3e  e3PageFree(pPg->
1c970 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71  pData);.      sq
1c980 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b  lite3_free(pPg);
1c990 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
1c9a0 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73  Page--;.    }els
1c9b0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  e{.      /* An e
1c9c0 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69  rror occured whi
1c9d0 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
1c9e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c9f0 20 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f   or .      ** jo
1ca00 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f 72  urnal in pager_r
1ca10 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20 65 72  ecycle(). The er
1ca20 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74 75 72  ror is not retur
1ca30 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20 20  ned to the .    
1ca40 20 20 2a 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74    ** caller of t
1ca50 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e  his function. In
1ca60 73 74 65 61 64 2c 20 73 65 74 20 74 68 65 20 50  stead, set the P
1ca70 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72  ager.errCode var
1ca80 69 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20  iable..      ** 
1ca90 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  The error will b
1caa0 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  e returned to th
1cab0 65 20 75 73 65 72 20 28 6f 72 20 75 73 65 72 73  e user (or users
1cac0 2c 20 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20  , in the case . 
1cad0 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61       ** of a sha
1cae0 72 65 64 20 70 61 67 65 72 20 63 61 63 68 65 29  red pager cache)
1caf0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 6f   of the pager fo
1cb00 72 20 77 68 69 63 68 20 74 68 65 20 65 72 72 6f  r which the erro
1cb10 72 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20  r occured..     
1cb20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1cb30 28 0a 20 20 20 20 20 20 20 20 20 20 28 72 63 26  (.          (rc&
1cb40 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
1cb50 45 52 52 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ERR ||.         
1cb60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c   rc==SQLITE_FULL
1cb70 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 72 63   ||.          rc
1cb80 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 0a 20 20  ==SQLITE_BUSY.  
1cb90 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
1cba0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1cbb0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
1cbc0 45 44 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65  ED );.      page
1cbd0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
1cbe0 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
1cbf0 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 6d    /* Clear the m
1cc00 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74  emory management
1cc10 20 66 6c 61 67 73 20 61 6e 64 20 72 65 6c 65 61   flags and relea
1cc20 73 65 20 74 68 65 20 6d 75 74 65 78 0a 20 20 2a  se the mutex.  *
1cc30 2f 0a 20 20 66 6f 72 28 70 50 61 67 65 72 3d 73  /.  for(pPager=s
1cc40 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b  qlite3PagerList;
1cc50 20 70 50 61 67 65 72 3b 20 70 50 61 67 65 72 3d   pPager; pPager=
1cc60 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  pPager->pNext){.
1cc70 20 20 20 20 20 70 50 61 67 65 72 2d 3e 69 49 6e       pPager->iIn
1cc80 55 73 65 4d 4d 20 3d 20 30 3b 0a 20 20 7d 0a 20  UseMM = 0;.  }. 
1cc90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1cca0 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 0a 20 20  eave(mutex);..  
1ccb0 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  /* Return the nu
1ccc0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
1ccd0 6c 65 61 73 65 64 0a 20 20 2a 2f 0a 20 20 72 65  leased.  */.  re
1cce0 74 75 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a  turn nReleased;.
1ccf0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1cd00 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
1cd10 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a 0a  _MANAGEMENT */..
1cd20 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63  /*.** Read the c
1cd30 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 70  ontent of page p
1cd40 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61  Pg out of the da
1cd50 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
1cd60 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44  static int readD
1cd70 62 50 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  bPage(Pager *pPa
1cd80 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 2c  ger, PgHdr *pPg,
1cd90 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
1cda0 6e 74 20 72 63 3b 0a 20 20 69 36 34 20 6f 66 66  nt rc;.  i64 off
1cdb0 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  set;.  assert( M
1cdc0 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 61 73 73  EMDB==0 );.  ass
1cdd0 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e  ert(pPager->fd->
1cde0 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72  pMethods||pPager
1cdf0 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69  ->tempFile);.  i
1ce00 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e  f( !pPager->fd->
1ce10 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
1ce20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1ce30 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a  ERR_SHORT_READ;.
1ce40 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 28    }.  offset = (
1ce50 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
1ce60 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1ce70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
1ce80 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
1ce90 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1cea0 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
1ceb0 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20  Size, offset);. 
1cec0 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
1ced0 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
1cee0 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52  _count);.  PAGER
1cef0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
1cf00 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ead);.  IOTRACE(
1cf10 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c  ("PGIN %p %d\n",
1cf20 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
1cf30 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29  .  if( pgno==1 )
1cf40 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  {.    memcpy(&pP
1cf50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1cf60 2c 20 26 28 28 75 38 2a 29 50 47 48 44 52 5f 54  , &((u8*)PGHDR_T
1cf70 4f 5f 44 41 54 41 28 70 50 67 29 29 5b 32 34 5d  O_DATA(pPg))[24]
1cf80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfb0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1cfc0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d  bFileVers));.  }
1cfd0 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
1cfe0 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
1cff0 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  pPg), pPg->pgno,
1d000 20 33 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43   3);.  PAGERTRAC
1d010 45 34 28 22 46 45 54 43 48 20 25 64 20 70 61 67  E4("FETCH %d pag
1d020 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
1d030 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1d040 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1d050 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
1d060 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
1d070 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  g));.  return rc
1d080 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
1d090 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1d0a0 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  led to obtain th
1d0b0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65  e shared lock re
1d0c0 71 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a  quired before.**
1d0d0 20 64 61 74 61 20 6d 61 79 20 62 65 20 72 65 61   data may be rea
1d0e0 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  d from the pager
1d0f0 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 73   cache. If the s
1d100 68 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61  hared lock has a
1d110 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f  lready.** been o
1d120 62 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75  btained, this fu
1d130 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
1d140 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61  p..**.** Immedia
1d150 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69  tely after obtai
1d160 6e 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ning the shared 
1d170 6c 6f 63 6b 20 28 69 66 20 72 65 71 75 69 72 65  lock (if require
1d180 64 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  d), this functio
1d190 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72 20  n.** checks for 
1d1a0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
1d1b0 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f  le. If one is fo
1d1c0 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63  und, an emergenc
1d1d0 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73  y rollback.** is
1d1e0 20 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64   performed immed
1d1f0 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  iately..*/.stati
1d200 63 20 69 6e 74 20 70 61 67 65 72 53 68 61 72 65  c int pagerShare
1d210 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  dLock(Pager *pPa
1d220 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
1d230 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
1d240 74 20 69 73 48 6f 74 20 3d 20 30 3b 0a 0a 20 20  t isHot = 0;..  
1d250 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62  /* If this datab
1d260 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 66 6f  ase is opened fo
1d270 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  r exclusive acce
1d280 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74 73 74  ss, has no outst
1d290 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70 61 67  anding .  ** pag
1d2a0 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  e references and
1d2b0 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d   is in an error-
1d2c0 73 74 61 74 65 2c 20 6e 6f 77 20 69 73 20 74 68  state, now is th
1d2d0 65 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61  e chance to clea
1d2e0 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72  r.  ** the error
1d2f0 2e 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f  . Discard the co
1d300 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
1d310 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 74 72  ger-cache and tr
1d320 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f 70 65  eat any.  ** ope
1d330 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  n journal file a
1d340 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2e  s a hot-journal.
1d350 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d  .  */.  if( !MEM
1d360 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78  DB && pPager->ex
1d370 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
1d380 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26  Pager->nRef==0 &
1d390 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
1d3a0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  e ){.    if( pPa
1d3b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1d3c0 20 29 7b 0a 20 20 20 20 20 20 69 73 48 6f 74 20   ){.      isHot 
1d3d0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
1d3e0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
1d3f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1d400 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
1d410 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
1d420 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 73  f the pager is s
1d430 74 69 6c 6c 20 69 6e 20 61 6e 20 65 72 72 6f 72  till in an error
1d440 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 70   state, do not p
1d450 72 6f 63 65 65 64 2e 20 54 68 65 20 65 72 72 6f  roceed. The erro
1d460 72 20 0a 20 20 2a 2a 20 73 74 61 74 65 20 77 69  r .  ** state wi
1d470 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 61 74  ll be cleared at
1d480 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
1d490 68 65 20 66 75 74 75 72 65 20 77 68 65 6e 20 61  he future when a
1d4a0 6c 6c 20 70 61 67 65 20 0a 20 20 2a 2a 20 72 65  ll page .  ** re
1d4b0 66 65 72 65 6e 63 65 73 20 61 72 65 20 64 72 6f  ferences are dro
1d4c0 70 70 65 64 20 61 6e 64 20 74 68 65 20 63 61 63  pped and the cac
1d4d0 68 65 20 63 61 6e 20 62 65 20 64 69 73 63 61 72  he can be discar
1d4e0 64 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ded..  */.  if( 
1d4f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1d500 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
1d510 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
1d520 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
1d530 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1d540 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
1d550 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
1d560 4e 4c 4f 43 4b 20 7c 7c 20 69 73 48 6f 74 20 29  NLOCK || isHot )
1d570 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
1d580 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
1d590 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 66 28 20  ->pVfs;.    if( 
1d5a0 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
1d5b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d5c0 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20  nRef==0 );.     
1d5d0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
1d5e0 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  Readlock ){.    
1d5f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1d600 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
1d610 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
1d620 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1d630 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d640 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1d650 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1d660 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
1d670 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1d680 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
1d690 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
1d6a0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
1d6b0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1d6c0 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
1d6d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  ;.      }.  .   
1d6e0 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
1d6f0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
1d700 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
1d710 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
1d720 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
1d730 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
1d740 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64  n it either need
1d750 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
1d760 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a  ack or deleted..
1d770 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
1d780 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  c = hasHotJourna
1d790 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
1d7a0 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20   if( rc<0 ){.   
1d7b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1d7c0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1d7d0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
1d7e0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
1d7f0 20 69 66 28 20 72 63 3d 3d 31 20 7c 7c 20 69 73   if( rc==1 || is
1d800 48 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Hot ){.        /
1d810 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49  * Get an EXCLUSI
1d820 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
1d830 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74  atabase file. At
1d840 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69   this point it i
1d850 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6d 70  s.        ** imp
1d860 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45  ortant that a RE
1d870 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
1d880 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  ot obtained on t
1d890 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20  he way to the.  
1d8a0 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
1d8b0 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
1d8c0 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
1d8d0 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
1d8e0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  the.        ** d
1d8f0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65  atabase file, de
1d900 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45  tect the RESERVE
1d910 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63  D lock, and conc
1d920 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20  lude that the.  
1d930 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
1d940 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61  e is safe to rea
1d950 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  d while this pro
1d960 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f  cess is still ro
1d970 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20  lling it .      
1d980 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20    ** back..     
1d990 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a     ** .        *
1d9a0 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
1d9b0 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
1d9c0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
1d9d0 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20  requested, the. 
1d9e0 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64         ** second
1d9f0 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65   process will ge
1da00 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20  t to this point 
1da10 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
1da20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 20  fail to.        
1da30 2a 2a 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77  ** obtain its ow
1da40 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1da50 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1da60 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
1da70 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
1da80 61 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c  ager->state<EXCL
1da90 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
1daa0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1dab0 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
1dac0 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45  r->fd, EXCLUSIVE
1dad0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
1dae0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1daf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1db00 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
1db10 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1db20 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
1db30 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
1db40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1db50 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1db60 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
1db70 0a 20 20 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  .        }. .   
1db80 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
1db90 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61   journal for rea
1dba0 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20  d/write access. 
1dbb0 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
1dbc0 69 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  in .        ** e
1dbd0 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
1dbe0 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65  mode the file de
1dbf0 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65  scriptor will be
1dc00 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20   kept open and. 
1dc10 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62         ** possib
1dc20 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72  ly used for a tr
1dc30 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20  ansaction later 
1dc40 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74  on. On some syst
1dc50 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20 20 20  ems, the.       
1dc60 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29   ** OsTruncate()
1dc70 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78   call used in ex
1dc80 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
1dc90 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65  ode also require
1dca0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72  s.        ** a r
1dcb0 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68  ead/write file h
1dcc0 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a  andle..        *
1dcd0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69  /.        if( !i
1dce0 73 48 6f 74 20 26 26 20 70 50 61 67 65 72 2d 3e  sHot && pPager->
1dcf0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
1dd00 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1dd10 72 65 73 3b 0a 20 20 20 20 20 20 20 20 20 20 72  res;.          r
1dd20 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1dd30 65 73 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d  ess(pVfs,pPager-
1dd40 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45  >zJournal,SQLITE
1dd50 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26  _ACCESS_EXISTS,&
1dd60 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  res);.          
1dd70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1dd80 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1dd90 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
1dda0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f            int fo
1ddb0 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
1ddc0 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
1ddd0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1dde0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
1ddf0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
1de00 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1de10 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
1de20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  pFile );.       
1de30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1de40 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
1de50 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1de60 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
1de70 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
1de80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1de90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1dea0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d   pPager->jfd->pM
1deb0 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 20 20  ethods );.      
1dec0 20 20 20 20 20 20 20 20 69 66 28 20 66 6f 75 74          if( fout
1ded0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
1dee0 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  DONLY ){.       
1def0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1df00 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1df10 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1df20 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
1df30 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
1df40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1df50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1df60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1df70 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  he journal does 
1df80 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 61 74 20  not exist, that 
1df90 6d 65 61 6e 73 20 73 6f 6d 65 20 6f 74 68 65 72  means some other
1dfa0 20 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20 20   process.       
1dfb0 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 6c         ** has al
1dfc0 72 65 61 64 79 20 72 6f 6c 6c 65 64 20 69 74 20  ready rolled it 
1dfd0 62 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  back */.        
1dfe0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1dff0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
1e000 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1e010 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1e020 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e030 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e040 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e050 45 5f 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53  E_NOMEM && rc!=S
1e060 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
1e070 43 4b 20 0a 20 20 20 20 20 20 20 20 20 20 20 26  CK .           &
1e080 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
1e090 52 52 5f 4e 4f 4d 45 4d 20 0a 20 20 20 20 20 20  RR_NOMEM .      
1e0a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
1e0b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
1e0c0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  USY;.          }
1e0d0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1e0e0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
1e0f0 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
1e100 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
1e110 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  1;.        pPage
1e120 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
1e130 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  d = 0;.        p
1e140 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1e150 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  f = 0;.        p
1e160 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
1e170 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
1e180 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1e190 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 20 20   = 0;. .        
1e1a0 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20  /* Playback and 
1e1b0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
1e1c0 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61  al.  Drop the da
1e1d0 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20  tabase write.   
1e1e0 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
1e1f0 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
1e200 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  ead lock..      
1e210 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
1e220 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
1e230 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
1e240 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1e250 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e260 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
1e270 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
1e280 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
1e290 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
1e2a0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
1e2b0 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  t(pPager->state=
1e2c0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
1e2d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
1e2e0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
1e2f0 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
1e300 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52  state>PAGER_SHAR
1e310 45 44 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ED).        );. 
1e320 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
1e330 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29  ( pPager->pAll )
1e340 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
1e350 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73   shared-lock has
1e360 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69   just been acqui
1e370 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  red on the datab
1e380 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 20  ase file.       
1e390 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72   ** and there ar
1e3a0 65 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20  e already pages 
1e3b0 69 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72  in the cache (fr
1e3c0 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  om a previous.  
1e3d0 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72        ** read or
1e3e0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1e3f0 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  on).  Check to s
1e400 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
1e410 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61  se.        ** ha
1e420 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  s been modified.
1e430 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
1e440 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66  e has changed, f
1e450 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 20  lush the.       
1e460 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20   ** cache..     
1e470 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1e480 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   Database change
1e490 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79  s is detected by
1e4a0 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62   looking at 15 b
1e4b0 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20  ytes beginning. 
1e4c0 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66         ** at off
1e4d0 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20  set 24 into the 
1e4e0 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74  file.  The first
1e4f0 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62   4 of these 16 b
1e500 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 20  ytes are.       
1e510 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75   ** a 32-bit cou
1e520 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63  nter that is inc
1e530 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61  remented with ea
1e540 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a  ch change.  The.
1e550 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72          ** other
1e560 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61   bytes change ra
1e570 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68  ndomly with each
1e580 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65   file change whe
1e590 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63  n.        ** a c
1e5a0 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a  odec is in use..
1e5b0 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20          ** .    
1e5c0 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
1e5d0 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
1e5e0 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
1e5f0 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
1e600 74 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  t be .        **
1e610 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20   detected.  The 
1e620 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64  chance of an und
1e630 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69  etected change i
1e640 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a  s so small that.
1e650 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
1e660 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a  n be neglected..
1e670 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1e680 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65     char dbFileVe
1e690 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72  rs[sizeof(pPager
1e6a0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a  ->dbFileVers)];.
1e6b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1e6c0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1e6d0 61 67 65 72 2c 20 30 29 3b 0a 0a 20 20 20 20 20  ager, 0);..     
1e6e0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
1e6f0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
1e700 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
1e710 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20  >errCode;.      
1e720 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
1e730 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1e740 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1e750 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  dbSize>0 ){.    
1e760 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1e770 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c  CKVERS %p %d\n",
1e780 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28   pPager, sizeof(
1e790 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20  dbFileVers)));. 
1e7a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1e7b0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
1e7c0 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56  er->fd, &dbFileV
1e7d0 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
1e7e0 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20  leVers), 24);.  
1e7f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1e800 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e810 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
1e820 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20  iled;.          
1e830 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
1e840 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65  .          memse
1e850 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c  t(dbFileVers, 0,
1e860 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
1e870 72 73 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rs));.        }.
1e880 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d  .        if( mem
1e890 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69  cmp(pPager->dbFi
1e8a0 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
1e8b0 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
1e8c0 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20  eVers))!=0 ){.  
1e8d0 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
1e8e0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
1e8f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1e900 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1e910 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
1e920 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
1e930 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45 52 5f 53  ->state<=PAGER_S
1e940 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28  HARED );.    if(
1e950 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1e960 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
1e970 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
1e980 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
1e990 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ED;.    }.  }.. 
1e9a0 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63  failed:.  if( rc
1e9b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1e9c0 20 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f     /* pager_unlo
1e9d0 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
1e9e0 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 6d 6f  for exclusive mo
1e9f0 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79  de and in-memory
1ea00 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20   databases. */. 
1ea10 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
1ea20 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
1ea30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ea40 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 50 67  ** Allocate a Pg
1ea50 48 64 72 20 6f 62 6a 65 63 74 2e 20 20 20 45 69  Hdr object.   Ei
1ea60 74 68 65 72 20 63 72 65 61 74 65 20 61 20 6e 65  ther create a ne
1ea70 77 20 6f 6e 65 20 6f 72 20 72 65 75 73 65 0a 2a  w one or reuse.*
1ea80 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e  * an existing on
1ea90 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6f 74  e that is not ot
1eaa0 68 65 72 77 69 73 65 20 69 6e 20 75 73 65 2e 0a  herwise in use..
1eab0 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 50 67 48 64  **.** A new PgHd
1eac0 72 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  r structure is c
1ead0 72 65 61 74 65 64 20 69 66 20 61 6e 79 20 6f 66  reated if any of
1eae0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1eaf0 72 65 0a 2a 2a 20 74 72 75 65 3a 0a 2a 2a 0a 2a  re.** true:.**.*
1eb00 2a 20 20 20 20 20 28 31 29 20 20 57 65 20 68 61  *     (1)  We ha
1eb10 76 65 20 6e 6f 74 20 65 78 63 65 65 64 65 64 20  ve not exceeded 
1eb20 6f 75 72 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  our maximum allo
1eb30 63 61 74 65 64 20 63 61 63 68 65 20 73 69 7a 65  cated cache size
1eb40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 73 20  .**          as 
1eb50 73 65 74 20 62 79 20 74 68 65 20 22 50 52 41 47  set by the "PRAG
1eb60 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 22 20 63  MA cache_size" c
1eb70 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  ommand..**.**   
1eb80 20 20 28 32 29 20 20 54 68 65 72 65 20 61 72 65    (2)  There are
1eb90 20 6e 6f 20 75 6e 75 73 65 64 20 50 67 48 64 72   no unused PgHdr
1eba0 20 6f 62 6a 65 63 74 73 20 61 76 61 69 6c 61 62   objects availab
1ebb0 6c 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  le at this time.
1ebc0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20 20  .**.**     (3)  
1ebd0 54 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  This is an in-me
1ebe0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
1ebf0 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 54 68  *.**     (4)  Th
1ec00 65 72 65 20 61 72 65 20 6e 6f 20 50 67 48 64 72  ere are no PgHdr
1ec10 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 64 6f   objects that do
1ec20 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 20 6a   not require a j
1ec30 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
1ec40 20 20 20 66 69 6c 65 20 73 79 6e 63 20 61 6e 64     file sync and
1ec50 20 61 20 73 79 6e 63 20 6f 66 20 74 68 65 20 6a   a sync of the j
1ec60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
1ec70 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20  urrently.**     
1ec80 20 20 20 20 20 70 72 6f 68 69 62 69 74 65 64 2e       prohibited.
1ec90 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1eca0 2c 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74  , reuse an exist
1ecb0 69 6e 67 20 50 67 48 64 72 2e 20 20 49 6e 20 6f  ing PgHdr.  In o
1ecc0 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 75 73  ther words, reus
1ecd0 65 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67  e an.** existing
1ece0 20 50 67 48 64 72 20 69 66 20 61 6c 6c 20 6f 66   PgHdr if all of
1ecf0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1ed00 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
1ed10 20 20 20 28 31 29 20 20 57 65 20 68 61 76 65 20     (1)  We have 
1ed20 72 65 61 63 68 65 64 20 6f 72 20 65 78 63 65 65  reached or excee
1ed30 64 65 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ded the maximum 
1ed40 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20  cache size.**   
1ed50 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 20 62         allowed b
1ed60 79 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f  y "PRAGMA cache_
1ed70 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  size"..**.**    
1ed80 20 28 32 29 20 20 54 68 65 72 65 20 69 73 20 61   (2)  There is a
1ed90 20 50 67 48 64 72 20 61 76 61 69 6c 61 62 6c 65   PgHdr available
1eda0 20 77 69 74 68 20 50 67 48 64 72 2d 3e 6e 52 65   with PgHdr->nRe
1edb0 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  f==0.**.**     (
1edc0 33 29 20 20 57 65 20 61 72 65 20 6e 6f 74 20 69  3)  We are not i
1edd0 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n an in-memory d
1ede0 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20 20  atabase.**.**   
1edf0 20 20 28 34 29 20 20 45 69 74 68 65 72 20 74 68    (4)  Either th
1ee00 65 72 65 20 69 73 20 61 6e 20 61 76 61 69 6c 61  ere is an availa
1ee10 62 6c 65 20 50 67 48 64 72 20 74 68 61 74 20 64  ble PgHdr that d
1ee20 6f 65 73 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20  oes not need.** 
1ee30 20 20 20 20 20 20 20 20 20 74 6f 20 62 65 20 73           to be s
1ee40 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 6f 72  ynced to disk or
1ee50 20 65 6c 73 65 20 64 69 73 6b 20 73 79 6e 63 69   else disk synci
1ee60 6e 67 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  ng is currently.
1ee70 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f  **          allo
1ee80 77 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  wed..*/.static i
1ee90 6e 74 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65  nt pagerAllocate
1eea0 50 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  Page(Pager *pPag
1eeb0 65 72 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67  er, PgHdr **ppPg
1eec0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1eed0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72  LITE_OK;.  PgHdr
1eee0 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 6e 42 79   *pPg;.  int nBy
1eef0 74 65 48 64 72 3b 0a 0a 20 20 2f 2a 20 43 72 65  teHdr;..  /* Cre
1ef00 61 74 65 20 61 20 6e 65 77 20 50 67 48 64 72 20  ate a new PgHdr 
1ef10 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
1ef20 75 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 64 65  ur conditions de
1ef30 66 69 6e 65 64 20 0a 20 20 2a 2a 20 61 62 6f 76  fined .  ** abov
1ef40 65 20 61 72 65 20 6d 65 74 3a 20 2a 2f 0a 20 20  e are met: */.  
1ef50 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
1ef60 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  e<pPager->mxPage
1ef70 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6c  .   || pPager->l
1ef80 72 75 2e 70 46 69 72 73 74 3d 3d 30 20 0a 20 20  ru.pFirst==0 .  
1ef90 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c 20   || MEMDB.   || 
1efa0 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69  (pPager->lru.pFi
1efb0 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 26 26 20  rstSynced==0 && 
1efc0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
1efd0 63 29 0a 20 20 29 7b 0a 20 20 20 20 76 6f 69 64  c).  ){.    void
1efe0 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 69 66 28   *pData;.    if(
1eff0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 3d   pPager->nPage>=
1f000 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 29 7b  pPager->nHash ){
1f010 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
1f020 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 70  ize_hash_table(p
1f030 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20  Pager,.         
1f040 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35  pPager->nHash<25
1f050 36 20 3f 20 32 35 36 20 3a 20 70 50 61 67 65 72  6 ? 256 : pPager
1f060 2d 3e 6e 48 61 73 68 2a 32 29 3b 0a 20 20 20 20  ->nHash*2);.    
1f070 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 48    if( pPager->nH
1f080 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ash==0 ){.      
1f090 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1f0a0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  MEM;.        got
1f0b0 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65  o pager_allocate
1f0c0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
1f0d0 20 20 7d 0a 20 20 20 20 70 61 67 65 72 4c 65 61    }.    pagerLea
1f0e0 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ve(pPager);.    
1f0f0 6e 42 79 74 65 48 64 72 20 3d 20 73 69 7a 65 6f  nByteHdr = sizeo
1f100 66 28 2a 70 50 67 29 20 2b 20 73 69 7a 65 6f 66  f(*pPg) + sizeof
1f110 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e  (u32) + pPager->
1f120 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20  nExtra.         
1f130 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a       + MEMDB*siz
1f140 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 3b 0a  eof(PgHistory);.
1f150 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
1f160 33 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 48 64  3Malloc( nByteHd
1f170 72 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67  r );.    if( pPg
1f180 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74 61 20   ){.      pData 
1f190 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
1f1a0 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61 67  loc( pPager->pag
1f1b0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69  eSize );.      i
1f1c0 66 28 20 70 44 61 74 61 3d 3d 30 20 29 7b 0a 20  f( pData==0 ){. 
1f1d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
1f1e0 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ree(pPg);.      
1f1f0 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20    pPg = 0;.     
1f200 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67   }.    }.    pag
1f210 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
1f220 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20  .    if( pPg==0 
1f230 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1f240 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1f250 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c    goto pager_all
1f260 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  ocate_out;.    }
1f270 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c  .    memset(pPg,
1f280 20 30 2c 20 6e 42 79 74 65 48 64 72 29 3b 0a 20   0, nByteHdr);. 
1f290 20 20 20 70 50 67 2d 3e 70 44 61 74 61 20 3d 20     pPg->pData = 
1f2a0 70 44 61 74 61 3b 0a 20 20 20 20 70 50 67 2d 3e  pData;.    pPg->
1f2b0 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
1f2c0 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41  .    pPg->pNextA
1f2d0 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c  ll = pPager->pAl
1f2e0 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  l;.#ifdef SQLITE
1f2f0 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
1f300 41 4e 41 47 45 4d 45 4e 54 0a 20 20 20 20 69 66  ANAGEMENT.    if
1f310 28 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20  ( pPg->pNextAll 
1f320 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  ){.      pPg->pN
1f330 65 78 74 41 6c 6c 2d 3e 70 50 72 65 76 41 6c 6c  extAll->pPrevAll
1f340 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 23 65   = pPg;.    }.#e
1f350 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d  ndif.    pPager-
1f360 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20  >pAll = pPg;.   
1f370 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b   pPager->nPage++
1f380 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1f390 2a 20 52 65 63 79 63 6c 65 20 61 6e 20 65 78 69  * Recycle an exi
1f3a0 73 74 69 6e 67 20 70 61 67 65 20 77 69 74 68 20  sting page with 
1f3b0 61 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74  a zero ref-count
1f3c0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61  . */.    rc = pa
1f3d0 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67  ger_recycle(pPag
1f3e0 65 72 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69  er, &pPg);.    i
1f3f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
1f400 53 59 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  SY ){.      rc =
1f410 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c   SQLITE_IOERR_BL
1f420 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20  OCKED;.    }.   
1f430 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f440 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
1f450 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f   pager_allocate_
1f460 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  out;.    }.    a
1f470 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1f480 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  tate>=SHARED_LOC
1f490 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1f4a0 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  pPg);.  }.  *ppP
1f4b0 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72 5f  g = pPg;..pager_
1f4c0 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20 20  allocate_out:.  
1f4d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f4e0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65  .** Make sure we
1f4f0 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74 65 6e   have the conten
1f500 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49  t for a page.  I
1f510 66 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a  f the page was.*
1f520 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71  * previously acq
1f530 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e  uired with noCon
1f540 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74 68  tent==1, then th
1f550 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a 2a  e content was.**
1f560 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69 7a 65   just initialize
1f570 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74 65  d to zeros inste
1f580 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64  ad of being read
1f590 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42   from disk..** B
1f5a0 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64 20 74  ut now we need t
1f5b0 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f 66 66  he real data off
1f5c0 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d 61   of disk.  So ma
1f5d0 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20 68 61  ke sure we.** ha
1f5e0 76 65 20 69 74 2e 20 20 52 65 61 64 20 69 74 20  ve it.  Read it 
1f5f0 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20  in if we do not 
1f600 68 61 76 65 20 69 74 20 61 6c 72 65 61 64 79 2e  have it already.
1f610 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1f620 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74  ager_get_content
1f630 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1f640 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52 65 61  if( pPg->needRea
1f650 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  d ){.    int rc 
1f660 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
1f670 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70  ->pPager, pPg, p
1f680 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  Pg->pgno);.    i
1f690 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f6a0 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   ){.      pPg->n
1f6b0 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20  eedRead = 0;.   
1f6c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1f6d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1f6e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1f6f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1f700 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
1f710 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
1f720 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
1f730 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
1f740 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
1f750 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
1f760 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
1f770 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
1f780 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
1f790 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
1f7a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1f7b0 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70   works for any p
1f7c0 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74  age number great
1f7d0 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74  er than 0.  If t
1f7e0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
1f7f0 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ile is smaller t
1f800 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
1f810 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20  d page, then no 
1f820 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72  actual disk.** r
1f830 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ead occurs and t
1f840 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
1f850 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69  of the page is i
1f860 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a  nitialized to.**
1f870 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65   all zeros.  The
1f880 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
1f890 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
1f8a0 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
1f8b0 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73  ized.** to zeros
1f8c0 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
1f8d0 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
1f8e0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a   into memory..**
1f8f0 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
1f900 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
1f910 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
1f920 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
1f930 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
1f940 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
1f950 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1f960 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
1f970 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
1f980 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
1f990 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
1f9a0 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
1f9b0 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
1f9c0 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
1f9d0 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
1f9e0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
1f9f0 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
1fa00 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
1fa10 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
1fa20 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
1fa30 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
1fa40 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
1fa50 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
1fa60 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
1fa70 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
1fa80 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
1fa90 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
1faa0 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
1fab0 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
1fac0 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
1fad0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
1fae0 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
1faf0 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
1fb00 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
1fb10 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
1fb20 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
1fb30 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
1fb40 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  iles..**.** If n
1fb50 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c 73  oContent is fals
1fb60 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  e, the page cont
1fb70 65 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c  ents are actuall
1fb80 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  y read from disk
1fb90 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  ..** If noConten
1fba0 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  t is true, it me
1fbb0 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
1fbc0 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
1fbd0 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
1fbe0 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
1fbf0 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f  s time, so do no
1fc00 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65 61 64  t do a disk read
1fc10 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
1fc20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74  the.** page cont
1fc30 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 2e 20  ent with zeros. 
1fc40 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20 66 61   But mark the fa
1fc50 63 74 20 74 68 61 74 20 77 65 20 68 61 76 65 20  ct that we have 
1fc60 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a 2a 20  not read the.** 
1fc70 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74 74 69  content by setti
1fc80 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
1fc90 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c 61 74  dRead flag.  Lat
1fca0 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71  er on, if .** sq
1fcb0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1fcc0 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
1fcd0 68 69 73 20 70 61 67 65 20 6f 72 20 69 66 20 74  his page or if t
1fce0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a  his routine is.*
1fcf0 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 77  * called again w
1fd00 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30  ith noContent==0
1fd10 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
1fd20 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73  t the content is
1fd30 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74   needed.** and t
1fd40 68 65 20 64 69 73 6b 20 72 65 61 64 20 73 68 6f  he disk read sho
1fd50 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61  uld occur at tha
1fd60 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  t point..*/.stat
1fd70 69 63 20 69 6e 74 20 70 61 67 65 72 41 63 71 75  ic int pagerAcqu
1fd80 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
1fd90 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
1fda0 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
1fdb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fdc0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
1fdd0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
1fde0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
1fdf0 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
1fe00 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
1fe10 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
1fe20 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
1fe30 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
1fe40 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
1fe50 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
1fe60 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
1fe70 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
1fe80 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
1fe90 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1fea0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1feb0 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
1fec0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   || pPager->nRef
1fed0 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b  >0 || pgno==1 );
1fee0 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d  ..  /* The maxim
1fef0 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
1ff00 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
1ff10 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
1ff20 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d   a page.  ** num
1ff30 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
1ff40 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20   this, or zero, 
1ff50 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
1ff60 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  */.  if( pgno>PA
1ff70 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
1ff80 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
1ff90 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
1ffa0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
1ffb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1ffc0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
1ffd0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
1ffe0 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
1fff0 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
20000 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  s..  */ .  asser
20010 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
20020 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 0a    *ppPage = 0;..
20030 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
20040 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61  the first page a
20050 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65  ccessed, then ge
20060 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a  t a SHARED lock.
20070 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
20080 62 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72  base file. pager
20090 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20  SharedLock() is 
200a0 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a  a no-op if .  **
200b0 20 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b   a database lock
200c0 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
200d0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
200e0 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50  gerSharedLock(pP
200f0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
20100 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20110 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
20120 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20130 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
20140 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70 50 67  UNLOCK );..  pPg
20150 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
20160 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
20170 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
20180 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
20190 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
201a0 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
201b0 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d  e. */.    int nM
201c0 61 78 3b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20  ax;.    int h;. 
201d0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
201e0 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20  ager->nMiss);.  
201f0 20 20 72 63 20 3d 20 70 61 67 65 72 41 6c 6c 6f    rc = pagerAllo
20200 63 61 74 65 50 61 67 65 28 70 50 61 67 65 72 2c  catePage(pPager,
20210 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20   &pPg);.    if( 
20220 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
20230 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
20240 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67  ;.    }..    pPg
20250 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
20260 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
20270 42 20 7c 7c 20 70 67 6e 6f 3e 70 50 61 67 65 72  B || pgno>pPager
20280 2d 3e 73 74 6d 74 53 69 7a 65 20 29 3b 0a 20 20  ->stmtSize );.  
20290 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
202a0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
202b0 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
202c0 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a  Journal, pgno);.
202d0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
202e0 63 20 3d 20 30 3b 0a 0a 20 20 20 20 6d 61 6b 65  c = 0;..    make
202f0 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
20300 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 0a  pPg->nRef = 1;..
20310 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
20320 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ++;.    if( pPag
20330 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a  er->nExtra>0 ){.
20340 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
20350 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
20360 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61   pPager), 0, pPa
20370 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
20380 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
20390 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
203a0 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 4d 61 78  nt(pPager, &nMax
203b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
203c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
203d0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
203e0 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
203f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
20400 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74  ..    /* Populat
20410 65 20 74 68 65 20 70 61 67 65 20 77 69 74 68 20  e the page with 
20420 64 61 74 61 2c 20 65 69 74 68 65 72 20 62 79 20  data, either by 
20430 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65  reading from the
20440 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
20450 20 66 69 6c 65 2c 20 6f 72 20 62 79 20 73 65 74   file, or by set
20460 74 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20  ting the entire 
20470 70 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 20 20  page to zero..  
20480 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4d 61    */.    if( nMa
20490 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d  x<(int)pgno || M
204a0 45 4d 44 42 20 7c 7c 20 28 6e 6f 43 6f 6e 74 65  EMDB || (noConte
204b0 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 61  nt && !pPager->a
204c0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 20 29  lwaysRollback) )
204d0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  {.      if( pgno
204e0 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
204f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
20500 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
20510 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
20520 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
20530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
20540 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
20550 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
20560 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
20570 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61      pPg->needRea
20580 64 20 3d 20 6e 6f 43 6f 6e 74 65 6e 74 20 26 26  d = noContent &&
20590 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73   !pPager->always
205a0 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20  Rollback;.      
205b0 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25  IOTRACE(("ZERO %
205c0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
205d0 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c   pgno));.    }el
205e0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  se{.      rc = r
205f0 65 61 64 44 62 50 61 67 65 28 70 50 61 67 65 72  eadDbPage(pPager
20600 2c 20 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20  , pPg, pgno);.  
20610 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20620 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
20630 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
20640 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
20650 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20  pPg->pgno = 0;. 
20660 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
20670 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
20680 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
20690 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
206a0 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20  pPg->needRead = 
206b0 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
206c0 20 4c 69 6e 6b 20 74 68 65 20 70 61 67 65 20 69   Link the page i
206d0 6e 74 6f 20 74 68 65 20 70 61 67 65 20 68 61 73  nto the page has
206e0 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 68  h table */.    h
206f0 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65   = pgno & (pPage
20700 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20  r->nHash-1);.   
20710 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
20720 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   );.    pPg->pNe
20730 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d  xtHash = pPager-
20740 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70  >aHash[h];.    p
20750 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
20760 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70  = pPg;.    if( p
20770 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
20780 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20790 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
207a0 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
207b0 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48       pPg->pNextH
207c0 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
207d0 20 70 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69 66   pPg;.    }..#if
207e0 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
207f0 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
20800 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
20810 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
20820 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
20830 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
20840 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20  sted page is in 
20850 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
20860 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 70 50  */.    assert(pP
20870 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20  ager->nRef>0 || 
20880 70 67 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 50 41  pgno==1);.    PA
20890 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
208a0 3e 6e 48 69 74 29 3b 0a 20 20 20 20 69 66 28 20  >nHit);.    if( 
208b0 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  !noContent ){.  
208c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67      rc = pager_g
208d0 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b  et_content(pPg);
208e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
208f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20900 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
20910 7d 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70  }.    page_ref(p
20920 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61  Pg);.  }.  *ppPa
20930 67 65 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75  ge = pPg;.  retu
20940 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
20950 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
20960 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72  Acquire(.  Pager
20970 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
20980 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
20990 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
209a0 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
209b0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
209c0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
209d0 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
209e0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
209f0 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
20a00 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
20a10 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ere */.  int noC
20a20 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20  ontent       /* 
20a30 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65  Do not bother re
20a40 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72  ading content fr
20a50 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20  om disk if true 
20a60 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
20a70 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
20a80 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  ger);.  rc = pag
20a90 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72  erAcquire(pPager
20aa0 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
20ab0 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 61  noContent);.  pa
20ac0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
20ad0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
20ae0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  .../*.** Acquire
20af0 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
20b00 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
20b10 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
20b20 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
20b30 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
20b40 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
20b50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
20b60 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
20b70 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
20b80 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53  n cache..**.** S
20b90 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
20ba0 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20  agerGet().  The 
20bb0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
20bc0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
20bd0 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61  ** and sqlite3Pa
20be0 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74  gerGet() is that
20bf0 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20   _get() will go 
20c00 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20  to the disk and 
20c10 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  read.** in the p
20c20 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20  age if the page 
20c30 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
20c40 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  n cache.  This r
20c50 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
20c60 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61  s NULL if the pa
20c70 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
20c80 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20  he or if a disk 
20c90 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61  I/O error .** ha
20ca0 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e  s ever happened.
20cb0 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69  .*/.DbPage *sqli
20cc0 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50  te3PagerLookup(P
20cd0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
20ce0 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
20cf0 72 20 2a 70 50 67 20 3d 20 30 3b 0a 0a 20 20 61  r *pPg = 0;..  a
20d00 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
20d10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
20d20 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 70 61 67 65  no!=0 );..  page
20d30 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
20d40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
20d50 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
20d60 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
20d70 20 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 7c   !pPager->pAll |
20d80 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  | pPager->exclus
20d90 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20 7d 65 6c  iveMode );.  }el
20da0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  se if( pPager->e
20db0 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
20dc0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
20dd0 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 2f 2a  E_FULL ){.    /*
20de0 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
20df0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 67 20   }else if( (pPg 
20e00 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
20e10 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 21 3d 30  Pager, pgno))!=0
20e20 20 29 7b 0a 20 20 20 20 70 61 67 65 5f 72 65 66   ){.    page_ref
20e30 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67  (pPg);.  }.  pag
20e40 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
20e50 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d  .  return pPg;.}
20e60 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
20e70 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
20e80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
20e90 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
20ea0 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65   page drop to ze
20eb0 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ro, then the.** 
20ec0 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f  page is added to
20ed0 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20   the LRU list.  
20ee0 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e  When all referen
20ef0 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73  ces to all pages
20f00 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64  .** are released
20f10 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  , a rollback occ
20f20 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  urs and the lock
20f30 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
20f40 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a   is.** removed..
20f50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
20f60 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20  gerUnref(DbPage 
20f70 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
20f80 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70  pPager;..  if( p
20f90 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  Pg==0 ) return S
20fa0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67  QLITE_OK;.  pPag
20fb0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
20fc0 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  ;..  /* Decremen
20fd0 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
20fe0 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70  count for this p
20ff0 61 67 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  age.  */.  asser
21000 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
21010 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
21020 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 70  Pg->pPager);.  p
21030 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 0a 20 20 43  Pg->nRef--;..  C
21040 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
21050 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
21060 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
21070 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65  ces to a page re
21080 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a  ach 0, call the.
21090 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20    ** destructor 
210a0 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65  and add the page
210b0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
210c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
210d0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 0a 20 20  ->nRef==0 ){..  
210e0 20 20 6c 72 75 4c 69 73 74 41 64 64 28 70 50 67    lruListAdd(pPg
210f0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
21100 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29  r->xDestructor )
21110 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
21120 78 44 65 73 74 72 75 63 74 6f 72 28 70 50 67 2c  xDestructor(pPg,
21130 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
21140 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  e);.    }.  .   
21150 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67   /* When all pag
21160 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65  es reach the fre
21170 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20  elist, drop the 
21180 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20  read lock from. 
21190 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
211a0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
211b0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
211c0 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
211d0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20  pPager->nRef>=0 
211e0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
211f0 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 28 21  r->nRef==0 && (!
21200 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
21210 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
21220 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 29  >journalOff>0) )
21230 7b 0a 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c  {.      pagerUnl
21240 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
21250 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
21260 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  }.  pagerLeave(p
21270 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
21280 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
21290 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f  *.** Create a jo
212a0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
212b0 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68  Pager.  There sh
212c0 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
212d0 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72  a RESERVED.** or
212e0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
212f0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
21300 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
21310 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
21320 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
21330 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
21340 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20  ything.  Return 
21350 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
21360 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a  d release the.**
21370 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61   write lock if a
21380 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
21390 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
213a0 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
213b0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
213c0 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
213d0 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
213e0 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 66  r->pVfs;.  int f
213f0 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
21400 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
21410 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
21420 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
21430 43 52 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74 20  CREATE);..  int 
21440 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
21450 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
21460 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
21470 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
21480 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
21490 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
214a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
214b0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
214c0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  =0 );.  sqlite3P
214d0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
214e0 61 67 65 72 2c 20 30 29 3b 0a 20 20 70 61 67 65  ager, 0);.  page
214f0 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
21500 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
21510 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  rnal = sqlite3Bi
21520 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
21530 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 70 61  r->dbSize);.  pa
21540 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
21550 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
21560 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  pInJournal==0 ){
21570 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
21580 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
21590 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f   failed_to_open_
215a0 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20  journal;.  }..  
215b0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
215c0 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20  nalOpen==0 ){.  
215d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
215e0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
215f0 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45  flags |= (SQLITE
21600 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
21610 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
21620 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  TEMP_JOURNAL);. 
21630 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21640 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45  flags |= (SQLITE
21650 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
21660 41 4c 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  AL);.    }.#ifde
21670 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
21680 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
21690 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75   rc = sqlite3Jou
216a0 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20  rnalOpen(.      
216b0 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e    pVfs, pPager->
216c0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
216d0 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72  ->jfd, flags, jr
216e0 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
216f0 67 65 72 29 0a 20 20 20 20 29 3b 0a 23 65 6c 73  ger).    );.#els
21700 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  e.    rc = sqlit
21710 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
21720 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
21730 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
21740 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  ags, 0);.#endif.
21750 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
21760 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
21770 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f  ger->jfd->pMetho
21780 64 73 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ds );.    pPager
21790 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
217a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  ;.    pPager->se
217b0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
217c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
217d0 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Hdr = 0;.    if(
217e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
217f0 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  {.      if( rc==
21800 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
21810 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
21820 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
21830 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
21840 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
21850 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
21860 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
21870 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 67 65     }.  }.  pPage
21880 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
21890 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   1;.  pPager->jo
218a0 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
218b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
218c0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
218d0 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
218e0 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ck = 0;.  pPager
218f0 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66  ->nRec = 0;.  if
21900 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
21910 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  e ){.    rc = pP
21920 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
21930 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
21940 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
21950 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72    }.  pPager->or
21960 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
21970 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63  r->dbSize;..  rc
21980 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
21990 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  dr(pPager);..  i
219a0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  f( pPager->stmtA
219b0 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53  utoopen && rc==S
219c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
219d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
219e0 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65  rStmtBegin(pPage
219f0 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  r);.  }.  if( rc
21a00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
21a10 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
21a20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
21a30 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ERR_NOMEM ){.   
21a40 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
21a50 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
21a60 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  er, 0);.    if( 
21a70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21a80 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
21a90 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
21aa0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
21ab0 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f  .failed_to_open_
21ac0 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74  journal:.  sqlit
21ad0 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
21ae0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
21af0 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
21b00 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
21b10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21b20 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77  *.** Acquire a w
21b30 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
21b40 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
21b50 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20  lock is removed 
21b60 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20  when.** the any 
21b70 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
21b80 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20   happen:.**.**  
21b90 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
21ba0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
21bb0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
21bc0 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
21bd0 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61  Rollback() is ca
21be0 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
21bf0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
21c00 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
21c10 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
21c20 72 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c  rUnref() is call
21c30 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f  ed to on every o
21c40 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e  utstanding page.
21c50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
21c60 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
21c70 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
21c80 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f  pointer to any o
21c90 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a  pen page of the.
21ca0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
21cb0 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67  .  Nothing chang
21cc0 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  es about the pag
21cd0 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d  e - it is used m
21ce0 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75  erely to.** acqu
21cf0 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ire a pointer to
21d00 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
21d10 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f  ture and as proo
21d20 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  f that there is.
21d30 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  ** already a rea
21d40 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
21d50 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
21d60 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
21d70 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77  er indicates how
21d80 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62   much space in b
21d90 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20  ytes to reserve 
21da0 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20  for a.** master 
21db0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d  journal file-nam
21dc0 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
21dd0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68  f the journal wh
21de0 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64  en it is created
21df0 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61  ..**.** A journa
21e00 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
21e10 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
21e20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
21e30 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  .  For temporary
21e40 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f  .** files, the o
21e50 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  pening of the jo
21e60 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
21e70 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
21e80 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75  re is an.** actu
21e90 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  al need to write
21ea0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
21eb0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
21ec0 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
21ed0 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  y reserved for w
21ee0 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75  riting, this rou
21ef0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
21f00 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67  .**.** If exFlag
21f10 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65   is true, go ahe
21f20 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58  ad and get an EX
21f30 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
21f40 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65  the file.** imme
21f50 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20  diately instead 
21f60 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c  of waiting until
21f70 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68   we try to flush
21f80 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65   the cache.  The
21f90 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67  .** exFlag is ig
21fa0 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73  nored if a trans
21fb0 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
21fc0 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  y active..*/.int
21fd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
21fe0 69 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20  in(DbPage *pPg, 
21ff0 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50  int exFlag){.  P
22000 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
22010 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
22020 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
22030 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
22040 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74  Pager);.  assert
22050 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
22060 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
22070 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
22080 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  UNLOCK );.  if( 
22090 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
220a0 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
220b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
220c0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
220d0 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44   );.    if( MEMD
220e0 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  B ){.      pPage
220f0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
22100 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
22110 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
22120 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
22130 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65  bSize;.    }else
22140 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
22150 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
22160 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
22170 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
22180 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22190 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
221a0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
221b0 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
221c0 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a    if( exFlag ){.
221d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
221e0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
221f0 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
22200 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
22210 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22220 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
22230 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
22240 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
22250 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  r);.        retu
22260 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
22270 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72       pPager->dir
22280 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  tyCache = 0;.   
22290 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
222a0 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e  TRANSACTION %d\n
222b0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
222c0 72 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  r));.      if( p
222d0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
222e0 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  l && !pPager->te
222f0 6d 70 46 69 6c 65 0a 20 20 20 20 20 20 20 20 20  mpFile.         
22300 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
22310 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
22320 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
22330 46 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  F ){.        rc 
22340 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
22350 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
22360 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
22370 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
22380 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70  journalOpen && p
22390 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
223a0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
223b0 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
223c0 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
223d0 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
223e0 73 73 20 6d 6f 64 65 20 74 68 65 20 6c 61 73 74  ss mode the last
223f0 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28  .    ** time a (
22400 72 65 61 64 20 6f 72 20 77 72 69 74 65 29 20 74  read or write) t
22410 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73  ransaction was s
22420 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63  uccessfully conc
22430 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  luded.    ** by 
22440 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  this connection.
22450 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65   Instead of dele
22460 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
22470 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20   file it was .  
22480 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61    ** kept open a
22490 6e 64 20 65 69 74 68 65 72 20 77 61 73 20 74 72  nd either was tr
224a0 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74  uncated to 0 byt
224b0 65 73 20 6f 72 20 69 74 73 20 68 65 61 64 65 72  es or its header
224c0 20 77 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72   was.    ** over
224d0 77 72 69 74 74 65 6e 20 77 69 74 68 20 7a 65 72  written with zer
224e0 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  os..    */.    a
224f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
22500 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
22510 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72  sert( pPager->or
22520 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  igDbSize==0 );. 
22530 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
22540 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
22550 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
22560 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
22570 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 61  ager, 0);.    pa
22580 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
22590 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
225a0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
225b0 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 20  e3BitvecCreate( 
225c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
225d0 3b 0a 20 20 20 20 70 61 67 65 72 45 6e 74 65 72  ;.    pagerEnter
225e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
225f0 28 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  ( !pPager->pInJo
22600 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
22610 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
22620 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22630 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44     pPager->origD
22640 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
22650 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63  dbSize;.      rc
22660 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
22670 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
22680 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
22690 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
226a0 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Open || pPager->
226b0 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20  journalOff>0 || 
226c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
226d0 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
226e0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
226f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  rc;.}../*.** Mak
22700 65 20 61 20 70 61 67 65 20 64 69 72 74 79 2e 20  e a page dirty. 
22710 20 53 65 74 20 69 74 73 20 64 69 72 74 79 20 66   Set its dirty f
22720 6c 61 67 20 61 6e 64 20 61 64 64 20 69 74 20 74  lag and add it t
22730 6f 20 74 68 65 20 64 69 72 74 79 0a 2a 2a 20 70  o the dirty.** p
22740 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  age list..*/.sta
22750 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 44 69 72  tic void makeDir
22760 74 79 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ty(PgHdr *pPg){.
22770 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
22780 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ==0 ){.    Pager
22790 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
227a0 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d  pPager;.    pPg-
227b0 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20  >dirty = 1;.    
227c0 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  pPg->pDirty = pP
227d0 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20 20  ager->pDirty;.  
227e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 44    if( pPager->pD
227f0 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50  irty ){.      pP
22800 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 50  ager->pDirty->pP
22810 72 65 76 44 69 72 74 79 20 3d 20 70 50 67 3b 0a  revDirty = pPg;.
22820 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70      }.    pPg->p
22830 50 72 65 76 44 69 72 74 79 20 3d 20 30 3b 0a 20  PrevDirty = 0;. 
22840 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
22850 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a  y = pPg;.  }.}..
22860 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67  /*.** Make a pag
22870 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20  e clean.  Clear 
22880 69 74 73 20 64 69 72 74 79 20 62 69 74 20 61 6e  its dirty bit an
22890 64 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  d remove it from
228a0 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61   the.** dirty pa
228b0 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ge list..*/.stat
228c0 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61  ic void makeClea
228d0 6e 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  n(PgHdr *pPg){. 
228e0 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
228f0 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74  ){.    pPg->dirt
22900 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  y = 0;.    if( p
22910 50 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20  Pg->pDirty ){.  
22920 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
22930 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69  >pDirty->pPrevDi
22940 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  rty==pPg );.    
22950 20 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70    pPg->pDirty->p
22960 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67 2d  PrevDirty = pPg-
22970 3e 70 50 72 65 76 44 69 72 74 79 3b 0a 20 20 20  >pPrevDirty;.   
22980 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
22990 70 50 72 65 76 44 69 72 74 79 20 29 7b 0a 20 20  pPrevDirty ){.  
229a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
229b0 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69  >pPrevDirty->pDi
229c0 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  rty==pPg );.    
229d0 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74    pPg->pPrevDirt
229e0 79 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d  y->pDirty = pPg-
229f0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c  >pDirty;.    }el
22a00 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
22a10 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  ( pPg->pPager->p
22a20 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20  Dirty==pPg );.  
22a30 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
22a40 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70  >pDirty = pPg->p
22a50 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  Dirty;.    }.  }
22a60 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  .}.../*.** Mark 
22a70 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
22a80 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70  riteable.  The p
22a90 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
22aa0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
22ab0 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74  .** if it is not
22ac0 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20   there already. 
22ad0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
22ae0 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
22af0 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68  ore making.** ch
22b00 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e  anges to a page.
22b10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
22b20 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
22b30 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
22b40 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20  e pager creates 
22b50 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  a new.** journal
22b60 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
22b70 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
22b80 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
22b90 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a  If the RESERVED.
22ba0 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  ** lock could no
22bb0 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74  t be acquired, t
22bc0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
22bd0 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  rns SQLITE_BUSY.
22be0 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
22bf0 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68   routine must ch
22c00 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74  eck for that ret
22c10 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65  urn value and be
22c20 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a   careful not to.
22c30 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  ** change any pa
22c40 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68  ge data until th
22c50 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
22c60 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
22c70 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
22c80 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f  al file could no
22c90 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63  t be written bec
22ca0 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73  ause the disk is
22cb0 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74   full,.** then t
22cc0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
22cd0 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rns SQLITE_FULL 
22ce0 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65  and does an imme
22cf0 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  diate rollback..
22d00 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  ** All subsequen
22d10 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73  t write attempts
22d20 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c   also return SQL
22d30 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74  ITE_FULL until t
22d40 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c  here.** is a cal
22d50 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
22d60 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c  rCommit() or sql
22d70 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
22d80 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e  k() to.** reset.
22d90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
22da0 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72  ager_write(PgHdr
22db0 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a   *pPg){.  void *
22dc0 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f  pData = PGHDR_TO
22dd0 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 50 61  _DATA(pPg);.  Pa
22de0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
22df0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
22e00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22e10 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
22e20 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69   errors.  */.  i
22e30 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
22e40 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  de ){ .    retur
22e50 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
22e60 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
22e70 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  ger->readOnly ){
22e80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
22e90 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20  TE_PERM;.  }..  
22ea0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
22eb0 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20  >setMaster );.. 
22ec0 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
22ed0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
22ee0 70 61 67 65 20 77 61 73 20 70 72 65 76 69 6f 75  page was previou
22ef0 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74  sly acquired wit
22f00 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20  h noContent==1, 
22f10 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  that means.  ** 
22f20 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c 6c 79  we didn't really
22f30 20 72 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6e   read in the con
22f40 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
22f50 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  .  This can happ
22f60 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78 61  en.  ** (for exa
22f70 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65 20 70  mple) when the p
22f80 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 76  age is being mov
22f90 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
22fa0 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f  st.  But.  ** no
22fb0 77 20 77 65 20 61 72 65 20 28 70 65 72 68 61 70  w we are (perhap
22fc0 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61  s) moving the pa
22fd0 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20 66 72  ge off of the fr
22fe0 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20  eelist for.  ** 
22ff0 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e 65 65  reuse and we nee
23000 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72  d to know its or
23010 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73  iginal content s
23020 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20  o that content. 
23030 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f 72 65   ** can be store
23040 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  d in the rollbac
23050 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64  k journal.  So d
23060 6f 20 74 68 65 20 72 65 61 64 20 61 74 20 74 68  o the read at th
23070 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20  is.  ** time..  
23080 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
23090 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29  get_content(pPg)
230a0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
230b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
230c0 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
230d0 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
230e0 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
230f0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
23100 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
23110 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
23120 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
23130 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d  t away..  */.  m
23140 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
23150 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72   if( pPg->inJour
23160 6e 61 6c 20 26 26 20 28 70 61 67 65 49 6e 53 74  nal && (pageInSt
23170 61 74 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c 20  atement(pPg) || 
23180 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
23190 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61  e==0) ){.    pPa
231a0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
231b0 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
231c0 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b  >dbModified = 1;
231d0 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f  .  }else{..    /
231e0 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
231f0 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
23200 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
23210 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
23220 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74  written to the t
23230 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
23240 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70  al or the ckeckp
23250 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  oint journal.   
23260 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20   ** or both..   
23270 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74   **.    ** First
23280 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
23290 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
232a0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  on journal exist
232b0 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65  s and.    ** cre
232c0 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65  ate it if it doe
232d0 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  s not..    */.  
232e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
232f0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
23300 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  NLOCK );.    rc 
23310 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
23320 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20 20  gin(pPg, 0);.   
23330 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23340 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
23350 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
23360 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
23370 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
23380 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66  SERVED );.    if
23390 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
233a0 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72  alOpen && pPager
233b0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20  ->useJournal.   
233c0 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72         && pPager
233d0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
233e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
233f0 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 72 63  _OFF ){.      rc
23400 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
23410 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
23420 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
23430 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
23440 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rc;.    }.    pP
23450 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
23460 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
23470 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31  ->dbModified = 1
23480 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  ;.  .    /* The 
23490 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
234a0 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61  nal now exists a
234b0 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53  nd we have a RES
234c0 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20  ERVED or an.    
234d0 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
234e0 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  k on the main da
234f0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72  tabase file.  Wr
23500 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
23510 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74  page to.    ** t
23520 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
23530 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20  ournal if it is 
23540 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
23550 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
23560 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
23570 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e 6a 6f  l && (pPager->jo
23580 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 4d 45 4d  urnalOpen || MEM
23590 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  DB) ){.      if(
235a0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
235b0 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
235c0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  bSize ){.       
235d0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
235e0 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
235f0 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
23600 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
23610 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
23620 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4a 4f   PAGERTRACE3("JO
23630 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
23640 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
23650 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
23660 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
23670 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  rt( pHist->pOrig
23680 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
23690 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20   pHist->pOrig = 
236a0 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
236b0 63 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c( pPager->pageS
236c0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ize );.         
236d0 20 69 66 28 20 21 70 48 69 73 74 2d 3e 70 4f 72   if( !pHist->pOr
236e0 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ig ){.          
236f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23700 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
23710 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
23720 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  cpy(pHist->pOrig
23730 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
23740 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
23750 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
23760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23770 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20    u32 cksum;.   
23780 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
23790 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  ta2;..          
237a0 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76  /* We should nev
237b0 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  er write to the 
237c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
237d0 20 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20   page that.     
237e0 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
237f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
23800 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  cks.  The follow
23810 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66  ing assert verif
23820 69 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ies.          **
23830 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e   that we do not.
23840 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
23850 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21  sert( pPg->pgno!
23860 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
23870 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
23880 20 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44      pData2 = COD
23890 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
238a0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
238b0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73 75  ;.          cksu
238c0 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
238d0 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61  pPager, (u8*)pDa
238e0 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ta2);.          
238f0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
23900 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
23910 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
23920 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
23930 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
23940 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23950 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
23960 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
23970 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32  ger->jfd, pData2
23980 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
23990 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
239a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239b0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
239c0 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20  nalOff + 4);.   
239d0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
239e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70  >journalOff += p
239f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
23a00 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  4;.          }. 
23a10 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
23a20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23a30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
23a40 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
23a50 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
23a60 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75  journalOff, cksu
23a70 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  m);.            
23a80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
23a90 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20  ff += 4;.       
23aa0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 49     }.          I
23ab0 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70  OTRACE(("JOUT %p
23ac0 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %d %lld %d\n", 
23ad0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
23ae0 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
23af0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
23b00 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65  ournalOff, pPage
23b10 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20  r->pageSize));. 
23b20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49           PAGER_I
23b30 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
23b40 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b  r_writej_count);
23b50 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
23b60 54 52 41 43 45 35 28 22 4a 4f 55 52 4e 41 4c 20  TRACE5("JOURNAL 
23b70 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
23b80 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78  ync=%d hash(%08x
23b90 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
23ba0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
23bb0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
23bc0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20   pPg->needSync, 
23bd0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
23be0 50 67 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  Pg));..         
23bf0 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73   /* An error has
23c00 20 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e 67   occured writing
23c10 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
23c20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20  file. The .     
23c30 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
23c40 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c  ion will be roll
23c50 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c  ed back by the l
23c60 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20  ayer above..    
23c70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
23c80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23c90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23ca0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
23cb0 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
23cc0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
23cd0 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ec++;.          
23ce0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
23cf0 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  pInJournal!=0 );
23d00 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23d10 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
23d20 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
23d30 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
23d40 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
23d50 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e  ync = !pPager->n
23d60 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20  oSync;.         
23d70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
23d80 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
23d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
23da0 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
23db0 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e  InStmt, pPg->pgn
23dc0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  o);.          }.
23dd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23de0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
23df0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
23e00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
23e10 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65  tarted && !pPage
23e20 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20  r->noSync;.     
23e30 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22     PAGERTRACE4("
23e40 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
23e50 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
23e60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23e70 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
23e80 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
23e90 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  g->needSync);.  
23ea0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23eb0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
23ec0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
23ed0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
23ee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
23ef0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
23f00 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
23f10 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
23f20 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
23f30 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
23f40 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20  s not in it,.   
23f50 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
23f60 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
23f70 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
23f80 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
23f90 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
23fa0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
23fb0 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73  l format differs
23fc0 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
23fd0 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
23fe0 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74  t.    ** in that
23ff0 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
24000 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
24010 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  header..    */. 
24020 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
24030 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 20 20 26  tmtInUse .     &
24040 26 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65  & !pageInStateme
24050 6e 74 28 70 50 67 29 20 0a 20 20 20 20 20 26 26  nt(pPg) .     &&
24060 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
24070 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
24080 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e .    ){.      
24090 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
240a0 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
240b0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
240c0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
240d0 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
240e0 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
240f0 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
24100 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
24110 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
24120 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
24130 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
24140 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
24150 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
24160 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61  lloc( pPager->pa
24170 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
24180 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74    if( pHist->pSt
24190 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
241a0 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53  memcpy(pHist->pS
241b0 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  tmt, PGHDR_TO_DA
241c0 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
241d0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
241e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
241f0 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d  GERTRACE3("STMT-
24200 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
24210 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
24220 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
24230 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65  o);.        page
24240 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
24250 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 65  t(pPg);.      }e
24260 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34  lse{.        i64
24270 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72   offset = pPager
24280 2d 3e 73 74 6d 74 4e 52 65 63 2a 28 34 2b 70 50  ->stmtNRec*(4+pP
24290 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
242a0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
242b0 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70  Data2 = CODEC2(p
242c0 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
242d0 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20  g->pgno, 7);.   
242e0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
242f0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 74  2bits(pPager->st
24300 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d  fd, offset, pPg-
24310 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
24320 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24330 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
24340 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
24350 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  te(pPager->stfd,
24360 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
24370 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
24380 74 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  t+4);.        }.
24390 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
243a0 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE3("STMT-JOURNA
243b0 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
243c0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
243d0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
243e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
243f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
24400 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
24410 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24420 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
24430 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
24440 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
24450 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
24460 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
24470 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
24480 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  Stmt, pPg->pgno)
24490 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
244a0 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
244b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
244c0 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
244d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
244e0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
244f0 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69  ER_SHARED );.  i
24500 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
24510 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  e<(int)pPg->pgno
24520 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
24530 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
24540 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d  no;.    if( !MEM
24550 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  DB && pPager->db
24560 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Size==PENDING_BY
24570 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
24580 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
24590 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20  ger->dbSize++;. 
245a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
245b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
245c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
245d0 75 73 65 64 20 74 6f 20 6d 61 72 6b 20 61 20 64  used to mark a d
245e0 61 74 61 2d 70 61 67 65 20 61 73 20 77 72 69 74  ata-page as writ
245f0 61 62 6c 65 2e 20 49 74 20 75 73 65 73 20 0a 2a  able. It uses .*
24600 2a 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  * pager_write() 
24610 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61  to open a journa
24620 6c 20 66 69 6c 65 20 28 69 66 20 69 74 20 69 73  l file (if it is
24630 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
24640 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  n).** and write 
24650 74 68 65 20 70 61 67 65 20 2a 70 44 61 74 61 20  the page *pData 
24660 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
24670 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
24680 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
24690 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70  s function and p
246a0 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
246b0 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e  that this.** fun
246c0 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73  ction also deals
246d0 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
246e0 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f  l case where 2 o
246f0 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20  r more pages.** 
24700 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  fit on a single 
24710 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20  disk sector. In 
24720 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f  this case all co
24730 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a  -resident pages.
24740 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ** must have bee
24750 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
24760 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
24770 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
24780 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
24790 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20  gerWrite(DbPage 
247a0 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74  *pDbPage){.  int
247b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
247c0 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ..  PgHdr *pPg =
247d0 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
247e0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
247f0 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
24800 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d  nPagePerSector =
24810 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
24820 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67  Size/pPager->pag
24830 65 53 69 7a 65 29 3b 0a 0a 20 20 70 61 67 65 72  eSize);..  pager
24840 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
24850 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 6e   if( !MEMDB && n
24860 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20  PagePerSector>1 
24870 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  ){.    Pgno nPag
24880 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  eCount;         
24890 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
248a0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
248b0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
248c0 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20    Pgno pg1;     
248d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
248e0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
248f0 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
24900 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20  ocated on. */.  
24910 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
24920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24930 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
24940 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74  tarting at pg1 t
24950 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
24960 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74   int ii;.    int
24970 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a   needSync = 0;..
24980 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64      /* Set the d
24990 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f  oNotSync flag to
249a0 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61   1. This is beca
249b0 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c  use we cannot al
249c0 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20  low a journal.  
249d0 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62    ** header to b
249e0 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65  e written betwee
249f0 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72  n the pages jour
24a00 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20 66 75  naled by this fu
24a10 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  nction..    */. 
24a20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
24a30 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20  r->doNotSync==0 
24a40 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
24a50 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20  oNotSync = 1;.. 
24a60 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b     /* This trick
24a70 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f   assumes that bo
24a80 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  th the page-size
24a90 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
24aa0 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69   are.    ** an i
24ab0 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20  nteger power of 
24ac0 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61  2. It sets varia
24ad0 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69  ble pg1 to the i
24ae0 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a  dentifier.    **
24af0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
24b00 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
24b10 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
24b20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
24b30 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f  g1 = ((pPg->pgno
24b40 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72  -1) & ~(nPagePer
24b50 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a  Sector-1)) + 1;.
24b60 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
24b70 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
24b80 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65  r, (int *)&nPage
24b90 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  Count);.    if( 
24ba0 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43  pPg->pgno>nPageC
24bb0 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
24bc0 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f  age = (pPg->pgno
24bd0 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d   - pg1)+1;.    }
24be0 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50  else if( (pg1+nP
24bf0 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e  agePerSector-1)>
24c00 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
24c10 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
24c20 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20  eCount+1-pg1;.  
24c30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
24c40 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53  Page = nPagePerS
24c50 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  ector;.    }.   
24c60 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29   assert(nPage>0)
24c70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31  ;.    assert(pg1
24c80 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  <=pPg->pgno);.  
24c90 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50    assert((pg1+nP
24ca0 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b  age)>pPg->pgno);
24cb0 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ..    for(ii=0; 
24cc0 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d  ii<nPage && rc==
24cd0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29  SQLITE_OK; ii++)
24ce0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20  {.      Pgno pg 
24cf0 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20  = pg1+ii;.      
24d00 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20  PgHdr *pPage;.  
24d10 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d      if( pg==pPg-
24d20 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65  >pgno || !sqlite
24d30 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
24d40 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
24d50 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pg) ){.        i
24d60 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f  f( pg!=PAGER_MJ_
24d70 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
24d80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
24d90 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
24da0 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67  Pager, pg, &pPag
24db0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
24dc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24dd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
24de0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
24df0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
24e00 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
24e10 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
24e20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
24e30 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
24e40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
24e50 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
24e60 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
24e70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
24e80 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
24e90 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f   (pPage = pager_
24ea0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
24eb0 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  g))!=0 ){.      
24ec0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 65 65    if( pPage->nee
24ed0 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  dSync ){.       
24ee0 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
24ef0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24f00 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
24f10 20 49 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65   If the PgHdr.ne
24f20 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73  edSync flag is s
24f30 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68  et for any of th
24f40 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20  e nPage pages . 
24f50 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
24f60 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e  t pg1, then it n
24f70 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66  eeds to be set f
24f80 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20  or all of them. 
24f90 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77  Because.    ** w
24fa0 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66  riting to any of
24fb0 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67   these nPage pag
24fc0 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68  es may damage th
24fd0 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20  e others, the.  
24fe0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
24ff0 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73  e must contain s
25000 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f  ync()ed copies o
25010 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20  f all of them.  
25020 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20    ** before any 
25030 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77  of them can be w
25040 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
25050 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
25060 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
25070 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
25080 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
25090 50 61 67 65 20 26 26 20 6e 65 65 64 53 79 6e 63  Page && needSync
250a0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
250b0 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20   PgHdr *pPage = 
250c0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
250d0 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20  ger, pg1+ii);.  
250e0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
250f0 29 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e  ) pPage->needSyn
25100 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
25110 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
25120 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  er->needSync);. 
25130 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
25140 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
25150 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50  ync==1 );.    pP
25160 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20  ager->doNotSync 
25170 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
25180 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
25190 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  te(pDbPage);.  }
251a0 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
251b0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
251c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
251d0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
251e0 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68  page given in th
251f0 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70  e argument was p
25200 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64  reviously passed
25210 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
25220 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20  gerWrite().  In 
25230 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
25240 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
25250 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
25260 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
25270 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   the page..*/.#i
25280 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74  fndef NDEBUG.int
25290 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
252a0 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20  riteable(DbPage 
252b0 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
252c0 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65  pPg->dirty;.}.#e
252d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  ndif../*.** A ca
252e0 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
252f0 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
25300 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  er that it is no
25310 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a  t necessary to.*
25320 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f  * write the info
25330 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20  rmation on page 
25340 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20  pPg back to the 
25350 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67  disk, even thoug
25360 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d  h.** that page m
25370 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61  ight be marked a
25380 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54  s dirty..**.** T
25390 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66  he overlying sof
253a0 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c  tware layer call
253b0 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
253c0 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64  hen all of the d
253d0 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69  ata.** on the gi
253e0 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73  ven page is unus
253f0 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d  ed.  The pager m
25400 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73  arks the page as
25410 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61   clean so.** tha
25420 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65  t it does not ge
25430 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
25440 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73  k..**.** Tests s
25450 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70  how that this op
25460 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65  timization, toge
25470 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a  ther with the.**
25480 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
25490 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f  tRollback() belo
254a0 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75  w, more than dou
254b0 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a  ble the speed.**
254c0 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54   of large INSERT
254d0 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20   operations and 
254e0 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70  quadruple the sp
254f0 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c  eed of large DEL
25500 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ETEs..**.** When
25510 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
25520 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65   called, set the
25530 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
25540 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a  flag to true..**
25550 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
25560 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  s to sqlite3Page
25570 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
25580 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67  for the same pag
25590 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61  e.** will therea
255a0 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e  fter be ignored.
255b0 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
255c0 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70  ary to avoid a p
255d0 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20  roblem.** where 
255e0 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61  a page with data
255f0 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
25600 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
25610 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20   one part of.** 
25620 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  a transaction th
25630 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  en removed from 
25640 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
25650 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74  ing a later part
25660 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20  .** of the same 
25670 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
25680 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20  reused for some 
25690 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20  other purpose.  
256a0 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69  When it.** is fi
256b0 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65  rst added to the
256c0 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20   freelist, this 
256d0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
256e0 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c  d.  When reused,
256f0 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 50  .** the sqlite3P
25700 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
25710 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  () routine is ca
25720 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61 75  lled.  But becau
25730 73 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  se the.** page c
25740 6f 6e 74 61 69 6e 73 20 63 72 69 74 69 63 61 6c  ontains critical
25750 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20   data, we still 
25760 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65 20  need to be sure 
25770 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65  it gets.** rolle
25780 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20  d back in spite 
25790 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  of the sqlite3Pa
257a0 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
257b0 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  ) call..*/.void 
257c0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
257d0 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
257e0 62 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20  bPage){.  PgHdr 
257f0 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
25800 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
25810 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
25820 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65    if( MEMDB ) re
25830 74 75 72 6e 3b 0a 20 20 70 61 67 65 72 45 6e 74  turn;.  pagerEnt
25840 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  er(pPager);.  pP
25850 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
25860 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67  k = 1;.  if( pPg
25870 2d 3e 64 69 72 74 79 20 26 26 20 21 70 50 61 67  ->dirty && !pPag
25880 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
25890 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
258a0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
258b0 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20  R_SHARED );.    
258c0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
258d0 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67  ze==(int)pPg->pg
258e0 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72  no && pPager->or
258f0 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d  igDbSize<pPager-
25900 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  >dbSize ){.     
25910 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
25920 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  s is the last pa
25930 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61  ge in the file a
25940 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
25950 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64  grown.      ** d
25960 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uring the curren
25970 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  t transaction, t
25980 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20  hen do NOT mark 
25990 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
259a0 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e  n..      ** When
259b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
259c0 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73  le grows, we mus
259d0 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  t make sure that
259e0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20   the last page. 
259f0 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69       ** gets wri
25a00 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e  tten at least on
25a10 63 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64  ce so that the d
25a20 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  isk file will be
25a30 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20   the correct.   
25a40 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79     ** size. If y
25a50 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  ou do not write 
25a60 74 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68  this page and th
25a70 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
25a80 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  le.      ** on t
25a90 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20  he disk ends up 
25aa0 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c  being too small,
25ab0 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74   that can lead t
25ac0 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  o database.     
25ad0 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64   ** corruption d
25ae0 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74  uring the next t
25af0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
25b00 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    */.    }else{.
25b10 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
25b20 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61  3("DONT_WRITE pa
25b30 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
25b40 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
25b50 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
25b60 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45     IOTRACE(("CLE
25b70 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  AN %p %d\n", pPa
25b80 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
25b90 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
25ba0 28 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51  (pPg);.#ifdef SQ
25bb0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
25bc0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65  .      pPg->page
25bd0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
25be0 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
25bf0 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  if.    }.  }.  p
25c00 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
25c10 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  );.}../*.** A ca
25c20 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
25c30 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
25c40 65 72 20 74 68 61 74 20 69 66 20 61 20 72 6f 6c  er that if a rol
25c50 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a  lback occurs,.**
25c60 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
25c70 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20  sary to restore 
25c80 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65 20  the data on the 
25c90 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68 69  given page.  Thi
25ca0 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  s.** means that 
25cb0 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e  the pager does n
25cc0 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f 72  ot have to recor
25cd0 64 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  d the given page
25ce0 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62   in the.** rollb
25cf0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ack journal..**.
25d00 2a 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f  ** If we have no
25d10 74 20 79 65 74 20 61 63 74 75 61 6c 6c 79 20 72  t yet actually r
25d20 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
25d30 6f 66 20 74 68 69 73 20 70 61 67 65 20 28 69 66  of this page (if
25d40 0a 2a 2a 20 74 68 65 20 50 67 48 64 72 2e 6e 65  .** the PgHdr.ne
25d50 65 64 52 65 61 64 20 66 6c 61 67 20 69 73 20 73  edRead flag is s
25d60 65 74 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f  et) then this ro
25d70 75 74 69 6e 65 20 61 63 74 73 20 61 73 20 61 20  utine acts as a 
25d80 70 72 6f 6d 69 73 65 0a 2a 2a 20 74 68 61 74 20  promise.** that 
25d90 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 6e 65  we will never ne
25da0 65 64 20 74 6f 20 72 65 61 64 20 74 68 65 20 70  ed to read the p
25db0 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74  age content in t
25dc0 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 20 73 6f  he future..** so
25dd0 20 74 68 65 20 6e 65 65 64 52 65 61 64 20 66 6c   the needRead fl
25de0 61 67 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65  ag can be cleare
25df0 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  d at this point.
25e00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25e10 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
25e20 6b 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  k(DbPage *pPg){.
25e30 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
25e40 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
25e50 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
25e60 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
25e70 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
25e80 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
25e90 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f  ..  /* If the jo
25ea0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
25eb0 74 20 6f 70 65 6e 2c 20 6f 72 20 44 6f 6e 74 57  t open, or DontW
25ec0 72 69 74 65 28 29 20 68 61 73 20 62 65 65 6e 20  rite() has been 
25ed0 63 61 6c 6c 65 64 20 6f 6e 0a 20 20 2a 2a 20 74  called on.  ** t
25ee0 68 69 73 20 70 61 67 65 20 28 44 6f 6e 74 57 72  his page (DontWr
25ef0 69 74 65 28 29 20 73 65 74 73 20 74 68 65 20 61  ite() sets the a
25f00 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
25f10 61 67 29 2c 20 74 68 65 6e 20 74 68 69 73 0a 20  ag), then this. 
25f20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20   ** function is 
25f30 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
25f40 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
25f50 6e 61 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 70 50  nalOpen==0 || pP
25f60 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
25f70 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77  k || pPager->alw
25f80 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20  aysRollback ){. 
25f90 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50     pagerLeave(pP
25fa0 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
25fb0 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
25fc0 20 21 4d 45 4d 44 42 20 29 3b 20 20 20 20 2f 2a   !MEMDB );    /*
25fd0 20 46 6f 72 20 61 20 6d 65 6d 64 62 2c 20 70 50   For a memdb, pP
25fe0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
25ff0 6e 20 69 73 20 61 6c 77 61 79 73 20 30 20 2a 2f  n is always 0 */
26000 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
26010 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
26020 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  if( pPg->inJourn
26030 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
26040 70 67 6e 6f 20 3e 20 70 50 61 67 65 72 2d 3e 6f  pgno > pPager->o
26050 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
26060 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
26070 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 53 45 43  dif..  /* If SEC
26080 55 52 45 5f 44 45 4c 45 54 45 20 69 73 20 64 69  URE_DELETE is di
26090 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  sabled, then the
260a0 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61  re is no way tha
260b0 74 20 74 68 69 73 0a 20 20 2a 2a 20 72 6f 75 74  t this.  ** rout
260c0 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  ine can be calle
260d0 64 20 6f 6e 20 61 20 70 61 67 65 20 66 6f 72 20  d on a page for 
260e0 77 68 69 63 68 20 73 71 6c 69 74 65 33 50 61 67  which sqlite3Pag
260f0 65 72 44 6f 6e 74 57 72 69 74 65 28 29 0a 20 20  erDontWrite().  
26100 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  ** has not been 
26110 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
26120 64 20 64 75 72 69 6e 67 20 74 68 65 20 73 61 6d  d during the sam
26130 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
26140 20 2a 2a 20 41 6e 64 20 69 66 20 44 6f 6e 74 57   ** And if DontW
26150 72 69 74 65 28 29 20 68 61 73 20 70 72 65 76 69  rite() has previ
26160 6f 75 73 6c 79 20 62 65 65 6e 20 63 61 6c 6c 65  ously been calle
26170 64 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  d, the following
26180 0a 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  .  ** conditions
26190 20 6d 75 73 74 20 62 65 20 6d 65 74 2e 0a 20 20   must be met..  
261a0 2a 2a 0a 20 20 2a 2a 20 28 4c 61 74 65 72 3a 29  **.  ** (Later:)
261b0 20 20 4e 6f 74 20 74 72 75 65 2e 20 20 49 66 20    Not true.  If 
261c0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
261d0 63 6f 72 72 75 70 74 65 64 20 62 79 20 68 61 76  corrupted by hav
261e0 69 6e 67 20 64 75 70 6c 69 63 61 74 65 0a 20 20  ing duplicate.  
261f0 2a 2a 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  ** pages on the 
26200 66 72 65 65 6c 69 73 74 20 28 65 78 3a 20 63 6f  freelist (ex: co
26210 72 72 75 70 74 39 2e 74 65 73 74 29 20 74 68 65  rrupt9.test) the
26220 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
26230 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65  is not.  ** nece
26240 73 73 61 72 69 6c 79 20 74 72 75 65 3a 0a 20 20  ssarily true:.  
26250 2a 2f 0a 20 20 2f 2a 20 61 73 73 65 72 74 28 20  */.  /* assert( 
26260 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
26270 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
26280 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
26290 67 44 62 53 69 7a 65 20 29 3b 20 2a 2f 0a 0a 20  gDbSize ); */.. 
262a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
262b0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >pInJournal!=0 )
262c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ;.  sqlite3Bitve
262d0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
262e0 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
262f0 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 69 6e 4a 6f  no);.  pPg->inJo
26300 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 70 50 67  urnal = 1;.  pPg
26310 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a  ->needRead = 0;.
26320 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
26330 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61  mtInUse ){.    a
26340 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
26350 74 6d 74 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  tmtSize >= pPage
26360 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
26370 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
26380 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
26390 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  nStmt, pPg->pgno
263a0 29 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54 52  );.  }.  PAGERTR
263b0 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42  ACE3("DONT_ROLLB
263c0 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25  ACK page %d of %
263d0 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
263e0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
263f0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 47  );.  IOTRACE(("G
26400 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c  ARBAGE %p %d\n",
26410 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
26420 6e 6f 29 29 0a 20 20 70 61 67 65 72 4c 65 61 76  no)).  pagerLeav
26430 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f  e(pPager);.}.../
26440 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26450 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
26460 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74  ncrement the dat
26470 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
26480 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74  e-counter,.** st
26490 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20  ored at byte 24 
264a0 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
264b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
264c0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
264d0 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20  gecounter(Pager 
264e0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44  *pPager, int isD
264f0 69 72 65 63 74 29 7b 0a 20 20 50 67 48 64 72 20  irect){.  PgHdr 
26500 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63  *pPgHdr;.  u32 c
26510 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20  hange_counter;. 
26520 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
26530 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  _OK;..  if( !pPa
26540 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
26550 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  Done ){.    /* O
26560 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68  pen page 1 of th
26570 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69  e file for writi
26580 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ng. */.    rc = 
26590 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
265a0 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48  pPager, 1, &pPgH
265b0 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
265c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
265d0 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 69 66 28  urn rc;..    if(
265e0 20 21 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20   !isDirect ){.  
265f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26600 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64  PagerWrite(pPgHd
26610 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
26620 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26630 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
26640 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
26650 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
26660 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
26670 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
26680 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
26690 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
266a0 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
266b0 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68  te 24. */.    ch
266c0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73  ange_counter = s
266d0 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28  qlite3Get4byte((
266e0 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69  u8*)pPager->dbFi
266f0 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 63 68 61  leVers);.    cha
26700 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
26710 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
26720 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
26730 54 41 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20  TA(pPgHdr))+24, 
26740 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
26750 0a 0a 20 20 20 20 69 66 28 20 69 73 44 69 72 65  ..    if( isDire
26760 63 74 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64  ct && pPager->fd
26770 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
26780 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
26790 7a 42 75 66 20 3d 20 50 47 48 44 52 5f 54 4f 5f  zBuf = PGHDR_TO_
267a0 44 41 54 41 28 70 50 67 48 64 72 29 3b 0a 20 20  DATA(pPgHdr);.  
267b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
267c0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
267d0 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72  fd, zBuf, pPager
267e0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a  ->pageSize, 0);.
267f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
26800 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
26810 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20  eference. */.   
26820 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
26830 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ef(pPgHdr);.    
26840 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
26850 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d  untDone = 1;.  }
26860 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26870 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
26880 70 61 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69  pager file to di
26890 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
268a0 65 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65  e3PagerSync(Page
268b0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
268c0 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74  t rc;.  pagerEnt
268d0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63  er(pPager);.  rc
268e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
268f0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
26900 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
26910 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
26920 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
26930 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
26940 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
26950 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67  file for the pag
26960 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74  er pPager. zMast
26970 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  er points to the
26980 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61   name.** of a ma
26990 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
269a0 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
269b0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
269c0 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20  e individual.** 
269d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d  journal file. zM
269e0 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c  aster may be NUL
269f0 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65  L, which is inte
26a00 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61  rpreted as no ma
26a10 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
26a20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61  (a single databa
26a30 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
26a40 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
26a50 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ine ensures that
26a60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
26a70 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74  synced, all dirt
26a80 79 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a  y pages written.
26a90 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
26aa0 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  se file and the 
26ab0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79  database file sy
26ac0 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74  nced. The only t
26ad0 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d  hing that.** rem
26ae0 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ains to commit t
26af0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
26b00 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
26b10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
26b20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
26b30 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69  al file if speci
26b40 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  fied)..**.** Not
26b50 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65  e that if zMaste
26b60 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f  r==NULL, this do
26b70 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65  es not overwrite
26b80 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75   a previous valu
26b90 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61  e.** passed to a
26ba0 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  n sqlite3PagerCo
26bb0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
26bc0 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  all..**.** If pa
26bd0 72 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69  rameter nTrunc i
26be0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
26bf0 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
26c00 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a  is truncated to.
26c10 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20  ** nTrunc pages 
26c20 28 74 68 69 73 20 69 73 20 75 73 65 64 20 62 79  (this is used by
26c30 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
26c40 61 62 61 73 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 49  abases)..**.** I
26c50 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61  f the final para
26c60 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d  meter - noSync -
26c70 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
26c80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26c90 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f   itself.** is no
26ca0 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61  t synced. The ca
26cb0 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73  ller must call s
26cc0 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
26cd0 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a  ) directly to.**
26ce0 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
26cf0 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  se file before c
26d00 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61  alling CommitPha
26d10 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74  seTwo() to delet
26d20 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
26d30 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
26d40 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
26d50 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
26d60 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a  seOne(.  Pager *
26d70 70 50 61 67 65 72 2c 20 0a 20 20 63 6f 6e 73 74  pPager, .  const
26d80 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
26d90 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 2c 0a  .  Pgno nTrunc,.
26da0 20 20 69 6e 74 20 6e 6f 53 79 6e 63 0a 29 7b 0a    int noSync.){.
26db0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26dc0 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61  E_OK;..  if( pPa
26dd0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
26de0 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
26df0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
26e00 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 63 68 61 6e  .  /* If no chan
26e10 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61  ges have been ma
26e20 64 65 2c 20 77 65 20 63 61 6e 20 6c 65 61 76 65  de, we can leave
26e30 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
26e40 20 65 61 72 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69   early..  */.  i
26e50 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  f( pPager->dbMod
26e60 69 66 69 65 64 3d 3d 30 20 26 26 0a 20 20 20 20  ified==0 &&.    
26e70 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75      (pPager->jou
26e80 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
26e90 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
26ea0 54 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  TE ||.          
26eb0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
26ec0 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a 20 20 20  eMode!=0) ){.   
26ed0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
26ee0 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c  >dirtyCache==0 |
26ef0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
26f00 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  lOpen==0 );.    
26f10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26f20 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
26f30 41 43 45 34 28 22 44 41 54 41 42 41 53 45 20 53  ACE4("DATABASE S
26f40 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61  YNC: File=%s zMa
26f50 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25  ster=%s nTrunc=%
26f60 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61  d\n", .      pPa
26f70 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
26f80 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29  zMaster, nTrunc)
26f90 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
26fa0 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66  Pager);..  /* If
26fb0 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
26fc0 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20  emory db, or no 
26fd0 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
26fe0 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74  written to, or t
26ff0 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
27000 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
27010 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  en called, it is
27020 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
27030 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
27040 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te!=PAGER_SYNCED
27050 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50   && !MEMDB && pP
27060 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
27070 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
27080 50 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg;..#ifdef SQLI
27090 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
270a0 5f 57 52 49 54 45 0a 20 20 20 20 2f 2a 20 54 68  _WRITE.    /* Th
270b0 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
270c0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
270d0 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20 6f  be used if all o
270e0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c  f the.    ** fol
270f0 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
27100 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
27110 20 20 2b 20 54 68 65 20 66 69 6c 65 2d 73 79 73    + The file-sys
27120 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65  tem supports the
27130 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72   atomic-write pr
27140 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20 2a  operty for.    *
27150 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66  *      blocks of
27160 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c   size page-size,
27170 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b   and.    **    +
27180 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20   This commit is 
27190 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75  not part of a mu
271a0 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
271b0 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  tion, and.    **
271c0 20 20 20 20 2b 20 45 78 61 63 74 6c 79 20 6f 6e      + Exactly on
271d0 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
271e0 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f  modified and sto
271f0 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
27200 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
27210 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74     ** If the opt
27220 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
27230 20 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20   used, then the 
27240 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
27250 6c 20 6e 65 76 65 72 0a 20 20 20 20 2a 2a 20 62  l never.    ** b
27260 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68  e created for th
27270 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
27280 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75      */.    int u
27290 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 3d 20  seAtomicWrite = 
272a0 28 0a 20 20 20 20 20 20 20 20 21 7a 4d 61 73 74  (.        !zMast
272b0 65 72 20 26 26 20 0a 20 20 20 20 20 20 20 20 70  er && .        p
272c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
272d0 65 6e 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  en &&.        pP
272e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
272f0 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  ==jrnlBufferSize
27300 28 70 50 61 67 65 72 29 20 26 26 20 0a 20 20 20  (pPager) && .   
27310 20 20 20 20 20 6e 54 72 75 6e 63 3d 3d 30 20 26       nTrunc==0 &
27320 26 20 0a 20 20 20 20 20 20 20 20 28 30 3d 3d 70  & .        (0==p
27330 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 7c 7c  Pager->pDirty ||
27340 20 30 3d 3d 70 50 61 67 65 72 2d 3e 70 44 69 72   0==pPager->pDir
27350 74 79 2d 3e 70 44 69 72 74 79 29 0a 20 20 20 20  ty->pDirty).    
27360 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27370 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
27380 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  en || pPager->jo
27390 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
273a0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
273b0 20 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65 41   );.    if( useA
273c0 74 6f 6d 69 63 57 72 69 74 65 20 29 7b 0a 20 20  tomicWrite ){.  
273d0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
273e0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20  e nRec field in 
273f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27400 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f  . */.      int o
27410 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
27420 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a  journalHdr + siz
27430 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
27440 63 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  c);.      assert
27450 28 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 31  (pPager->nRec==1
27460 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  );.      rc = wr
27470 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
27480 2d 3e 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70  ->jfd, offset, p
27490 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20  Pager->nRec);.. 
274a0 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
274b0 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67  he db file chang
274c0 65 20 63 6f 75 6e 74 65 72 2e 20 54 68 65 20 66  e counter. The f
274d0 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69  ollowing call wi
274e0 6c 6c 20 6d 6f 64 69 66 79 0a 20 20 20 20 20 20  ll modify.      
274f0 2a 2a 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  ** the in-memory
27500 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
27510 6f 66 20 70 61 67 65 20 31 20 74 6f 20 69 6e 63  of page 1 to inc
27520 6c 75 64 65 20 74 68 65 20 75 70 64 61 74 65 64  lude the updated
27530 0a 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65  .      ** change
27540 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65   counter and the
27550 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20 64  n write page 1 d
27560 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64  irectly to the d
27570 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
27580 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f   file. Because o
27590 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  f the atomic-wri
275a0 74 65 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  te property of t
275b0 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73  he host file-sys
275c0 74 65 6d 2c 20 0a 20 20 20 20 20 20 2a 2a 20 74  tem, .      ** t
275d0 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20  his is safe..   
275e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
275f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27600 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
27610 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
27620 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31  ounter(pPager, 1
27630 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
27640 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
27650 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43   sqlite3JournalC
27660 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  reate(pPager->jf
27670 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  d);.    }..    i
27680 66 28 20 21 75 73 65 41 74 6f 6d 69 63 57 72 69  f( !useAtomicWri
27690 74 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  te && rc==SQLITE
276a0 5f 4f 4b 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20  _OK ).#endif..  
276b0 20 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72    /* If a master
276c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
276d0 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  me has already b
276e0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
276f0 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  he.    ** journa
27700 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20  l file, then no 
27710 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64  sync is required
27720 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77  . This happens w
27730 68 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a  hen it is.    **
27740 20 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74   written, then t
27750 68 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73  he process fails
27760 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
27770 20 61 20 52 45 53 45 52 56 45 44 20 74 6f 20 61   a RESERVED to a
27780 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
27790 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78  VE lock. The nex
277a0 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65  t time the proce
277b0 73 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d  ss tries to comm
277c0 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  it the.    ** tr
277d0 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d  ansaction the m-
277e0 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65  j name will have
277f0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
27800 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  itten..    */.  
27810 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73    if( !pPager->s
27820 65 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  etMaster ){.    
27830 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
27840 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
27850 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
27860 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27870 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
27880 65 78 69 74 3b 0a 20 20 20 20 20 20 69 66 28 20  exit;.      if( 
27890 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
278a0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
278b0 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 23 69  ALMODE_OFF ){.#i
278c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
278d0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
278e0 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21       if( nTrunc!
278f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
27900 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73  /* If this trans
27910 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20  action has made 
27920 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61  the database sma
27930 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70  ller, then all p
27940 61 67 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ages.          *
27950 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65  * being discarde
27960 64 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74  d by the truncat
27970 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74  ion must be writ
27980 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
27990 61 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  al.          ** 
279a0 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  file..          
279b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  */.          Pgn
279c0 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69  o i;.          i
279d0 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52  nt iSkip = PAGER
279e0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
279f0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
27a00 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d   i=nTrunc+1; i<=
27a10 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
27a20 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20  ze; i++ ){.     
27a30 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69         if( !sqli
27a40 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
27a50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
27a60 2c 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70  , i) && i!=iSkip
27a70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27a80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
27a90 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69  gerGet(pPager, i
27aa0 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20  , &pPg);.       
27ab0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
27ac0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
27ad0 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
27ae0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
27af0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
27b00 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
27b10 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
27b20 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
27b30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
27b40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
27b50 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
27b60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27b70 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 20        } .       
27b80 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
27b90 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74    rc = writeMast
27ba0 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
27bb0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
27bc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
27bd0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
27be0 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  c_exit;.        
27bf0 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
27c00 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
27c10 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
27c20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
27c30 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
27c40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27c50 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
27c60 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
27c70 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
27c80 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
27c90 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72  cate(pPager, nTr
27ca0 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  unc);.      if( 
27cb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
27cc0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
27cd0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
27ce0 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64    /* Write all d
27cf0 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68  irty pages to th
27d00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
27d10 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  */.    pPg = pag
27d20 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
27d30 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a  _pages(pPager);.
27d40 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
27d50 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
27d60 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
27d70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27d80 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
27d90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
27da0 4b 45 44 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  KED );.      /* 
27db0 54 68 65 20 65 72 72 6f 72 20 6d 69 67 68 74 20  The error might 
27dc0 68 61 76 65 20 6c 65 66 74 20 74 68 65 20 64 69  have left the di
27dd0 72 74 79 20 6c 69 73 74 20 61 6c 6c 20 66 6f 75  rty list all fou
27de0 6c 65 64 20 75 70 20 68 65 72 65 2c 0a 20 20 20  led up here,.   
27df0 20 20 20 2a 2a 20 62 75 74 20 74 68 61 74 20 64     ** but that d
27e00 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 62  oes not matter b
27e10 65 63 61 75 73 65 20 69 66 20 74 68 65 20 69 66  ecause if the if
27e20 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74 20   the dirty list 
27e30 64 69 64 0a 20 20 20 20 20 20 2a 2a 20 67 65 74  did.      ** get
27e40 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e   corrupted, then
27e50 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
27e60 20 77 69 6c 6c 20 72 6f 6c 6c 20 62 61 63 6b 20   will roll back 
27e70 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 64 69 73  and.      ** dis
27e80 63 61 72 64 20 74 68 65 20 64 69 72 74 79 20 6c  card the dirty l
27e90 69 73 74 2e 20 20 54 68 65 72 65 20 69 73 20 61  ist.  There is a
27ea0 6e 20 61 73 73 65 72 74 20 69 6e 0a 20 20 20 20  n assert in.    
27eb0 20 20 2a 2a 20 70 61 67 65 72 5f 67 65 74 5f 61    ** pager_get_a
27ec0 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 29  ll_dirty_pages()
27ed0 20 74 68 61 74 20 76 65 72 69 66 69 65 73 20 74   that verifies t
27ee0 68 61 74 20 6e 6f 20 61 74 74 65 6d 70 74 0a 20  hat no attempt. 
27ef0 20 20 20 20 20 2a 2a 20 69 73 20 6d 61 64 65 20       ** is made 
27f00 74 6f 20 75 73 65 20 61 6e 20 69 6e 76 61 6c 69  to use an invali
27f10 64 20 64 69 72 74 79 20 6c 69 73 74 2e 0a 20 20  d dirty list..  
27f20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74      */.      got
27f30 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
27f40 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
27f50 44 69 72 74 79 20 3d 20 30 3b 0a 0a 20 20 20 20  Dirty = 0;..    
27f60 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  /* Sync the data
27f70 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
27f80 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
27f90 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63  oSync && !noSync
27fa0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
27fb0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
27fc0 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
27fd0 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
27fe0 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
27ff0 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20  ("DBSYNC %p\n", 
28000 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50  pPager))..    pP
28010 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
28020 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65  GER_SYNCED;.  }e
28030 6c 73 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26  lse if( MEMDB &&
28040 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
28050 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
28060 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67  gerTruncate(pPag
28070 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d  er, nTrunc);.  }
28080 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 69  ..sync_exit:.  i
28090 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
280a0 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20  ERR_BLOCKED ){. 
280b0 20 20 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72     /* pager_incr
280c0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
280d0 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20   may attempt to 
280e0 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73  obtain an exclus
280f0 69 76 65 0a 20 20 20 20 20 2a 20 6c 6f 63 6b 20  ive.     * lock 
28100 74 6f 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63  to spill the cac
28110 68 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4f  he and return IO
28120 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74  ERR_BLOCKED. But
28130 20 73 69 6e 63 65 20 0a 20 20 20 20 20 2a 20 74   since .     * t
28140 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
28150 65 20 74 68 65 20 63 61 63 68 65 20 69 73 20 69  e the cache is i
28160 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74 20  nconsistent, it 
28170 69 73 0a 20 20 20 20 20 2a 20 62 65 74 74 65 72  is.     * better
28180 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54   to return SQLIT
28190 45 5f 42 55 53 59 2e 0a 20 20 20 20 20 2a 2f 0a  E_BUSY..     */.
281a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
281b0 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 61 67 65  BUSY;.  }.  page
281c0 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
281d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
281e0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c  ./*.** Commit al
281f0 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  l changes to the
28200 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65   database and re
28210 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
28220 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
28230 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20  he commit fails 
28240 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20  for any reason, 
28250 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d  a rollback attem
28260 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e  pt is made.** an
28270 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
28280 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  is returned.  If
28290 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b   the commit work
282a0 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  ed, SQLITE_OK.**
282b0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
282c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
282d0 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
282e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
282f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
28300 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70  r *pPg;..  if( p
28310 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
28320 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
28330 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
28340 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
28350 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
28360 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
28370 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
28380 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
28390 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30  r->dbModified==0
283a0 20 26 26 0a 20 20 20 20 20 20 20 20 28 70 50 61   &&.        (pPa
283b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
283c0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
283d0 4f 44 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20 20  ODE_DELETE ||.  
283e0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
283f0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d 30  exclusiveMode!=0
28400 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
28410 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
28420 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  che==0 || pPager
28430 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
28440 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
28450 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
28460 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
28470 72 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  r);.  PAGERTRACE
28480 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  2("COMMIT %d\n",
28490 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
284a0 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
284b0 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
284c0 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
284d0 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
284e0 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b     while( pPg ){
284f0 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
28500 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
28510 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
28520 67 65 72 29 3b 0a 20 20 20 20 20 20 63 6c 65 61  ger);.      clea
28530 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b  rHistory(pHist);
28540 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
28550 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
28560 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
28570 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e  .      pHist->in
28580 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
28590 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
285a0 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e  0;.      pHist->
285b0 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73  pPrevStmt = pHis
285c0 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  t->pNextStmt = 0
285d0 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50  ;.      pPg = pP
285e0 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  g->pDirty;.    }
285f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
28600 72 74 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  rty = 0;.#ifndef
28610 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28   NDEBUG.    for(
28620 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
28630 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
28640 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
28650 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
28660 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
28670 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
28680 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
28690 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
286a0 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ck );.      asse
286b0 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69  rt( !pHist->pOri
286c0 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  g );.      asser
286d0 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74  t( !pHist->pStmt
286e0 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
286f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
28700 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  mt = 0;.    pPag
28710 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
28720 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 70 61  R_SHARED;.    pa
28730 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
28740 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
28750 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
28760 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
28770 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate==PAGER_SYNCE
28780 44 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 69  D || !pPager->di
28790 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20 72 63  rtyCache );.  rc
287a0 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
287b0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
287c0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
287d0 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  er);.  rc = page
287e0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
287f0 72 63 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  rc);.  pagerLeav
28800 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
28810 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28820 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   Rollback all ch
28830 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61  anges.  The data
28840 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20  base falls back 
28850 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  to PAGER_SHARED 
28860 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d  mode..** All in-
28870 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
28880 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65  es revert to the
28890 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  ir original data
288a0 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68   contents..** Th
288b0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c  e journal is del
288c0 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  eted..**.** This
288d0 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20   routine cannot 
288e0 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65  fail unless some
288f0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
28900 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a  s not following.
28910 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c  ** the correct l
28920 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  ocking protocol 
28930 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  or unless some o
28940 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
28950 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68  is writing trash
28960 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
28970 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43  l file (SQLITE_C
28980 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e  ORRUPT) or.** un
28990 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c  less a prior mal
289a0 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51  loc() failed (SQ
289b0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70  LITE_NOMEM).  Ap
289c0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a  propriate error.
289d0 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74  ** codes are ret
289e0 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68  urned for all th
289f0 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20  ese occasions.  
28a00 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51  Otherwise,.** SQ
28a10 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
28a20 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
28a30 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
28a40 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
28a50 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 41 47  .  int rc;.  PAG
28a60 45 52 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41  ERTRACE2("ROLLBA
28a70 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  CK %d\n", PAGERI
28a80 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
28a90 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50  ( MEMDB ){.    P
28aa0 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72  gHdr *p;.    for
28ab0 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  (p=pPager->pAll;
28ac0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c   p; p=p->pNextAl
28ad0 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74  l){.      PgHist
28ae0 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20  ory *pHist;.    
28af0 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c    assert( !p->al
28b00 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
28b10 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69        if( !p->di
28b20 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rty ){.        a
28b30 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74  ssert( !((PgHist
28b40 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48  ory *)PGHDR_TO_H
28b50 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d  IST(p, pPager))-
28b60 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
28b70 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48    assert( !((PgH
28b80 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54  istory *)PGHDR_T
28b90 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
28ba0 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  ))->pStmt );.   
28bb0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
28bc0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48       }..      pH
28bd0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
28be0 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a  IST(p, pPager);.
28bf0 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
28c00 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  >pOrig ){.      
28c10 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
28c20 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73 74  O_DATA(p), pHist
28c30 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d  ->pOrig, pPager-
28c40 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
28c50 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
28c60 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25  "ROLLBACK-PAGE %
28c70 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70  d of %d\n", p->p
28c80 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
28c90 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ger));.      }el
28ca0 73 65 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45  se{.        PAGE
28cb0 52 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64  RTRACE3("PAGE %d
28cc0 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c   is clean on %d\
28cd0 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
28ce0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
28cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65       }.      cle
28d00 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29  arHistory(pHist)
28d10 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79  ;.      p->dirty
28d20 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
28d30 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
28d40 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d      pHist->inStm
28d50 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69  t = 0;.      pHi
28d60 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  st->pPrevStmt = 
28d70 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74  pHist->pNextStmt
28d80 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
28d90 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
28da0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
28db0 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
28dc0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
28dd0 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
28de0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
28df0 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70  Dirty = 0;.    p
28e00 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
28e10 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
28e20 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f  Size = pPager->o
28e30 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 70  rigDbSize;.    p
28e40 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61  ager_truncate_ca
28e50 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  che(pPager);.   
28e60 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
28e70 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  se = 0;.    pPag
28e80 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
28e90 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
28ea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28eb0 20 20 7d 0a 0a 20 20 70 61 67 65 72 45 6e 74 65    }..  pagerEnte
28ec0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
28ed0 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43   !pPager->dirtyC
28ee0 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d  ache || !pPager-
28ef0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
28f00 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
28f10 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
28f20 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
28f30 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 70  etMaster);.    p
28f40 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
28f50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
28f60 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
28f70 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
28f80 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
28f90 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
28fa0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
28fb0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
28fc0 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
28fd0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
28fe0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
28ff0 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28  .    pagerLeave(
29000 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
29010 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
29020 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
29030 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
29040 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
29050 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
29060 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
29070 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
29080 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72  .    rc2 = pager
29090 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
290a0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
290b0 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 20  >setMaster);.   
290c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
290d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
290e0 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   rc2;.    }.  }e
290f0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
29100 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
29110 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 2f  ger, 0);.  }.  /
29120 2a 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50  * pager_reset(pP
29130 61 67 65 72 29 3b 20 2a 2f 0a 20 20 70 50 61 67  ager); */.  pPag
29140 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
29150 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
29160 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
29170 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20   a ROLLBACK, we 
29180 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72  can no longer tr
29190 75 73 74 20 74 68 65 20 70 61 67 65 72 0a 20 20  ust the pager.  
291a0 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c  ** cache. So cal
291b0 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20  l pager_error() 
291c0 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74  on the way out t
291d0 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72  o make any error
291e0 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e   .  ** persisten
291f0 74 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  t..  */.  rc = p
29200 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
29210 72 2c 20 72 63 29 3b 0a 20 20 70 61 67 65 72 4c  r, rc);.  pagerL
29220 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
29230 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29240 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
29250 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
29260 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
29270 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
29280 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
29290 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
292a0 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
292b0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
292c0 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
292d0 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  y(Pager *pPager)
292e0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
292f0 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a  r->readOnly;.}..
29300 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
29310 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
29320 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
29330 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
29340 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
29350 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
29360 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
29370 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64 65 66  >nRef;.}..#ifdef
29380 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
29390 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
293a0 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
293b0 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
293c0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73   only..*/.int *s
293d0 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73  qlite3PagerStats
293e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
293f0 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b  .  static int a[
29400 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50  11];.  a[0] = pP
29410 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b  ager->nRef;.  a[
29420 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61  1] = pPager->nPa
29430 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61  ge;.  a[2] = pPa
29440 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61  ger->mxPage;.  a
29450 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  [3] = pPager->db
29460 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70  Size;.  a[4] = p
29470 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20  Pager->state;.  
29480 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65  a[5] = pPager->e
29490 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d  rrCode;.  a[6] =
294a0 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20   pPager->nHit;. 
294b0 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[7] = pPager->
294c0 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20  nMiss;.  a[8] = 
294d0 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62  0;  /* Used to b
294e0 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20  e pPager->nOvfl 
294f0 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67  */.  a[9] = pPag
29500 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31  er->nRead;.  a[1
29510 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72  0] = pPager->nWr
29520 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b  ite;.  return a;
29530 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  .}.int sqlite3Pa
29540 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65 72  gerIsMemdb(Pager
29550 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
29560 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 23 65 6e  urn MEMDB;.}.#en
29570 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  dif../*.** Set t
29580 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c  he statement rol
29590 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a  lback point..**.
295a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
295b0 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
295c0 20 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61   with the transa
295d0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c  ction journal al
295e0 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20  ready.** open.  
295f0 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20  A new statement 
29600 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74  journal is creat
29610 65 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  ed that can be u
29620 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a  sed to rollback.
29630 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20  ** changes of a 
29640 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61  single SQL comma
29650 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67  nd within a larg
29660 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  er transaction..
29670 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
29680 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67  gerStmtBegin(Pag
29690 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
296a0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
296b0 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
296c0 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Use );.  assert(
296d0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
296e0 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
296f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
29700 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20  ->dbSize>=0 );. 
29710 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54   PAGERTRACE2("ST
29720 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20  MT-BEGIN %d\n", 
29730 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
29740 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
29750 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
29760 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20  tInUse = 1;.    
29770 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
29780 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
29790 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e;.    return SQ
297a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
297b0 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
297c0 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70  nalOpen ){.    p
297d0 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
297e0 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  pen = 1;.    ret
297f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
29800 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
29810 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
29820 20 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65   );.  pagerLeave
29830 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
29840 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53  rt( pPager->pInS
29850 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67  tmt==0 );.  pPag
29860 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 73 71  er->pInStmt = sq
29870 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
29880 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e(pPager->dbSize
29890 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  );.  pagerEnter(
298a0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
298b0 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d  Pager->pInStmt==
298c0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  0 ){.    /* sqli
298d0 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
298e0 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
298f0 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  K); */.    retur
29900 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
29910 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
29920 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72  mtJSize = pPager
29930 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
29940 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
29950 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
29960 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  e;.  pPager->stm
29970 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70  tHdrOff = 0;.  p
29980 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
29990 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
299a0 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61  Init;.  if( !pPa
299b0 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
299c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
299d0 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70  3PagerOpentemp(p
299e0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
299f0 74 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  tfd, SQLITE_OPEN
29a00 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  _SUBJOURNAL);.  
29a10 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
29a20 20 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69    goto stmt_begi
29a30 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  n_failed;.    }.
29a40 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
29a50 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50  Open = 1;.    pP
29a60 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d  ager->stmtNRec =
29a70 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
29a80 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b  ->stmtInUse = 1;
29a90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
29aa0 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69  _OK;. .stmt_begi
29ab0 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  n_failed:.  if( 
29ac0 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20  pPager->pInStmt 
29ad0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
29ae0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
29af0 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20  er->pInStmt);.  
29b00 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d    pPager->pInStm
29b10 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
29b20 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
29b30 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65  lite3PagerStmtBe
29b40 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
29b50 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
29b60 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
29b70 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  r);.  rc = pager
29b80 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72  StmtBegin(pPager
29b90 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
29ba0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
29bb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
29bc0 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e  ommit a statemen
29bd0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
29be0 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74  3PagerStmtCommit
29bf0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
29c00 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
29c10 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
29c20 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
29c30 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
29c40 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 50 41  , *pNext;.    PA
29c50 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d  GERTRACE2("STMT-
29c60 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41  COMMIT %d\n", PA
29c70 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
29c80 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
29c90 7b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  {.      /* sqlit
29ca0 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
29cb0 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a  ger->stfd, 0); *
29cc0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
29cd0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
29ce0 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20  ger->pInStmt);. 
29cf0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e       pPager->pIn
29d00 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Stmt = 0;.    }e
29d10 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  lse{.      for(p
29d20 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  Pg=pPager->pStmt
29d30 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
29d40 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
29d50 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
29d60 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
29d70 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
29d80 20 20 70 4e 65 78 74 20 3d 20 70 48 69 73 74 2d    pNext = pHist-
29d90 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20  >pNextStmt;.    
29da0 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
29db0 74 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20  t->inStmt );.   
29dc0 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74       pHist->inSt
29dd0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mt = 0;.        
29de0 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74  pHist->pPrevStmt
29df0 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53   = pHist->pNextS
29e00 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tmt = 0;.       
29e10 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
29e20 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
29e30 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
29e40 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
29e50 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  }.    }.    pPag
29e60 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
29e70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
29e80 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
29e90 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
29ea0 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
29eb0 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
29ec0 20 30 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65   0;.  pagerLeave
29ed0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
29ee0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
29ef0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
29f00 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
29f10 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
29f20 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67  StmtRollback(Pag
29f30 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
29f40 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e  nt rc;.  pagerEn
29f50 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
29f60 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
29f70 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 41 47 45  nUse ){.    PAGE
29f80 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f  RTRACE2("STMT-RO
29f90 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
29fa0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
29fb0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
29fc0 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
29fd0 67 3b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  g;.      PgHisto
29fe0 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20  ry *pHist;.     
29ff0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
2a000 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67  >pStmt; pPg; pPg
2a010 3d 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d  =pHist->pNextStm
2a020 74 29 7b 0a 20 20 20 20 20 20 20 20 70 48 69 73  t){.        pHis
2a030 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
2a040 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
2a050 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
2a060 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
2a070 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
2a080 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
2a090 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70   pHist->pStmt, p
2a0a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
2a0b0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2a0c0 74 65 33 50 61 67 65 46 72 65 65 28 70 48 69 73  te3PageFree(pHis
2a0d0 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
2a0e0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
2a0f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
2a100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2a110 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
2a120 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
2a130 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 74 72  ;.      pager_tr
2a140 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61  uncate_cache(pPa
2a150 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ger);.      rc =
2a160 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2a170 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2a180 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61  = pager_stmt_pla
2a190 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
2a1a0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2a1b0 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28  PagerStmtCommit(
2a1c0 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
2a1d0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2a1e0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
2a1f0 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
2a200 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 4c 65 61   = 0;.  pagerLea
2a210 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
2a220 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a230 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
2a240 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
2a250 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2a260 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
2a270 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
2a280 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
2a290 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
2a2a0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b  ager->zFilename;
2a2b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2a2c0 20 74 68 65 20 56 46 53 20 73 74 72 75 63 74 75   the VFS structu
2a2d0 72 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  re for the pager
2a2e0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74  ..*/.const sqlit
2a2f0 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50  e3_vfs *sqlite3P
2a300 61 67 65 72 56 66 73 28 50 61 67 65 72 20 2a 70  agerVfs(Pager *p
2a310 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2a320 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d   pPager->pVfs;.}
2a330 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2a340 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66  he file handle f
2a350 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
2a360 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a  file associated.
2a370 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ** with the page
2a380 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 72  r.  This might r
2a390 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
2a3a0 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f  e file has.** no
2a3b0 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
2a3c0 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69  d..*/.sqlite3_fi
2a3d0 6c 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  le *sqlite3Pager
2a3e0 46 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  File(Pager *pPag
2a3f0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
2a400 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a  ager->fd;.}../*.
2a410 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69  ** Return the di
2a420 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64  rectory of the d
2a430 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
2a440 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
2a450 69 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65  ite3PagerDirname
2a460 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2a470 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
2a480 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a  ->zDirectory;.}.
2a490 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2a4a0 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
2a4b0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2a4c0 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
2a4d0 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
2a4e0 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65  Journalname(Page
2a4f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
2a500 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  turn pPager->zJo
2a510 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urnal;.}../*.** 
2a520 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66  Return true if f
2a530 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65  sync() calls are
2a540 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68   disabled for th
2a550 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72  is pager.  Retur
2a560 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73  n FALSE.** if fs
2a570 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75  ync()s are execu
2a580 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f  ted normally..*/
2a590 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2a5a0 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  rNosync(Pager *p
2a5b0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2a5c0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b   pPager->noSync;
2a5d0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
2a5e0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a  E_HAS_CODEC./*.*
2a5f0 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20  * Set the codec 
2a600 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a  for this pager.*
2a610 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
2a620 67 65 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50  gerSetCodec(.  P
2a630 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20  ager *pPager,.  
2a640 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
2a650 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
2a660 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70  ,int),.  void *p
2a670 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50  CodecArg.){.  pP
2a680 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78  ager->xCodec = x
2a690 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d  Codec;.  pPager-
2a6a0 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f  >pCodecArg = pCo
2a6b0 64 65 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66  decArg;.}.#endif
2a6c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2a6d0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2a6e0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
2a6f0 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61  page pPg to loca
2a700 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65  tion pgno in the
2a710 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
2a720 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65  re must be no re
2a730 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
2a740 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20  page previously 
2a750 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67  located at.** pg
2a760 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63 61 6c  no (which we cal
2a770 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68  l pPgOld) though
2a780 20 74 68 61 74 20 70 61 67 65 20 69 73 20 61 6c   that page is al
2a790 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69  lowed to be.** i
2a7a0 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74 68 65  n cache.  If the
2a7b0 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 20 6c   page previous l
2a7c0 6f 63 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69  ocated at pgno i
2a7d0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
2a7e0 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
2a7f0 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20   journal, it is 
2a800 6e 6f 74 20 70 75 74 20 74 68 65 72 65 20 62 79  not put there by
2a810 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
2a820 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ..**.** Referenc
2a830 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
2a840 50 67 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e  Pg remain valid.
2a850 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a   Updating any.**
2a860 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63   meta-data assoc
2a870 69 61 74 65 64 20 77 69 74 68 20 70 50 67 20 28  iated with pPg (
2a880 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64  i.e. data stored
2a890 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62   in the nExtra b
2a8a0 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ytes.** allocate
2a8b0 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
2a8c0 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65   page) is the re
2a8d0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
2a8e0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
2a8f0 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * A transaction 
2a900 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77  must be active w
2a910 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2a920 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75   is called. It u
2a930 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71  sed to be.** req
2a940 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61  uired that a sta
2a950 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
2a960 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76  on was not activ
2a970 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74  e, but this rest
2a980 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  riction.** has b
2a990 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45  een removed (CRE
2a9a0 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20  ATE INDEX needs 
2a9b0 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77  to move a page w
2a9c0 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a  hen a statement.
2a9d0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
2a9e0 73 20 61 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a  s active)..**.**
2a9f0 20 49 66 20 74 68 65 20 66 6f 75 72 74 68 20 61   If the fourth a
2aa00 72 67 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69  rgument, isCommi
2aa10 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  t, is non-zero, 
2aa20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 69  then this page i
2aa30 73 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64  s being.** moved
2aa40 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 64 61   as part of a da
2aa50 74 61 62 61 73 65 20 72 65 6f 72 67 61 6e 69 7a  tabase reorganiz
2aa60 61 74 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72  ation just befor
2aa70 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
2aa80 6e 20 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20 63  n .** is being c
2aa90 6f 6d 6d 69 74 74 65 64 2e 20 49 6e 20 74 68 69  ommitted. In thi
2aaa0 73 20 63 61 73 65 2c 20 69 74 20 69 73 20 67 75  s case, it is gu
2aab0 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
2aac0 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
2aad0 0a 2a 2a 20 70 50 67 20 72 65 66 65 72 73 20 74  .** pPg refers t
2aae0 6f 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72  o will not be wr
2aaf0 69 74 74 65 6e 20 74 6f 20 61 67 61 69 6e 20 77  itten to again w
2ab00 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
2ab10 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  action..*/.int s
2ab20 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
2ab30 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
2ab40 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20  r, DbPage *pPg, 
2ab50 50 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69  Pgno pgno, int i
2ab60 73 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64  sCommit){.  PgHd
2ab70 72 20 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54  r *pPgOld;  /* T
2ab80 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76  he page being ov
2ab90 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20  erwritten. */.  
2aba0 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65  int h;.  Pgno ne
2abb0 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a  edSyncPgno = 0;.
2abc0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
2abd0 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ager);.  assert(
2abe0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
2abf0 0a 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22  .  PAGERTRACE5("
2ac00 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20  MOVE %d page %d 
2ac10 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f  (needSync=%d) mo
2ac20 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20  ves to %d\n", . 
2ac30 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
2ac40 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
2ac50 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20   pPg->needSync, 
2ac60 70 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45  pgno);.  IOTRACE
2ac70 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64  (("MOVE %p %d %d
2ac80 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
2ac90 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a  ->pgno, pgno))..
2aca0 20 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74    pager_get_cont
2acb0 65 6e 74 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  ent(pPg);..  /* 
2acc0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  If the journal n
2acd0 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
2ace0 29 65 64 20 62 65 66 6f 72 65 20 70 61 67 65 20  )ed before page 
2acf0 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a 20 20  pPg->pgno can.  
2ad00 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ** be written to
2ad10 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e  , store pPg->pgn
2ad20 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61  o in local varia
2ad30 62 6c 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  ble needSyncPgno
2ad40 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
2ad50 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  he isCommit flag
2ad60 20 69 73 20 73 65 74 2c 20 74 68 65 72 65 20 69   is set, there i
2ad70 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d  s no need to rem
2ad80 65 6d 62 65 72 20 74 68 61 74 0a 20 20 2a 2a 20  ember that.  ** 
2ad90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64  the journal need
2ada0 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64  s to be sync()ed
2adb0 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65   before database
2adc0 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20   page pPg->pgno 
2add0 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 77 72 69  .  ** can be wri
2ade0 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c  tten to. The cal
2adf0 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
2ae00 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20  promised not to 
2ae10 77 72 69 74 65 20 74 6f 20 69 74 2e 0a 20 20 2a  write to it..  *
2ae20 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65  /.  if( pPg->nee
2ae30 64 53 79 6e 63 20 26 26 20 21 69 73 43 6f 6d 6d  dSync && !isComm
2ae40 69 74 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79  it ){.    needSy
2ae50 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  ncPgno = pPg->pg
2ae60 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  no;.    assert( 
2ae70 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
2ae80 7c 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67  | (int)pgno>pPag
2ae90 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
2aea0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2aeb0 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  g->dirty );.    
2aec0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2aed0 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a  needSync );.  }.
2aee0 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67  .  /* Unlink pPg
2aef0 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 2d 63   from its hash-c
2af00 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  hain */.  unlink
2af10 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
2af20 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66  , pPg);..  /* If
2af30 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
2af40 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20  ins a page with 
2af50 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f  page-number pgno
2af60 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a  , remove it.  **
2af70 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63   from its hash c
2af80 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74  hain. Also, if t
2af90 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
2afa0 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20  c was set for . 
2afb0 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65   ** page pgno be
2afc0 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20  fore the 'move' 
2afd0 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65  operation, it ne
2afe0 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e  eds to be retain
2aff0 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ed .  ** for the
2b000 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72   page moved ther
2b010 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e  e..  */.  pPg->n
2b020 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
2b030 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f  PgOld = pager_lo
2b040 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
2b050 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64  o);.  if( pPgOld
2b060 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2b070 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20  pPgOld->nRef==0 
2b080 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73  );.    unlinkHas
2b090 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
2b0a0 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65  PgOld);.    make
2b0b0 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20  Clean(pPgOld);. 
2b0c0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
2b0d0 20 3d 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53   = pPgOld->needS
2b0e0 79 6e 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ync;.  }else{.  
2b0f0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
2b100 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  = 0;.  }.  pPg->
2b110 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  inJournal = sqli
2b120 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
2b130 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
2b140 2c 20 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 43  , pgno);..  /* C
2b150 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e  hange the page n
2b160 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e  umber for pPg an
2b170 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f  d insert it into
2b180 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68   the new hash-ch
2b190 61 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ain. */.  assert
2b1a0 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70  ( pgno!=0 );.  p
2b1b0 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
2b1c0 0a 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70  .  h = pgno & (p
2b1d0 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b  Pager->nHash-1);
2b1e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
2b1f0 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61  Hash[h] ){.    a
2b200 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
2b210 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
2b220 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  sh==0 );.    pPa
2b230 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70  ger->aHash[h]->p
2b240 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
2b250 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
2b260 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
2b270 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65  Hash[h];.  pPage
2b280 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
2b290 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48  g;.  pPg->pPrevH
2b2a0 61 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65  ash = 0;..  make
2b2b0 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50  Dirty(pPg);.  pP
2b2c0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
2b2d0 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 1;.  pPager->
2b2e0 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
2b2f0 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50  .  if( needSyncP
2b300 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  gno ){.    /* If
2b310 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73   needSyncPgno is
2b320 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
2b330 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2b340 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20   needs to be .  
2b350 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65    ** sync()ed be
2b360 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
2b370 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61   written to data
2b380 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e  base file page n
2b390 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20  eedSyncPgno..   
2b3a0 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e   ** Currently, n
2b3b0 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  o such page exis
2b3c0 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ts in the page-c
2b3d0 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20  ache and the .  
2b3e0 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c    ** "is journal
2b3f0 65 64 22 20 62 69 74 76 65 63 20 66 6c 61 67 20  ed" bitvec flag 
2b400 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68  has been set. Th
2b410 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  is needs to be r
2b420 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20 2a  emedied by.    *
2b430 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70 61  * loading the pa
2b440 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
2b450 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74  r-cache and sett
2b460 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
2b470 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66  edSync .    ** f
2b480 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lag..    **.    
2b490 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d 70  ** If the attemp
2b4a0 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70 61  t to load the pa
2b4b0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
2b4c0 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28 64  -cache fails, (d
2b4d0 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d  ue.    ** to a m
2b4e0 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61  alloc() or IO fa
2b4f0 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74 68  ilure), clear th
2b500 65 20 62 69 74 20 69 6e 20 74 68 65 20 70 49 6e  e bit in the pIn
2b510 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a  Journal[].    **
2b520 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73   array. Otherwis
2b530 65 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  e, if the page i
2b540 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72 69  s loaded and wri
2b550 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20  tten again in.  
2b560 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61    ** this transa
2b570 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65  ction, it may be
2b580 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2b590 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
2b5a0 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20 69  fore.    ** it i
2b5b0 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  s synced into th
2b5c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
2b5d0 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61 79  This way, it may
2b5e0 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20 2a   end up in.    *
2b5f0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
2b600 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20 74 68  le twice, but th
2b610 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62  at is not a prob
2b620 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lem..    **.    
2b630 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61  ** The sqlite3Pa
2b640 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61  gerGet() call ma
2b650 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72  y cause the jour
2b660 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20  nal to sync. So 
2b670 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
2b680 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
2b690 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
2b6a0 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  too..    */.    
2b6b0 69 6e 74 20 72 63 3b 0a 20 20 20 20 50 67 48 64  int rc;.    PgHd
2b6c0 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61  r *pPgHdr;.    a
2b6d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2b6e0 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72  eedSync );.    r
2b6f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2b700 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64  Get(pPager, need
2b710 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64  SyncPgno, &pPgHd
2b720 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
2b730 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b740 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
2b750 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  InJournal && (in
2b760 74 29 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d  t)needSyncPgno<=
2b770 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
2b780 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ze ){.        sq
2b790 6c 69 74 65 33 42 69 74 76 65 63 43 6c 65 61 72  lite3BitvecClear
2b7a0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
2b7b0 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e  nal, needSyncPgn
2b7c0 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
2b7d0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
2b7e0 67 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ger);.      retu
2b7f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2b800 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
2b810 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64  c = 1;.    pPgHd
2b820 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
2b830 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a  .    pPgHdr->inJ
2b840 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
2b850 6d 61 6b 65 44 69 72 74 79 28 70 50 67 48 64 72  makeDirty(pPgHdr
2b860 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
2b870 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
2b880 3b 0a 20 20 7d 0a 0a 20 20 70 61 67 65 72 4c 65  ;.  }..  pagerLe
2b890 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
2b8a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2b8b0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
2b8c0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
2b8d0 72 20 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f  r to the data fo
2b8e0 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
2b8f0 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  page..*/.void *s
2b900 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
2b910 74 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ta(DbPage *pPg){
2b920 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f  .  return PGHDR_
2b930 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a  TO_DATA(pPg);.}.
2b940 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
2b950 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
2b960 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65  ager.nExtra byte
2b970 73 20 6f 66 20 22 65 78 74 72 61 22 20 73 70 61  s of "extra" spa
2b980 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  ce .** allocated
2b990 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
2b9a0 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
2b9b0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
2b9c0 50 61 67 65 72 47 65 74 45 78 74 72 61 28 44 62  PagerGetExtra(Db
2b9d0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
2b9e0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
2b9f0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74  g->pPager;.  ret
2ba00 75 72 6e 20 28 70 50 61 67 65 72 3f 50 47 48 44  urn (pPager?PGHD
2ba10 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
2ba20 70 50 61 67 65 72 29 3a 30 29 3b 0a 7d 0a 0a 2f  pPager):0);.}../
2ba30 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65  *.** Get/set the
2ba40 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f   locking-mode fo
2ba50 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61  r this pager. Pa
2ba60 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75  rameter eMode mu
2ba70 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20  st be one.** of 
2ba80 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2ba90 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c  E_QUERY, PAGER_L
2baa0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
2bab0 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c  L or .** PAGER_L
2bac0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2bad0 53 49 56 45 2e 20 49 66 20 74 68 65 20 70 61 72  SIVE. If the par
2bae0 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51  ameter is not _Q
2baf0 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  UERY, then.** th
2bb00 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69  e locking-mode i
2bb10 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
2bb20 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  ue specified..**
2bb30 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
2bb40 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72   value is either
2bb50 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
2bb60 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20  DE_NORMAL or.** 
2bb70 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2bb80 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64  E_EXCLUSIVE, ind
2bb90 69 63 61 74 69 6e 67 20 74 68 65 20 63 75 72 72  icating the curr
2bba0 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70  ent (possibly up
2bbb0 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e  dated).** lockin
2bbc0 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  g-mode..*/.int s
2bbd0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69  qlite3PagerLocki
2bbe0 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50  ngMode(Pager *pP
2bbf0 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29  ager, int eMode)
2bc00 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  {.  assert( eMod
2bc10 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
2bc20 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20  MODE_QUERY.     
2bc30 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
2bc40 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2bc50 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  DE_NORMAL.      
2bc60 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
2bc70 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2bc80 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
2bc90 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
2bca0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
2bcb0 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  <0 );.  assert( 
2bcc0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2bcd0 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50  E_NORMAL>=0 && P
2bce0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2bcf0 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b  _EXCLUSIVE>=0 );
2bd00 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20  .  if( eMode>=0 
2bd10 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
2bd20 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67  File ){.    pPag
2bd30 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
2bd40 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20  e = eMode;.  }. 
2bd50 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61   return (int)pPa
2bd60 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
2bd70 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  de;.}../*.** Get
2bd80 2f 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  /set the journal
2bd90 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70  -mode for this p
2bda0 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20  ager. Parameter 
2bdb0 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
2bdc0 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4a 4f  e.** of PAGER_JO
2bdd0 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 2c  URNALMODE_QUERY,
2bde0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2bdf0 44 45 5f 44 45 4c 45 54 45 20 6f 72 20 0a 2a 2a  DE_DELETE or .**
2be00 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2be10 44 45 5f 50 45 52 53 49 53 54 2e 20 49 66 20 74  DE_PERSIST. If t
2be20 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
2be30 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e  not _QUERY, then
2be40 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  .** the journal-
2be50 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74  mode is set to t
2be60 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69  he value specifi
2be70 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ed..**.** The re
2be80 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
2be90 65 69 74 68 65 72 20 50 41 47 45 52 5f 4a 4f 55  either PAGER_JOU
2bea0 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
2beb0 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  or.** PAGER_JOUR
2bec0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2c  NALMODE_PERSIST,
2bed0 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20   indicating the 
2bee0 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c  current (possibl
2bef0 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6a 6f  y updated).** jo
2bf00 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  urnal-mode..*/.i
2bf10 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a  nt sqlite3PagerJ
2bf20 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72  ournalMode(Pager
2bf30 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d   *pPager, int eM
2bf40 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ode){.  assert( 
2bf50 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
2bf60 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20  RNALMODE_QUERY. 
2bf70 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
2bf80 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
2bf90 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20  ALMODE_DELETE.  
2bfa0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
2bfb0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
2bfc0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
2bfd0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
2bfe0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
2bff0 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 61  LMODE_OFF );.  a
2c000 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
2c010 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30  RNALMODE_QUERY<0
2c020 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
2c030 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2c040 44 45 4c 45 54 45 3e 3d 30 20 26 26 20 50 41 47  DELETE>=0 && PAG
2c050 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
2c060 45 52 53 49 53 54 3e 3d 30 20 29 3b 0a 20 20 69  ERSIST>=0 );.  i
2c070 66 28 20 65 4d 6f 64 65 3e 3d 30 20 29 7b 0a 20  f( eMode>=0 ){. 
2c080 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2c090 61 6c 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a  alMode = eMode;.
2c0a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
2c0b0 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t)pPager->journa
2c0c0 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  lMode;.}../*.** 
2c0d0 47 65 74 2f 73 65 74 20 74 68 65 20 73 69 7a 65  Get/set the size
2c0e0 2d 6c 69 6d 69 74 20 75 73 65 64 20 66 6f 72 20  -limit used for 
2c0f0 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
2c100 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 36 34  al files..*/.i64
2c110 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75   sqlite3PagerJou
2c120 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61  rnalSizeLimit(Pa
2c130 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 36 34  ger *pPager, i64
2c140 20 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28 20   iLimit){.  if( 
2c150 69 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20  iLimit>=-1 ){.  
2c160 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2c170 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69  lSizeLimit = iLi
2c180 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  mit;.  }.  retur
2c190 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  n pPager->journa
2c1a0 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 23  lSizeLimit;.}..#
2c1b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2c1c0 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a     OMIT_DISKIO */.