/ Hex Artifact Content
Login

Artifact 255c5d14ff489071021bf1374654836f2516abb3:


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 36 33  : pager.c,v 1.63
0350: 20 32 30 30 33 2f 30 31 2f 30 32 20 31 34 3a 34   2003/01/02 14:4
0360: 33 3a 35 37 20 64 72 68 20 45 78 70 20 24 0a 2a  3:57 drh Exp $.*
0370: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68  /.#include "os.h
0380: 22 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73  "         /* Mus
0390: 74 20 62 65 20 66 69 72 73 74 20 74 6f 20 65 6e  t be first to en
03a0: 61 62 6c 65 20 6c 61 72 67 65 20 66 69 6c 65 20  able large file 
03b0: 73 75 70 70 6f 72 74 20 2a 2f 0a 23 69 6e 63 6c  support */.#incl
03c0: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
03d0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67 65  ".#include "page
03e0: 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  r.h".#include <a
03f0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
0400: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
0410: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0420: 68 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73  he as a whole is
0430: 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f   always in one o
0440: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
0450: 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  ** states:.**.**
0460: 20 20 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b     SQLITE_UNLOCK
0470: 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20         The page 
0480: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72  cache is not cur
0490: 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f  rently reading o
04a0: 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  r .**           
04b0: 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74              writ
04c0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
04d0: 20 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73   file.  There is
04e0: 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   no.**          
04f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0500: 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  a held in memory
0510: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69  .  This is the i
0520: 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  nitial.**       
0530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0540: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53  state..**.**   S
0550: 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 20 20  QLITE_READLOCK  
0560: 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68     The page cach
0570: 65 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65  e is reading the
0580: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20   database..**   
0590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05a0: 20 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e      Writing is n
05b0: 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54  ot permitted.  T
05c0: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20  here can be.**  
05d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05e0: 20 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65       multiple re
05f0: 61 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20  aders accessing 
0600: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
0610: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0620: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
0630: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
0640: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45  ..**.**   SQLITE
0650: 5f 57 52 49 54 45 4c 4f 43 4b 20 20 20 20 54 68  _WRITELOCK    Th
0660: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0670: 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
0680: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
0690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
06a0: 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73 69  ccess is exclusi
06b0: 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72  ve.  No other pr
06c0: 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20  ocesses or.**   
06d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06e0: 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e 20      threads can 
06f0: 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  be reading or wr
0700: 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a  iting while one.
0710: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0720: 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73           process
0730: 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a   is writing..**.
0740: 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68  ** The page cach
0750: 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 53 51  e comes up in SQ
0760: 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  LITE_UNLOCK.  Th
0770: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a  e first time a.*
0780: 2a 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 67 65  * sqlite_page_ge
0790: 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20  t() occurs, the 
07a0: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
07b0: 73 20 74 6f 20 53 51 4c 49 54 45 5f 52 45 41 44  s to SQLITE_READ
07c0: 4c 4f 43 4b 2e 0a 2a 2a 20 41 66 74 65 72 20 61  LOCK..** After a
07d0: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
07e0: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
07f0: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
0800: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
0810: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0820: 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 55  back to SQLITE_U
0830: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0840: 74 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73  t time.** that s
0850: 71 6c 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65  qlite_page_write
0860: 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  () is called, th
0870: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0880: 6f 6e 73 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45  ons to.** SQLITE
0890: 5f 57 52 49 54 45 4c 4f 43 4b 2e 20 20 28 4e 6f  _WRITELOCK.  (No
08a0: 74 65 20 74 68 61 74 20 73 71 6c 69 74 65 5f 70  te that sqlite_p
08b0: 61 67 65 5f 77 72 69 74 65 28 29 20 63 61 6e 20  age_write() can 
08c0: 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65  only be.** calle
08d0: 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64  d on an outstand
08e0: 69 6e 67 20 70 61 67 65 20 77 68 69 63 68 20 6d  ing page which m
08f0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
0900: 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69  ger must.** be i
0910: 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43  n SQLITE_READLOC
0920: 4b 20 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e  K before it tran
0930: 73 69 74 69 6f 6e 73 20 74 6f 20 53 51 4c 49 54  sitions to SQLIT
0940: 45 5f 57 52 49 54 45 4c 4f 43 4b 2e 29 0a 2a 2a  E_WRITELOCK.).**
0950: 20 54 68 65 20 73 71 6c 69 74 65 5f 70 61 67 65   The sqlite_page
0960: 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 61 6e 64 20  _rollback() and 
0970: 73 71 6c 69 74 65 5f 70 61 67 65 5f 63 6f 6d 6d  sqlite_page_comm
0980: 69 74 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 0a  it() functions .
0990: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68  ** transition th
09a0: 65 20 73 74 61 74 65 20 66 72 6f 6d 20 53 51 4c  e state from SQL
09b0: 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 62 61  ITE_WRITELOCK ba
09c0: 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 52 45 41  ck to SQLITE_REA
09d0: 44 4c 4f 43 4b 2e 0a 2a 2f 0a 23 64 65 66 69 6e  DLOCK..*/.#defin
09e0: 65 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20  e SQLITE_UNLOCK 
09f0: 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 53       0.#define S
0a00: 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 20 20  QLITE_READLOCK  
0a10: 20 20 31 0a 23 64 65 66 69 6e 65 20 53 51 4c 49    1.#define SQLI
0a20: 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 20 20 32  TE_WRITELOCK   2
0a30: 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e  .../*.** Each in
0a40: 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66  -memory image of
0a50: 20 61 20 70 61 67 65 20 62 65 67 69 6e 73 20 77   a page begins w
0a60: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
0a70: 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69  g header..** Thi
0a80: 73 20 68 65 61 64 65 72 20 69 73 20 6f 6e 6c 79  s header is only
0a90: 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68 69 73   visible to this
0aa0: 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20   pager module.  
0ab0: 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f  The client.** co
0ac0: 64 65 20 74 68 61 74 20 63 61 6c 6c 73 20 70 61  de that calls pa
0ad0: 67 65 72 20 73 65 65 73 20 6f 6e 6c 79 20 74 68  ger sees only th
0ae0: 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
0af0: 6f 77 73 20 74 68 65 20 68 65 61 64 65 72 2e 0a  ows the header..
0b00: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0b10: 74 20 50 67 48 64 72 20 50 67 48 64 72 3b 0a 73  t PgHdr PgHdr;.s
0b20: 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20  truct PgHdr {.  
0b30: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0b50: 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77  * The pager to w
0b60: 68 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62  hich this page b
0b70: 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f  elongs */.  Pgno
0b80: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
0b90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0ba0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
0bb0: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
0bc0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73   PgHdr *pNextHas
0bd0: 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20  h, *pPrevHash;  
0be0: 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f  /* Hash collisio
0bf0: 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64  n chain for PgHd
0c00: 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 69 6e 74 20  r.pgno */.  int 
0c10: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
0c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
0c30: 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f 66  mber of users of
0c40: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
0c50: 50 67 48 64 72 20 2a 70 4e 65 78 74 46 72 65 65  PgHdr *pNextFree
0c60: 2c 20 2a 70 50 72 65 76 46 72 65 65 3b 20 20 2f  , *pPrevFree;  /
0c70: 2a 20 46 72 65 65 6c 69 73 74 20 6f 66 20 70 61  * Freelist of pa
0c80: 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d  ges where nRef==
0c90: 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  0 */.  PgHdr *pN
0ca0: 65 78 74 41 6c 6c 2c 20 2a 70 50 72 65 76 41 6c  extAll, *pPrevAl
0cb0: 6c 3b 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20  l;    /* A list 
0cc0: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
0cd0: 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 43 6b    PgHdr *pNextCk
0ce0: 70 74 2c 20 2a 70 50 72 65 76 43 6b 70 74 3b 20  pt, *pPrevCkpt; 
0cf0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65   /* List of page
0d00: 73 20 69 6e 20 74 68 65 20 63 68 65 63 6b 70 6f  s in the checkpo
0d10: 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  int journal */. 
0d20: 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20   u8 inJournal;  
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62  /* TRUE if has b
0d50: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
0d60: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
0d70: 6e 43 6b 70 74 3b 20 20 20 20 20 20 20 20 20 20  nCkpt;          
0d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
0d90: 55 45 20 69 66 20 77 72 69 74 74 65 6e 20 74 6f  UE if written to
0da0: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
0db0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
0dc0: 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  dirty;          
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0de0: 52 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74  RUE if we need t
0df0: 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61  o write back cha
0e00: 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 61 6c 77  nges */.  u8 alw
0e10: 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20  aysRollback;    
0e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
0e30: 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ble dont_rollbac
0e40: 6b 28 29 20 66 6f 72 20 74 68 69 73 20 70 61 67  k() for this pag
0e50: 65 20 2a 2f 0a 20 20 2f 2a 20 53 51 4c 49 54 45  e */.  /* SQLITE
0e60: 5f 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73  _PAGE_SIZE bytes
0e70: 20 6f 66 20 70 61 67 65 20 64 61 74 61 20 66 6f   of page data fo
0e80: 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65 72  llow this header
0e90: 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e   */.  /* Pager.n
0ea0: 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c  Extra bytes of l
0eb0: 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77  ocal data follow
0ec0: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   the page data *
0ed0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  /.};../*.** Conv
0ee0: 65 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ert a pointer to
0ef0: 20 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20   a PgHdr into a 
0f00: 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64  pointer to its d
0f10: 61 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20  ata.** and back 
0f20: 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e  again..*/.#defin
0f30: 65 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  e PGHDR_TO_DATA(
0f40: 50 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50  P)  ((void*)(&(P
0f50: 29 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44  )[1])).#define D
0f60: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20  ATA_TO_PGHDR(D) 
0f70: 20 28 26 28 28 50 67 48 64 72 2a 29 28 44 29 29   (&((PgHdr*)(D))
0f80: 5b 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47  [-1]).#define PG
0f90: 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 50 29 20  HDR_TO_EXTRA(P) 
0fa0: 28 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a  ((void*)&((char*
0fb0: 29 28 26 28 50 29 5b 31 5d 29 29 5b 53 51 4c 49  )(&(P)[1]))[SQLI
0fc0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d 29 0a 0a  TE_PAGE_SIZE])..
0fd0: 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74 6f  /*.** How big to
0fe0: 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
0ff0: 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f  able used for lo
1000: 63 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79  cating in-memory
1010: 20 70 61 67 65 73 0a 2a 2a 20 62 79 20 70 61 67   pages.** by pag
1020: 65 20 6e 75 6d 62 65 72 2e 20 20 4b 6e 75 74 68  e number.  Knuth
1030: 20 73 61 79 73 20 74 68 69 73 20 73 68 6f 75 6c   says this shoul
1040: 64 20 62 65 20 61 20 70 72 69 6d 65 20 6e 75 6d  d be a prime num
1050: 62 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ber..*/.#define 
1060: 4e 5f 50 47 5f 48 41 53 48 20 32 30 30 33 0a 0a  N_PG_HASH 2003..
1070: 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67  /*.** A open pag
1080: 65 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e  e cache is an in
1090: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
10a0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
10b0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67  e..*/.struct Pag
10c0: 65 72 20 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69  er {.  char *zFi
10d0: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
10e0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
10f0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1100: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
1110: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
1120: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1130: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
1140: 20 20 4f 73 46 69 6c 65 20 66 64 2c 20 6a 66 64    OsFile fd, jfd
1150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1160: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
1170: 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 61  s for database a
1180: 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nd journal */.  
1190: 4f 73 46 69 6c 65 20 63 70 66 64 3b 20 20 20 20  OsFile cpfd;    
11a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
11b0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
11c0: 6f 72 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  or the checkpoin
11d0: 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  t journal */.  i
11e0: 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20  nt dbSize;      
11f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1200: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1210: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69   the file */.  i
1220: 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20  nt origDbSize;  
1230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
1240: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
1250: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a  current change *
1260: 2f 0a 20 20 69 6e 74 20 63 6b 70 74 53 69 7a 65  /.  int ckptSize
1270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1280: 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62  /* Size of datab
1290: 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61  ase (in pages) a
12a0: 74 20 63 6b 70 74 5f 62 65 67 69 6e 28 29 20 2a  t ckpt_begin() *
12b0: 2f 0a 20 20 6f 66 66 5f 74 20 63 6b 70 74 4a 53  /.  off_t ckptJS
12c0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
12d0: 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e  /* Size of journ
12e0: 61 6c 20 61 74 20 63 6b 70 74 5f 62 65 67 69 6e  al at ckpt_begin
12f0: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  () */.  int nExt
1300: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ra;             
1310: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
1320: 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61  many bytes to ea
1330: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
1340: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44  e */.  void (*xD
1350: 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64 2a  estructor)(void*
1360: 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20  ); /* Call this 
1370: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65  routine when fre
1380: 65 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  eing pages */.  
1390: 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13b0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69  otal number of i
13c0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a  n-memory pages *
13d0: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  /* Number of in-
1400: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74  memory pages wit
1410: 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a  h PgHdr.nRef>0 *
1420: 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20  /.  int mxPage; 
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
1450: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f  r of pages to ho
1460: 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ld in cache */. 
1470: 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73   int nHit, nMiss
1480: 2c 20 6e 4f 76 66 6c 3b 20 20 20 20 20 2f 2a 20  , nOvfl;     /* 
1490: 43 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73  Cache hits, miss
14a0: 69 6e 67 2c 20 61 6e 64 20 4c 52 55 20 6f 76 65  ing, and LRU ove
14b0: 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 75 38 20 6a  rflows */.  u8 j
14c0: 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20  ournalOpen;     
14d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
14e0: 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  if journal file 
14f0: 64 65 73 63 72 69 70 74 6f 72 73 20 69 73 20 76  descriptors is v
1500: 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 75 73 65  alid */.  u8 use
1510: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
1520: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
1530: 75 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  use a rollback j
1540: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
1550: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74  ile */.  u8 ckpt
1560: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
1570: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1580: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a  the checkpoint j
1590: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a  ournal is open *
15a0: 2f 0a 20 20 75 38 20 63 6b 70 74 49 6e 55 73 65  /.  u8 ckptInUse
15b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15c0: 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69  /* True we are i
15d0: 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a  n a checkpoint *
15e0: 2f 0a 20 20 75 38 20 63 6b 70 74 41 75 74 6f 6f  /.  u8 ckptAutoo
15f0: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
1600: 2f 2a 20 4f 70 65 6e 20 63 6b 70 74 20 6a 6f 75  /* Open ckpt jou
1610: 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a  rnal when main j
1620: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64  ournal is opened
1630: 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20  */.  u8 noSync; 
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1650: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20   /* Do not sync 
1660: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74  the journal if t
1670: 72 75 65 20 2a 2f 0a 20 20 75 38 20 73 74 61 74  rue */.  u8 stat
1680: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1690: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 55       /* SQLITE_U
16a0: 4e 4c 4f 43 4b 2c 20 5f 52 45 41 44 4c 4f 43 4b  NLOCK, _READLOCK
16b0: 20 6f 72 20 5f 57 52 49 54 45 4c 4f 43 4b 20 2a   or _WRITELOCK *
16c0: 2f 0a 20 20 75 38 20 65 72 72 4d 61 73 6b 3b 20  /.  u8 errMask; 
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
16f0: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
1700: 73 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69  s */.  u8 tempFi
1710: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
1720: 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
1730: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
1740: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64  ile */.  u8 read
1750: 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  Only;           
1760: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1770: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
1780: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65  abase */.  u8 ne
1790: 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  edSync;         
17a0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
17b0: 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20  f an fsync() is 
17c0: 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f  needed on the jo
17d0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69  urnal */.  u8 di
17e0: 72 74 79 46 69 6c 65 3b 20 20 20 20 20 20 20 20  rtyFile;        
17f0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1800: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
1810: 68 61 73 20 63 68 61 6e 67 65 64 20 69 6e 20 61  has changed in a
1820: 6e 79 20 77 61 79 20 2a 2f 0a 20 20 75 38 20 61  ny way */.  u8 a
1830: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20  lwaysRollback;  
1840: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62          /* Disab
1850: 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  le dont_rollback
1860: 28 29 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73  () for all pages
1870: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
1880: 46 6f 72 6d 61 74 3b 20 20 20 20 20 20 20 20 20  Format;         
1890: 20 20 2f 2a 20 56 65 72 73 69 6f 6e 20 6e 75 6d    /* Version num
18a0: 62 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ber of the journ
18b0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  al file */.  u8 
18c0: 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *aInJournal;    
18d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
18e0: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
18f0: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
1900: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a  e file */.  u8 *
1910: 61 49 6e 43 6b 70 74 3b 20 20 20 20 20 20 20 20  aInCkpt;        
1920: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
1930: 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  it for each page
1940: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1950: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69   */.  PgHdr *pFi
1960: 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20  rst, *pLast;    
1970: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65    /* List of fre
1980: 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  e pages */.  PgH
1990: 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20  dr *pAll;       
19a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
19b0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f   of all pages */
19c0: 0a 20 20 50 67 48 64 72 20 2a 70 43 6b 70 74 3b  .  PgHdr *pCkpt;
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19e0: 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20  * List of pages 
19f0: 69 6e 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  in the checkpoin
1a00: 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 50  t journal */.  P
1a10: 67 48 64 72 20 2a 61 48 61 73 68 5b 4e 5f 50 47  gHdr *aHash[N_PG
1a20: 5f 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20 48 61  _HASH];    /* Ha
1a30: 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20  sh table to map 
1a40: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 50  page number of P
1a50: 67 48 64 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  gHdr */.};../*.*
1a60: 2a 20 54 68 65 73 65 20 61 72 65 20 62 69 74 73  * These are bits
1a70: 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 65 74   that can be set
1a80: 20 69 6e 20 50 61 67 65 72 2e 65 72 72 4d 61 73   in Pager.errMas
1a90: 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  k..*/.#define PA
1aa0: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 20 20 20  GER_ERR_FULL    
1ab0: 20 30 78 30 31 20 20 2f 2a 20 61 20 77 72 69 74   0x01  /* a writ
1ac0: 65 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64  e() failed */.#d
1ad0: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f  efine PAGER_ERR_
1ae0: 4d 45 4d 20 20 20 20 20 20 30 78 30 32 20 20 2f  MEM      0x02  /
1af0: 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65  * malloc() faile
1b00: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  d */.#define PAG
1b10: 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 20 20 20 20  ER_ERR_LOCK     
1b20: 30 78 30 34 20 20 2f 2a 20 65 72 72 6f 72 20 69  0x04  /* error i
1b30: 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72  n the locking pr
1b40: 6f 74 6f 63 6f 6c 20 2a 2f 0a 23 64 65 66 69 6e  otocol */.#defin
1b50: 65 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  e PAGER_ERR_CORR
1b60: 55 50 54 20 20 30 78 30 38 20 20 2f 2a 20 64 61  UPT  0x08  /* da
1b70: 74 61 62 61 73 65 20 6f 72 20 6a 6f 75 72 6e 61  tabase or journa
1b80: 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  l corruption */.
1b90: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
1ba0: 52 5f 44 49 53 4b 20 20 20 20 20 30 78 31 30 20  R_DISK     0x10 
1bb0: 20 2f 2a 20 67 65 6e 65 72 61 6c 20 64 69 73 6b   /* general disk
1bc0: 20 49 2f 4f 20 65 72 72 6f 72 20 2d 20 62 61 64   I/O error - bad
1bd0: 20 68 61 72 64 20 64 72 69 76 65 3f 20 2a 2f 0a   hard drive? */.
1be0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
1bf0: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
1c00: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 69 6e   page records in
1c10: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
1c20: 2a 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 74 79 70  * format..*/.typ
1c30: 65 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65  edef struct Page
1c40: 52 65 63 6f 72 64 20 50 61 67 65 52 65 63 6f 72  Record PageRecor
1c50: 64 3b 0a 73 74 72 75 63 74 20 50 61 67 65 52 65  d;.struct PageRe
1c60: 63 6f 72 64 20 7b 0a 20 20 50 67 6e 6f 20 70 67  cord {.  Pgno pg
1c70: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
1c80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1c90: 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
1ca0: 63 68 61 72 20 61 44 61 74 61 5b 53 51 4c 49 54  char aData[SQLIT
1cb0: 45 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20 2f  E_PAGE_SIZE];  /
1cc0: 2a 20 4f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  * Original data 
1cd0: 66 6f 72 20 70 61 67 65 20 70 67 6e 6f 20 2a 2f  for page pgno */
1ce0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  .};../*.** Journ
1cf0: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
1d00: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
1d10: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
1d20: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
1d30: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
1d40: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
1d50: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
1d60: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
1d70: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
1d80: 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  two journal form
1d90: 61 74 73 2e 20 20 54 68 65 20 6f 6c 64 65 72 20  ats.  The older 
1da0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 77  journal format w
1db0: 72 69 74 65 73 0a 2a 2a 20 33 32 2d 62 69 74 20  rites.** 32-bit 
1dc0: 69 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65 20  integers in the 
1dd0: 62 79 74 65 2d 6f 72 64 65 72 20 6f 66 20 74 68  byte-order of th
1de0: 65 20 68 6f 73 74 20 6d 61 63 68 69 6e 65 2e 20  e host machine. 
1df0: 20 54 68 65 20 6e 65 77 0a 2a 2a 20 66 6f 72 6d   The new.** form
1e00: 61 74 20 77 72 69 74 65 73 20 69 6e 74 65 67 65  at writes intege
1e10: 72 73 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  rs as big-endian
1e20: 2e 20 20 41 6c 6c 20 6e 65 77 20 6a 6f 75 72 6e  .  All new journ
1e30: 61 6c 73 20 75 73 65 20 74 68 65 0a 2a 2a 20 6e  als use the.** n
1e40: 65 77 20 66 6f 72 6d 61 74 2c 20 62 75 74 20 77  ew format, but w
1e50: 65 20 68 61 76 65 20 74 6f 20 62 65 20 61 62 6c  e have to be abl
1e60: 65 20 74 6f 20 72 65 61 64 20 61 6e 20 6f 6c 64  e to read an old
1e70: 65 72 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6f 72  er journal in or
1e80: 64 65 72 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 69  der.** to roll i
1e90: 74 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t back..*/.stati
1ea0: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
1eb0: 20 63 68 61 72 20 61 4f 6c 64 4a 6f 75 72 6e 61   char aOldJourna
1ec0: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
1ed0: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
1ee0: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
1ef0: 31 2c 20 30 78 36 33 2c 20 30 78 64 34 2c 0a 7d  1, 0x63, 0xd4,.}
1f00: 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  ;.static const u
1f10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f  nsigned char aJo
1f20: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b  urnalMagic[] = {
1f30: 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30  .  0xd9, 0xd5, 0
1f40: 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c  x05, 0xf9, 0x20,
1f50: 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64   0xa1, 0x63, 0xd
1f60: 35 2c 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 53 51  5,.};.#define SQ
1f70: 4c 49 54 45 5f 4e 45 57 5f 4a 4f 55 52 4e 41 4c  LITE_NEW_JOURNAL
1f80: 5f 46 4f 52 4d 41 54 20 31 0a 23 64 65 66 69 6e  _FORMAT 1.#defin
1f90: 65 20 53 51 4c 49 54 45 5f 4f 4c 44 5f 4a 4f 55  e SQLITE_OLD_JOU
1fa0: 52 4e 41 4c 5f 46 4f 52 4d 41 54 20 30 0a 0a 2f  RNAL_FORMAT 0../
1fb0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1fc0: 6e 67 20 69 6e 74 65 67 65 72 2c 20 69 66 20 73  ng integer, if s
1fd0: 65 74 2c 20 63 61 75 73 65 73 20 6a 6f 75 72 6e  et, causes journ
1fe0: 61 6c 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  als to be writte
1ff0: 6e 20 69 6e 20 74 68 65 0a 2a 2a 20 6f 6c 64 20  n in the.** old 
2000: 66 6f 72 6d 61 74 2e 20 20 54 68 69 73 20 69 73  format.  This is
2010: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
2020: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 20  g purposes only 
2030: 2d 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 0a 2a  - to make sure.*
2040: 2a 20 74 68 65 20 63 6f 64 65 20 69 73 20 61 62  * the code is ab
2050: 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  le to rollback a
2060: 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n old journal..*
2070: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2080: 54 45 53 54 0a 69 6e 74 20 70 61 67 65 72 5f 6f  TEST.int pager_o
2090: 6c 64 5f 66 6f 72 6d 61 74 20 3d 20 30 3b 0a 23  ld_format = 0;.#
20a0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
20b0: 67 65 72 5f 6f 6c 64 5f 66 6f 72 6d 61 74 20 30  ger_old_format 0
20c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
20d0: 61 73 68 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ash a page numbe
20e0: 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 61 67  r.*/.#define pag
20f0: 65 72 5f 68 61 73 68 28 50 4e 29 20 20 28 28 50  er_hash(PN)  ((P
2100: 4e 29 25 4e 5f 50 47 5f 48 41 53 48 29 0a 0a 2f  N)%N_PG_HASH)../
2110: 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66 65  *.** Enable refe
2120: 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63  rence count trac
2130: 6b 69 6e 67 20 68 65 72 65 3a 0a 2a 2f 0a 23 69  king here:.*/.#i
2140: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2150: 0a 20 20 69 6e 74 20 70 61 67 65 72 5f 72 65 66  .  int pager_ref
2160: 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b  info_enable = 0;
2170: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70  .  static void p
2180: 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48  ager_refinfo(PgH
2190: 64 72 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74  dr *p){.    stat
21a0: 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  ic int cnt = 0;.
21b0: 20 20 20 20 69 66 28 20 21 70 61 67 65 72 5f 72      if( !pager_r
21c0: 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20  efinfo_enable ) 
21d0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 72 69 6e  return;.    prin
21e0: 74 66 28 0a 20 20 20 20 20 20 20 22 52 45 46 43  tf(.       "REFC
21f0: 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 30 78 25  NT: %4d addr=0x%
2200: 30 38 78 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a  08x nRef=%d\n",.
2210: 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20         p->pgno, 
2220: 28 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44 41  (int)PGHDR_TO_DA
2230: 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 0a 20  TA(p), p->nRef. 
2240: 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b     );.    cnt++;
2250: 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20     /* Something 
2260: 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
2270: 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20  int on */.  }.# 
2280: 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58  define REFINFO(X
2290: 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f  )  pager_refinfo
22a0: 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  (X).#else.# defi
22b0: 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23 65  ne REFINFO(X).#e
22c0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
22d0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
22e0: 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  r from the given
22f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2300: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
2310: 65 61 64 33 32 62 69 74 73 28 50 61 67 65 72 20  ead32bits(Pager 
2320: 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65 20  *pPager, OsFile 
2330: 2a 66 64 2c 20 75 33 32 20 2a 70 52 65 73 29 7b  *fd, u32 *pRes){
2340: 0a 20 20 75 33 32 20 72 65 73 3b 0a 20 20 69 6e  .  u32 res;.  in
2350: 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  t rc;.  rc = sql
2360: 69 74 65 4f 73 52 65 61 64 28 66 64 2c 20 26 72  iteOsRead(fd, &r
2370: 65 73 2c 20 73 69 7a 65 6f 66 28 72 65 73 29 29  es, sizeof(res))
2380: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2390: 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
23a0: 3e 6a 6f 75 72 6e 61 6c 46 6f 72 6d 61 74 3d 3d  >journalFormat==
23b0: 53 51 4c 49 54 45 5f 4e 45 57 5f 4a 4f 55 52 4e  SQLITE_NEW_JOURN
23c0: 41 4c 5f 46 4f 52 4d 41 54 20 29 7b 0a 20 20 20  AL_FORMAT ){.   
23d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
23e0: 63 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  c[4];.    memcpy
23f0: 28 61 63 2c 20 26 72 65 73 2c 20 34 29 3b 0a 20  (ac, &res, 4);. 
2400: 20 20 20 72 65 73 20 3d 20 28 61 63 5b 30 5d 3c     res = (ac[0]<
2410: 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31  <24) | (ac[1]<<1
2420: 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20  6) | (ac[2]<<8) 
2430: 7c 20 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 2a  | ac[3];.  }.  *
2440: 70 52 65 73 20 3d 20 72 65 73 3b 0a 20 20 72 65  pRes = res;.  re
2450: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2460: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
2470: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
2480: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
2490: 63 72 69 70 74 6f 72 2e 20 20 57 72 69 74 69 6e  criptor.  Writin
24a0: 67 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 64  g.** is always d
24b0: 6f 6e 65 20 75 73 69 6e 67 20 74 68 65 20 6e 65  one using the ne
24c0: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
24d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24e0: 77 72 69 74 65 33 32 62 69 74 73 28 4f 73 46 69  write32bits(OsFi
24f0: 6c 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29  le *fd, u32 val)
2500: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
2510: 72 20 61 63 5b 34 5d 3b 0a 20 20 69 66 28 20 70  r ac[4];.  if( p
2520: 61 67 65 72 5f 6f 6c 64 5f 66 6f 72 6d 61 74 20  ager_old_format 
2530: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
2540: 6c 69 74 65 4f 73 57 72 69 74 65 28 66 64 2c 20  liteOsWrite(fd, 
2550: 26 76 61 6c 2c 20 34 29 3b 0a 20 20 7d 0a 20 20  &val, 4);.  }.  
2560: 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34  ac[0] = (val>>24
2570: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31  ) & 0xff;.  ac[1
2580: 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20  ] = (val>>16) & 
2590: 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20  0xff;.  ac[2] = 
25a0: 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b  (val>>8) & 0xff;
25b0: 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26  .  ac[3] = val &
25c0: 20 30 78 66 66 3b 0a 20 20 72 65 74 75 72 6e 20   0xff;.  return 
25d0: 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 66 64  sqliteOsWrite(fd
25e0: 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 0a 2f 2a  , ac, 4);.}.../*
25f0: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20  .** Convert the 
2600: 62 69 74 73 20 69 6e 20 74 68 65 20 70 50 61 67  bits in the pPag
2610: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 69 6e 74 6f  er->errMask into
2620: 20 61 6e 20 61 70 70 72 6f 70 72 61 74 65 0a 2a   an approprate.*
2630: 2a 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0a 2a  * return code..*
2640: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2650: 65 72 5f 65 72 72 63 6f 64 65 28 50 61 67 65 72  er_errcode(Pager
2660: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2670: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2680: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
2690: 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45  rrMask & PAGER_E
26a0: 52 52 5f 4c 4f 43 4b 20 29 20 20 20 20 72 63 20  RR_LOCK )    rc 
26b0: 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  = SQLITE_PROTOCO
26c0: 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  L;.  if( pPager-
26d0: 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52  >errMask & PAGER
26e0: 5f 45 52 52 5f 44 49 53 4b 20 29 20 20 20 20 72  _ERR_DISK )    r
26f0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
2700: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2710: 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f  errMask & PAGER_
2720: 45 52 52 5f 46 55 4c 4c 20 29 20 20 20 20 72 63  ERR_FULL )    rc
2730: 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
2740: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
2750: 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52  rMask & PAGER_ER
2760: 52 5f 4d 45 4d 20 29 20 20 20 20 20 72 63 20 3d  R_MEM )     rc =
2770: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2780: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
2790: 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52  Mask & PAGER_ERR
27a0: 5f 43 4f 52 52 55 50 54 20 29 20 72 63 20 3d 20  _CORRUPT ) rc = 
27b0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
27c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27d0: 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d  /*.** Add or rem
27e0: 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20  ove a page from 
27f0: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
2800: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69  pages that are i
2810: 6e 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 70 6f  n the.** checkpo
2820: 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  int journal..**.
2830: 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65 65  ** The Pager kee
2840: 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c 69  ps a separate li
2850: 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  st of pages that
2860: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
2870: 6e 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 70 6f  n.** the checkpo
2880: 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  int journal.  Th
2890: 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c  is helps the sql
28a0: 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 63 6f  itepager_ckpt_co
28b0: 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  mmit().** routin
28c0: 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65  e run MUCH faste
28d0: 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  r for the common
28e0: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 72   case where ther
28f0: 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61  e are many.** pa
2900: 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75  ges in memory bu
2910: 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65  t only a few are
2920: 20 69 6e 20 74 68 65 20 63 68 65 63 6b 70 6f 69   in the checkpoi
2930: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  nt journal..*/.s
2940: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
2950: 61 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73 74  add_to_ckpt_list
2960: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
2970: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2980: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
2990: 66 28 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20 29  f( pPg->inCkpt )
29a0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
29b0: 74 28 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70  t( pPg->pPrevCkp
29c0: 74 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e 65  t==0 && pPg->pNe
29d0: 78 74 43 6b 70 74 3d 3d 30 20 29 3b 0a 20 20 70  xtCkpt==0 );.  p
29e0: 50 67 2d 3e 70 50 72 65 76 43 6b 70 74 20 3d 20  Pg->pPrevCkpt = 
29f0: 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
2a00: 3e 70 43 6b 70 74 20 29 7b 0a 20 20 20 20 70 50  >pCkpt ){.    pP
2a10: 61 67 65 72 2d 3e 70 43 6b 70 74 2d 3e 70 50 72  ager->pCkpt->pPr
2a20: 65 76 43 6b 70 74 20 3d 20 70 50 67 3b 0a 20 20  evCkpt = pPg;.  
2a30: 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b  }.  pPg->pNextCk
2a40: 70 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 43 6b  pt = pPager->pCk
2a50: 70 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43  pt;.  pPager->pC
2a60: 6b 70 74 20 3d 20 70 50 67 3b 0a 20 20 70 50 67  kpt = pPg;.  pPg
2a70: 2d 3e 69 6e 43 6b 70 74 20 3d 20 31 3b 0a 7d 0a  ->inCkpt = 1;.}.
2a80: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
2a90: 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 63 6b 70  _remove_from_ckp
2aa0: 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50  t_list(PgHdr *pP
2ab0: 67 29 7b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  g){.  if( !pPg->
2ac0: 69 6e 43 6b 70 74 20 29 20 72 65 74 75 72 6e 3b  inCkpt ) return;
2ad0: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
2ae0: 76 43 6b 70 74 20 29 7b 0a 20 20 20 20 61 73 73  vCkpt ){.    ass
2af0: 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 43  ert( pPg->pPrevC
2b00: 6b 70 74 2d 3e 70 4e 65 78 74 43 6b 70 74 3d 3d  kpt->pNextCkpt==
2b10: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
2b20: 70 50 72 65 76 43 6b 70 74 2d 3e 70 4e 65 78 74  pPrevCkpt->pNext
2b30: 43 6b 70 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Ckpt = pPg->pNex
2b40: 74 43 6b 70 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tCkpt;.  }else{.
2b50: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
2b60: 3e 70 50 61 67 65 72 2d 3e 70 43 6b 70 74 3d 3d  >pPager->pCkpt==
2b70: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
2b80: 70 50 61 67 65 72 2d 3e 70 43 6b 70 74 20 3d 20  pPager->pCkpt = 
2b90: 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 3b 0a  pPg->pNextCkpt;.
2ba0: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
2bb0: 4e 65 78 74 43 6b 70 74 20 29 7b 0a 20 20 20 20  NextCkpt ){.    
2bc0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
2bd0: 78 74 43 6b 70 74 2d 3e 70 50 72 65 76 43 6b 70  xtCkpt->pPrevCkp
2be0: 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
2bf0: 67 2d 3e 70 4e 65 78 74 43 6b 70 74 2d 3e 70 50  g->pNextCkpt->pP
2c00: 72 65 76 43 6b 70 74 20 3d 20 70 50 67 2d 3e 70  revCkpt = pPg->p
2c10: 50 72 65 76 43 6b 70 74 3b 0a 20 20 7d 0a 20 20  PrevCkpt;.  }.  
2c20: 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 20 3d  pPg->pNextCkpt =
2c30: 20 30 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76   0;.  pPg->pPrev
2c40: 43 6b 70 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d  Ckpt = 0;.  pPg-
2c50: 3e 69 6e 43 6b 70 74 20 3d 20 30 3b 0a 7d 0a 0a  >inCkpt = 0;.}..
2c60: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67  /*.** Find a pag
2c70: 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  e in the hash ta
2c80: 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61  ble given its pa
2c90: 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  ge number.  Retu
2ca0: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
2cb0: 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e  to the page or N
2cc0: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
2cd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
2ce0: 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  r *pager_lookup(
2cf0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
2d00: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
2d10: 64 72 20 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e  dr *p = pPager->
2d20: 61 48 61 73 68 5b 70 67 6e 6f 20 25 20 4e 5f 50  aHash[pgno % N_P
2d30: 47 5f 48 41 53 48 5d 3b 0a 20 20 77 68 69 6c 65  G_HASH];.  while
2d40: 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d  ( p && p->pgno!=
2d50: 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20  pgno ){.    p = 
2d60: 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  p->pNextHash;.  
2d70: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
2d80: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
2d90: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63  e database and c
2da0: 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lear the in-memo
2db0: 72 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  ry cache.  This 
2dc0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20  routine.** sets 
2dd0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
2de0: 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77   pager back to w
2df0: 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20  hat it was when 
2e00: 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20  it was first.** 
2e10: 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74  opened.  Any out
2e20: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
2e30: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  re invalidated a
2e40: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74  nd subsequent at
2e50: 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63  tempts.** to acc
2e60: 65 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20  ess those pages 
2e70: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
2e80: 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
2e90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2ea0: 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
2eb0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
2ec0: 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
2ed0: 74 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  t;.  for(pPg=pPa
2ee0: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
2ef0: 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
2f00: 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
2f10: 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  xtAll;.    sqlit
2f20: 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  eFree(pPg);.  }.
2f30: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
2f40: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
2f50: 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  pLast = 0;.  pPa
2f60: 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20  ger->pAll = 0;. 
2f70: 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
2f80: 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
2f90: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
2fa0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ;.  pPager->nPag
2fb0: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  e = 0;.  if( pPa
2fc0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 51 4c 49  ger->state>=SQLI
2fd0: 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a  TE_WRITELOCK ){.
2fe0: 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f      sqlitepager_
2ff0: 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
3000: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73  ;.  }.  sqliteOs
3010: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
3020: 66 64 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  fd);.  pPager->s
3030: 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 55 4e  tate = SQLITE_UN
3040: 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  LOCK;.  pPager->
3050: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70  dbSize = -1;.  p
3060: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
3070: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
3080: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
3090: 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  0 );.}../*.** Wh
30a0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
30b0: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
30c0: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
30d0: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
30e0: 6e 64 0a 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f  nd.** a write lo
30f0: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
3100: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
3110: 65 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 64  e releases the d
3120: 61 74 61 62 61 73 65 0a 2a 2a 20 77 72 69 74 65  atabase.** write
3130: 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72   lock and acquir
3140: 65 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  es a read lock i
3150: 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 20 54 68  n its place.  Th
3160: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
3170: 2a 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e 64  * is deleted and
3180: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
3190: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e 77  ic int pager_unw
31a0: 72 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a  ritelock(Pager *
31b0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
31c0: 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
31d0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
31e0: 74 61 74 65 3c 53 51 4c 49 54 45 5f 57 52 49 54  tate<SQLITE_WRIT
31f0: 45 4c 4f 43 4b 20 29 20 72 65 74 75 72 6e 20 53  ELOCK ) return S
3200: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
3210: 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 63 6f 6d  tepager_ckpt_com
3220: 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  mit(pPager);.  i
3230: 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f  f( pPager->ckptO
3240: 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
3250: 65 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  eOsClose(&pPager
3260: 2d 3e 63 70 66 64 29 3b 0a 20 20 20 20 70 50 61  ->cpfd);.    pPa
3270: 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 3d 20  ger->ckptOpen = 
3280: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
3290: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
32a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73   ){.    sqliteOs
32b0: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a  Close(&pPager->j
32c0: 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  fd);.    pPager-
32d0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30  >journalOpen = 0
32e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 44 65  ;.    sqliteOsDe
32f0: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  lete(pPager->zJo
3300: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  urnal);.    sqli
3310: 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e  teFree( pPager->
3320: 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  aInJournal );.  
3330: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
3340: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f  rnal = 0;.    fo
3350: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
3360: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
3370: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
3380: 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
3390: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
33a0: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
33b0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
33c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
33d0: 64 69 72 74 79 46 69 6c 65 3d 3d 30 20 7c 7c 20  dirtyFile==0 || 
33e0: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
33f0: 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 72  al==0 );.  }.  r
3400: 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64  c = sqliteOsRead
3410: 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
3420: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
3430: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
3440: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51  ager->state = SQ
3450: 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20  LITE_READLOCK;. 
3460: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
3470: 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
3480: 70 65 6e 20 69 66 20 61 20 70 72 6f 63 65 73 73  pen if a process
3490: 20 64 6f 65 73 20 61 20 42 45 47 49 4e 2c 20 74   does a BEGIN, t
34a0: 68 65 6e 20 66 6f 72 6b 73 20 61 6e 64 20 74 68  hen forks and th
34b0: 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 20 70  e.    ** child p
34c0: 72 6f 63 65 73 73 20 64 6f 65 73 20 74 68 65 20  rocess does the 
34d0: 43 4f 4d 4d 49 54 2e 20 20 42 65 63 61 75 73 65  COMMIT.  Because
34e0: 20 6f 66 20 74 68 65 20 73 65 6d 61 6e 74 69 63   of the semantic
34f0: 73 20 6f 66 20 75 6e 69 78 0a 20 20 20 20 2a 2a  s of unix.    **
3500: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 74   file locking, t
3510: 68 65 20 75 6e 6c 6f 63 6b 20 77 69 6c 6c 20 66  he unlock will f
3520: 61 69 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ail..    */.    
3530: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
3540: 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20  SQLITE_UNLOCK;. 
3550: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
3560: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
3570: 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
3580: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
3590: 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65  e opened on file
35a0: 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a   descriptor.** j
35b0: 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68  fd.  Playback th
35c0: 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a  is one page..*/.
35d0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
35e0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
35f0: 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
3600: 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 29 7b 0a  , OsFile *jfd){.
3610: 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
3620: 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20  r *pPg;         
3630: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
3640: 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
3650: 63 61 63 68 65 20 2a 2f 0a 20 20 50 61 67 65 52  cache */.  PageR
3660: 65 63 6f 72 64 20 70 67 52 65 63 3b 0a 0a 20 20  ecord pgRec;..  
3670: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
3680: 70 50 61 67 65 72 2c 20 6a 66 64 2c 20 26 70 67  pPager, jfd, &pg
3690: 52 65 63 2e 70 67 6e 6f 29 3b 0a 20 20 69 66 28  Rec.pgno);.  if(
36a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
36c0: 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28   = sqliteOsRead(
36d0: 6a 66 64 2c 20 26 70 67 52 65 63 2e 61 44 61 74  jfd, &pgRec.aDat
36e0: 61 2c 20 73 69 7a 65 6f 66 28 70 67 52 65 63 2e  a, sizeof(pgRec.
36f0: 61 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20 72  aData));.  if( r
3700: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
3710: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
3720: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
3730: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
3740: 20 69 66 28 20 70 67 52 65 63 2e 70 67 6e 6f 3e   if( pgRec.pgno>
3750: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c  pPager->dbSize |
3760: 7c 20 70 67 52 65 63 2e 70 67 6e 6f 3d 3d 30 20  | pgRec.pgno==0 
3770: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
3780: 43 4f 52 52 55 50 54 3b 0a 0a 20 20 2f 2a 20 50  CORRUPT;..  /* P
3790: 6c 61 79 62 61 63 6b 20 74 68 65 20 70 61 67 65  layback the page
37a0: 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 69 6e  .  Update the in
37b0: 2d 6d 65 6d 6f 72 79 20 63 6f 70 79 20 6f 66 20  -memory copy of 
37c0: 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 61 74  the page.  ** at
37d0: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20   the same time, 
37e0: 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
37f0: 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61  .  */.  pPg = pa
3800: 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
3810: 72 2c 20 70 67 52 65 63 2e 70 67 6e 6f 29 3b 0a  r, pgRec.pgno);.
3820: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
3830: 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
3840: 5f 44 41 54 41 28 70 50 67 29 2c 20 70 67 52 65  _DATA(pPg), pgRe
3850: 63 2e 61 44 61 74 61 2c 20 53 51 4c 49 54 45 5f  c.aData, SQLITE_
3860: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
3870: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
3880: 45 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70  EXTRA(pPg), 0, p
3890: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
38a0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
38b0: 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  eOsSeek(&pPager-
38c0: 3e 66 64 2c 20 28 70 67 52 65 63 2e 70 67 6e 6f  >fd, (pgRec.pgno
38d0: 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c 49 54  -1)*(off_t)SQLIT
38e0: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
38f0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3900: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
3910: 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61  liteOsWrite(&pPa
3920: 67 65 72 2d 3e 66 64 2c 20 70 67 52 65 63 2e 61  ger->fd, pgRec.a
3930: 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47  Data, SQLITE_PAG
3940: 45 5f 53 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 72  E_SIZE);.  }.  r
3950: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3960: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
3970: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
3980: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
3990: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
39a0: 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
39b0: 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
39c0: 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
39d0: 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
39e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
39f0: 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
3a00: 6c 6f 77 73 3a 20 20 54 68 65 72 65 20 69 73 20  lows:  There is 
3a10: 61 6e 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 66 69  an initial.** fi
3a20: 6c 65 2d 74 79 70 65 20 73 74 72 69 6e 67 20 66  le-type string f
3a30: 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
3a40: 6e 67 2e 20 20 54 68 65 6e 20 74 68 65 72 65 20  ng.  Then there 
3a50: 69 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 50  is a single.** P
3a60: 67 6e 6f 20 6e 75 6d 62 65 72 20 77 68 69 63 68  gno number which
3a70: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
3a80: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
3a90: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
3aa0: 2a 20 63 68 61 6e 67 65 73 20 77 65 72 65 20 6d  * changes were m
3ab0: 61 64 65 2e 20 20 54 68 65 20 64 61 74 61 62 61  ade.  The databa
3ac0: 73 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  se is truncated 
3ad0: 74 6f 20 74 68 69 73 20 73 69 7a 65 2e 0a 2a 2a  to this size..**
3ae0: 20 4e 65 78 74 20 63 6f 6d 65 20 7a 65 72 6f 20   Next come zero 
3af0: 6f 72 20 6d 6f 72 65 20 70 61 67 65 20 72 65 63  or more page rec
3b00: 6f 72 64 73 20 77 68 65 72 65 20 65 61 63 68 20  ords where each 
3b10: 70 61 67 65 20 72 65 63 6f 72 64 0a 2a 2a 20 63  page record.** c
3b20: 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 50 67 6e  onsists of a Pgn
3b30: 6f 20 61 6e 64 20 53 51 4c 49 54 45 5f 50 41 47  o and SQLITE_PAG
3b40: 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6f 66 20  E_SIZE bytes of 
3b50: 64 61 74 61 2e 20 20 53 65 65 0a 2a 2a 20 74 68  data.  See.** th
3b60: 65 20 50 61 67 65 52 65 63 6f 72 64 20 73 74 72  e PageRecord str
3b70: 75 63 74 75 72 65 20 66 6f 72 20 64 65 74 61 69  ucture for detai
3b80: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ls..**.** If the
3b90: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
3ba0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
3bb0: 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
3bc0: 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
3bd0: 20 66 69 6c 65 20 28 61 73 20 64 65 74 65 72 6d   file (as determ
3be0: 69 6e 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  ined by looking 
3bf0: 61 74 20 74 68 65 20 6d 61 67 69 63 20 6e 75 6d  at the magic num
3c00: 62 65 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65  ber.** at the be
3c10: 67 69 6e 6e 69 6e 67 29 20 74 68 65 6e 20 74 68  ginning) then th
3c20: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
3c30: 6e 73 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  ns SQLITE_PROTOC
3c40: 4f 4c 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 74  OL..** If any ot
3c50: 68 65 72 20 65 72 72 6f 72 73 20 6f 63 63 75 72  her errors occur
3c60: 20 64 75 72 69 6e 67 20 70 6c 61 79 62 61 63 6b   during playback
3c70: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  , the database w
3c80: 69 6c 6c 0a 2a 2a 20 6c 69 6b 65 6c 79 20 62 65  ill.** likely be
3c90: 20 63 6f 72 72 75 70 74 65 64 2c 20 73 6f 20 74   corrupted, so t
3ca0: 68 65 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52  he PAGER_ERR_COR
3cb0: 52 55 50 54 20 62 69 74 20 69 73 20 73 65 74 20  RUPT bit is set 
3cc0: 69 6e 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 65 72  in.** pPager->er
3cd0: 72 4d 61 73 6b 20 61 6e 64 20 53 51 4c 49 54 45  rMask and SQLITE
3ce0: 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
3cf0: 72 6e 65 64 2e 20 20 49 66 20 69 74 20 61 6c 6c  rned.  If it all
3d00: 0a 2a 2a 20 77 6f 72 6b 73 2c 20 74 68 65 6e 20  .** works, then 
3d10: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
3d20: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
3d30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
3d40: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
3d50: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 6f  er *pPager){.  o
3d60: 66 66 5f 74 20 6e 52 65 63 3b 20 20 20 20 20 20  ff_t nRec;      
3d70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3d80: 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a  r of Records */.
3d90: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
3da0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
3db0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
3dc0: 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
3dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
3de0: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
3df0: 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
3e00: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
3e10: 72 20 61 4d 61 67 69 63 5b 73 69 7a 65 6f 66 28  r aMagic[sizeof(
3e20: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 3b  aJournalMagic)];
3e30: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
3e40: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
3e50: 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
3e60: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
3e70: 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66    Abort early if
3e80: 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
3e90: 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f  l is empty..  */
3ea0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
3eb0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
3ec0: 3b 0a 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b  ;.  sqliteOsSeek
3ed0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  (&pPager->jfd, 0
3ee0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
3ef0: 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67  OsFileSize(&pPag
3f00: 65 72 2d 3e 6a 66 64 2c 20 26 6e 52 65 63 29 3b  er->jfd, &nRec);
3f10: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
3f20: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
3f30: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
3f40: 20 7d 0a 20 20 69 66 28 20 6e 52 65 63 20 3c 3d   }.  if( nRec <=
3f50: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2b   sizeof(aMagic)+
3f60: 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20 29 7b 0a  sizeof(Pgno) ){.
3f70: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
3f80: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 6e 52 65  yback;.  }.  nRe
3f90: 63 20 3d 20 28 6e 52 65 63 20 2d 20 28 73 69 7a  c = (nRec - (siz
3fa0: 65 6f 66 28 61 4d 61 67 69 63 29 2b 73 69 7a 65  eof(aMagic)+size
3fb0: 6f 66 28 50 67 6e 6f 29 29 29 20 2f 20 73 69 7a  of(Pgno))) / siz
3fc0: 65 6f 66 28 50 61 67 65 52 65 63 6f 72 64 29 3b  eof(PageRecord);
3fd0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
3fe0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
3ff0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 72 75   journal and tru
4000: 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 64  ncate the.  ** d
4010: 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63  atabase file bac
4020: 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
4030: 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72  l size..  */.  r
4040: 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64  c = sqliteOsRead
4050: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  (&pPager->jfd, a
4060: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
4070: 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72 63  agic));.  if( rc
4080: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
4090: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50     rc = SQLITE_P
40a0: 52 4f 54 4f 43 4f 4c 3b 0a 20 20 20 20 67 6f 74  ROTOCOL;.    got
40b0: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
40c0: 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70    }.  if( memcmp
40d0: 28 61 4d 61 67 69 63 2c 20 61 4f 6c 64 4a 6f 75  (aMagic, aOldJou
40e0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
40f0: 66 28 61 4d 61 67 69 63 29 29 3d 3d 30 20 29 7b  f(aMagic))==0 ){
4100: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
4110: 72 6e 61 6c 46 6f 72 6d 61 74 20 3d 20 53 51 4c  rnalFormat = SQL
4120: 49 54 45 5f 4f 4c 44 5f 4a 4f 55 52 4e 41 4c 5f  ITE_OLD_JOURNAL_
4130: 46 4f 52 4d 41 54 3b 0a 20 20 7d 65 6c 73 65 20  FORMAT;.  }else 
4140: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
4150: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
4160: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
4170: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67  )==0 ){.    pPag
4180: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 46 6f 72 6d 61  er->journalForma
4190: 74 20 3d 20 53 51 4c 49 54 45 5f 4e 45 57 5f 4a  t = SQLITE_NEW_J
41a0: 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 3b 0a 20  OURNAL_FORMAT;. 
41b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
41c0: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
41d0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  ;.    goto end_p
41e0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72  layback;.  }.  r
41f0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
4200: 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
4210: 6a 66 64 2c 20 26 6d 78 50 67 29 3b 0a 20 20 69  jfd, &mxPg);.  i
4220: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4230: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
4240: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
4250: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 54 72   rc = sqliteOsTr
4260: 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e  uncate(&pPager->
4270: 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  fd, SQLITE_PAGE_
4280: 53 49 5a 45 2a 28 6f 66 66 5f 74 29 6d 78 50 67  SIZE*(off_t)mxPg
4290: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
42a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
42b0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
42c0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64  .  }.  pPager->d
42d0: 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
42e0: 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69  .  /* Copy origi
42f0: 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
4300: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
4310: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
4320: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
4330: 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d  */.  for(i=nRec-
4340: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
4350: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
4360: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
4370: 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
4380: 3e 6a 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  >jfd);.    if( r
4390: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
43a0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 70  reak;.  }..end_p
43b0: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
43c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
43d0: 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72 69 74      pager_unwrit
43e0: 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
43f0: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
4400: 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
4410: 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20  CORRUPT;.    rc 
4420: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
4430: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
4440: 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
4450: 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
4460: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4470: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
4480: 6b 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  k the checkpoint
4490: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
44a0: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
44b0: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
44c0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
44d0: 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68  journal but with
44e0: 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20  .** a few extra 
44f0: 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  twists..**.**   
4500: 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72   (1)  The number
4510: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
4520: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
4530: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
4540: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 63 68  *         the ch
4550: 65 63 6b 70 6f 69 6e 74 20 69 73 20 73 74 6f 72  eckpoint is stor
4560: 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 63 6b  ed in pPager->ck
4570: 70 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74  ptSize, not in t
4580: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f  he.**         jo
4590: 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c  urnal file itsel
45a0: 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  f..**.**    (2) 
45b0: 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
45c0: 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
45d0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
45e0: 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20  nal, also.**    
45f0: 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c       playback al
4600: 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 74  l pages of the t
4610: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
4620: 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20  al beginning.** 
4630: 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73 65          at offse
4640: 74 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53  t pPager->ckptJS
4650: 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
4660: 6e 74 20 70 61 67 65 72 5f 63 6b 70 74 5f 70 6c  nt pager_ckpt_pl
4670: 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
4680: 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 6e  ager){.  off_t n
4690: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
46a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
46b0: 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
46c0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
46d0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
46e0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
46f0: 3b 0a 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65  ;..  /* Truncate
4700: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61   the database ba
4710: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
4720: 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  al size..  */.  
4730: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 54 72 75  rc = sqliteOsTru
4740: 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66  ncate(&pPager->f
4750: 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  d, SQLITE_PAGE_S
4760: 49 5a 45 2a 28 6f 66 66 5f 74 29 70 50 61 67 65  IZE*(off_t)pPage
4770: 72 2d 3e 63 6b 70 74 53 69 7a 65 29 3b 0a 20 20  r->ckptSize);.  
4780: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
4790: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a   pPager->ckptSiz
47a0: 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  e;..  /* Figure 
47b0: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
47c0: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
47d0: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
47e0: 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  al..  */.  asser
47f0: 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49  t( pPager->ckptI
4800: 6e 55 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e  nUse && pPager->
4810: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
4820: 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70   sqliteOsSeek(&p
4830: 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 30 29 3b  Pager->cpfd, 0);
4840: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73  .  rc = sqliteOs
4850: 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
4860: 2d 3e 63 70 66 64 2c 20 26 6e 52 65 63 29 3b 0a  ->cpfd, &nRec);.
4870: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
4880: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
4890: 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63  end_ckpt_playbac
48a0: 6b 3b 0a 20 20 7d 0a 20 20 6e 52 65 63 20 2f 3d  k;.  }.  nRec /=
48b0: 20 73 69 7a 65 6f 66 28 50 61 67 65 52 65 63 6f   sizeof(PageReco
48c0: 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70  rd);.  .  /* Cop
48d0: 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
48e0: 20 6f 75 74 20 6f 66 20 74 68 65 20 63 68 65 63   out of the chec
48f0: 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  kpoint journal a
4900: 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
4910: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
4920: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
4930: 70 61 67 65 72 5f 6f 6c 64 5f 66 6f 72 6d 61 74  pager_old_format
4940: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
4950: 6a 6f 75 72 6e 61 6c 46 6f 72 6d 61 74 20 3d 20  journalFormat = 
4960: 53 51 4c 49 54 45 5f 4f 4c 44 5f 4a 4f 55 52 4e  SQLITE_OLD_JOURN
4970: 41 4c 5f 46 4f 52 4d 41 54 3b 0a 20 20 7d 65 6c  AL_FORMAT;.  }el
4980: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
4990: 6a 6f 75 72 6e 61 6c 46 6f 72 6d 61 74 20 3d 20  journalFormat = 
49a0: 53 51 4c 49 54 45 5f 4e 45 57 5f 4a 4f 55 52 4e  SQLITE_NEW_JOURN
49b0: 41 4c 5f 46 4f 52 4d 41 54 3b 0a 20 20 7d 0a 20  AL_FORMAT;.  }. 
49c0: 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69   for(i=nRec-1; i
49d0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72  >=0; i--){.    r
49e0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
49f0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
4a00: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 63 70 66  er, &pPager->cpf
4a10: 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
4a20: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
4a30: 20 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61   end_ckpt_playba
4a40: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  ck;.  }..  /* Fi
4a50: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
4a60: 79 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  y pages need to 
4a70: 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66  be copied out of
4a80: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
4a90: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 0a 20  .  ** journal.. 
4aa0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
4ab0: 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  eOsSeek(&pPager-
4ac0: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b  >jfd, pPager->ck
4ad0: 70 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ptJSize);.  if( 
4ae0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
4af0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 6b  .    goto end_ck
4b00: 70 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  pt_playback;.  }
4b10: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73  .  rc = sqliteOs
4b20: 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
4b30: 2d 3e 6a 66 64 2c 20 26 6e 52 65 63 29 3b 0a 20  ->jfd, &nRec);. 
4b40: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
4b50: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
4b60: 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b  nd_ckpt_playback
4b70: 3b 0a 20 20 7d 0a 20 20 6e 52 65 63 20 3d 20 28  ;.  }.  nRec = (
4b80: 6e 52 65 63 20 2d 20 70 50 61 67 65 72 2d 3e 63  nRec - pPager->c
4b90: 6b 70 74 4a 53 69 7a 65 29 2f 73 69 7a 65 6f 66  kptJSize)/sizeof
4ba0: 28 50 61 67 65 52 65 63 6f 72 64 29 3b 0a 20 20  (PageRecord);.  
4bb0: 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e  for(i=nRec-1; i>
4bc0: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63  =0; i--){.    rc
4bd0: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
4be0: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
4bf0: 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  r, &pPager->jfd)
4c00: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
4c10: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
4c20: 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b  nd_ckpt_playback
4c30: 3b 0a 20 20 7d 0a 20 20 0a 0a 65 6e 64 5f 63 6b  ;.  }.  ..end_ck
4c40: 70 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69  pt_playback:.  i
4c50: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4c60: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
4c70: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
4c80: 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20  _ERR_CORRUPT;.  
4c90: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
4ca0: 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  RRUPT;.  }.  ret
4cb0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4cc0: 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
4cd0: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
4ce0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
4cf0: 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  at are allowed..
4d00: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  **.** The maximu
4d10: 6d 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20  m number is the 
4d20: 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f  absolute value o
4d30: 66 20 74 68 65 20 6d 78 50 61 67 65 20 70 61 72  f the mxPage par
4d40: 61 6d 65 74 65 72 2e 0a 2a 2a 20 49 66 20 6d 78  ameter..** If mx
4d50: 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65  Page is negative
4d60: 2c 20 74 68 65 20 6e 6f 53 79 6e 63 20 66 6c 61  , the noSync fla
4d70: 67 20 69 73 20 61 6c 73 6f 20 73 65 74 2e 20 20  g is also set.  
4d80: 6e 6f 53 79 6e 63 20 62 79 70 61 73 73 65 73 0a  noSync bypasses.
4d90: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
4da0: 74 65 4f 73 53 79 6e 63 28 29 2e 20 20 54 68 65  teOsSync().  The
4db0: 20 70 61 67 65 72 20 72 75 6e 73 20 6d 75 63 68   pager runs much
4dc0: 20 66 61 73 74 65 72 20 77 69 74 68 20 6e 6f 53   faster with noS
4dd0: 79 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74 20 69  ync on,.** but i
4de0: 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
4df0: 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f  system crashes o
4e00: 72 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 62  r there is an ab
4e10: 72 75 70 74 20 70 6f 77 65 72 20 0a 2a 2a 20 66  rupt power .** f
4e20: 61 69 6c 75 72 65 2c 20 74 68 65 20 64 61 74 61  ailure, the data
4e30: 62 61 73 65 20 66 69 6c 65 20 6d 69 67 68 74 20  base file might 
4e40: 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  be left in an in
4e50: 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 0a 2a  consistent and.*
4e60: 2a 20 75 6e 72 65 70 61 69 72 61 62 6c 65 20 73  * unrepairable s
4e70: 74 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20  tate.  .*/.void 
4e80: 73 71 6c 69 74 65 70 61 67 65 72 5f 73 65 74 5f  sqlitepager_set_
4e90: 63 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  cachesize(Pager 
4ea0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
4eb0: 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61  age){.  if( mxPa
4ec0: 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  ge>=0 ){.    pPa
4ed0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
4ee0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
4ef0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
4f00: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b  ger->noSync = 1;
4f10: 0a 20 20 20 20 6d 78 50 61 67 65 20 3d 20 2d 6d  .    mxPage = -m
4f20: 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28  xPage;.  }.  if(
4f30: 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20   mxPage>10 ){.  
4f40: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
4f50: 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 7d   = mxPage;.  }.}
4f60: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74  ../*.** Open a t
4f70: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
4f80: 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  Write the name o
4f90: 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
4fa0: 7a 4e 61 6d 65 0a 2a 2a 20 28 7a 4e 61 6d 65 20  zName.** (zName 
4fb0: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
4fc0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45   SQLITE_TEMPNAME
4fd0: 5f 53 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e 67  _SIZE bytes long
4fe0: 2e 29 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65  .)  Write.** the
4ff0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
5000: 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75   into *fd.  Retu
5010: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
5020: 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a  success or some.
5030: 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  ** other error c
5040: 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a  ode if we fail..
5050: 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c  **.** The OS wil
5060: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
5070: 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  delete the tempo
5080: 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69  rary file when i
5090: 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a  t is.** closed..
50a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
50b0: 6c 69 74 65 70 61 67 65 72 5f 6f 70 65 6e 74 65  litepager_opente
50c0: 6d 70 28 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  mp(char *zFile, 
50d0: 4f 73 46 69 6c 65 20 2a 66 64 29 7b 0a 20 20 69  OsFile *fd){.  i
50e0: 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e  nt cnt = 8;.  in
50f0: 74 20 72 63 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  t rc;.  do{.    
5100: 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74  cnt--;.    sqlit
5110: 65 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28  eOsTempFileName(
5120: 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d  zFile);.    rc =
5130: 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e 45 78 63   sqliteOsOpenExc
5140: 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 66 64  lusive(zFile, fd
5150: 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  , 1);.  }while( 
5160: 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c  cnt>0 && rc!=SQL
5170: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75  ITE_OK );.  retu
5180: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5190: 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  Create a new pag
51a0: 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20  e cache and put 
51b0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
51c0: 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a   page cache in *
51d0: 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20  ppPager..** The 
51e0: 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
51f0: 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74  d need not exist
5200: 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e  .  The file is n
5210: 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a  ot locked until.
5220: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  ** the first cal
5230: 6c 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72  l to sqlitepager
5240: 5f 67 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e  _get() and is on
5250: 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74  ly held open unt
5260: 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70  il the.** last p
5270: 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20  age is released 
5280: 75 73 69 6e 67 20 73 71 6c 69 74 65 70 61 67 65  using sqlitepage
5290: 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a  r_unref()..**.**
52a0: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
52b0: 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e   NULL then a ran
52c0: 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70  domly-named temp
52d0: 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72  orary file is cr
52e0: 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65  eated.** and use
52f0: 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f  d as the file to
5300: 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65   be cached.  The
5310: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65   file will be de
5320: 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  leted.** automat
5330: 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69  ically when it i
5340: 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
5350: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6f 70 65   sqlitepager_ope
5360: 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  n(.  Pager **ppP
5370: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
5380: 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
5390: 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
53a0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
53b0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
53c0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
53d0: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
53e0: 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50  pen */.  int mxP
53f0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
5400: 20 20 2f 2a 20 4d 61 78 20 6e 75 6d 62 65 72 20    /* Max number 
5410: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  of in-memory cac
5420: 68 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  he pages */.  in
5430: 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
5440: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
5450: 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
5460: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
5470: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  age */.  int use
5480: 4a 6f 75 72 6e 61 6c 20 20 20 20 20 20 20 20 20  Journal         
5490: 20 20 2f 2a 20 54 52 55 45 20 74 6f 20 75 73 65    /* TRUE to use
54a0: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
54b0: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
54c0: 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a   */.){.  Pager *
54d0: 70 50 61 67 65 72 3b 0a 20 20 63 68 61 72 20 2a  pPager;.  char *
54e0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 3b 0a 20  zFullPathname;. 
54f0: 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20   int nameLen;.  
5500: 4f 73 46 69 6c 65 20 66 64 3b 0a 20 20 69 6e 74  OsFile fd;.  int
5510: 20 72 63 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46   rc;.  int tempF
5520: 69 6c 65 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f  ile;.  int readO
5530: 6e 6c 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  nly = 0;.  char 
5540: 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d  zTemp[SQLITE_TEM
5550: 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20  PNAME_SIZE];..  
5560: 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20  *ppPager = 0;.  
5570: 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f  if( sqlite_mallo
5580: 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  c_failed ){.    
5590: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
55a0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  MEM;.  }.  if( z
55b0: 46 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Filename ){.    
55c0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
55d0: 73 71 6c 69 74 65 4f 73 46 75 6c 6c 50 61 74 68  sqliteOsFullPath
55e0: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
55f0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
5600: 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
5610: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26  zFullPathname, &
5620: 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a  fd, &readOnly);.
5630: 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 30      tempFile = 0
5640: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
5650: 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f  c = sqlitepager_
5660: 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20  opentemp(zTemp, 
5670: 26 66 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  &fd);.    zFilen
5680: 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  ame = zTemp;.   
5690: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   zFullPathname =
56a0: 20 73 71 6c 69 74 65 4f 73 46 75 6c 6c 50 61 74   sqliteOsFullPat
56b0: 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  hname(zFilename)
56c0: 3b 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d  ;.    tempFile =
56d0: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   1;.  }.  if( sq
56e0: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
56f0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
5700: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
5710: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
5720: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
5730: 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61  liteFree(zFullPa
5740: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
5750: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
5760: 50 45 4e 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c  PEN;.  }.  nameL
5770: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c  en = strlen(zFul
5780: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50  lPathname);.  pP
5790: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c  ager = sqliteMal
57a0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61  loc( sizeof(*pPa
57b0: 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 32  ger) + nameLen*2
57c0: 20 2b 20 33 30 20 29 3b 0a 20 20 69 66 28 20 70   + 30 );.  if( p
57d0: 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Pager==0 ){.    
57e0: 73 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26 66  sqliteOsClose(&f
57f0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  d);.    sqliteFr
5800: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
5810: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
5820: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
5830: 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
5840: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50  ame = (char*)&pP
5850: 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65  ager[1];.  pPage
5860: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70  r->zJournal = &p
5870: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
5880: 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73  [nameLen+1];.  s
5890: 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46  trcpy(pPager->zF
58a0: 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61  ilename, zFullPa
58b0: 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70  thname);.  strcp
58c0: 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
58d0: 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  al, zFullPathnam
58e0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
58f0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
5900: 0a 20 20 73 74 72 63 70 79 28 26 70 50 61 67 65  .  strcpy(&pPage
5910: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65  r->zJournal[name
5920: 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  Len], "-journal"
5930: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
5940: 3d 20 66 64 3b 0a 20 20 70 50 61 67 65 72 2d 3e  = fd;.  pPager->
5950: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
5960: 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  .  pPager->useJo
5970: 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e  urnal = useJourn
5980: 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b  al;.  pPager->ck
5990: 70 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50  ptOpen = 0;.  pP
59a0: 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20  ager->ckptInUse 
59b0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
59c0: 52 65 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Ref = 0;.  pPage
59d0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
59e0: 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69    pPager->ckptSi
59f0: 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ze = 0;.  pPager
5a00: 2d 3e 63 6b 70 74 4a 53 69 7a 65 20 3d 20 30 3b  ->ckptJSize = 0;
5a10: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  .  pPager->nPage
5a20: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
5a30: 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3e  mxPage = mxPage>
5a40: 35 20 3f 20 6d 78 50 61 67 65 20 3a 20 31 30 3b  5 ? mxPage : 10;
5a50: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  .  pPager->state
5a60: 20 3d 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b   = SQLITE_UNLOCK
5a70: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  ;.  pPager->errM
5a80: 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ask = 0;.  pPage
5a90: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65  r->tempFile = te
5aa0: 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
5ab0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61  ->readOnly = rea
5ac0: 64 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d  dOnly;.  pPager-
5ad0: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
5ae0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
5af0: 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
5b00: 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61  le || !useJourna
5b10: 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  l;.  pPager->pFi
5b20: 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  rst = 0;.  pPage
5b30: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  r->pLast = 0;.  
5b40: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
5b50: 20 6e 45 78 74 72 61 3b 0a 20 20 6d 65 6d 73 65   nExtra;.  memse
5b60: 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
5b70: 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
5b80: 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 2a 70  r->aHash));.  *p
5b90: 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
5ba0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5bb0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
5bc0: 74 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  t the destructor
5bd0: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
5be0: 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74    If not NULL, t
5bf0: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
5c00: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20   called.** when 
5c10: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
5c20: 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65  unt on each page
5c30: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20   reaches zero.  
5c40: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63  The destructor c
5c50: 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  an.** be used to
5c60: 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d   clean up inform
5c70: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74  ation in the ext
5c80: 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e  ra segment appen
5c90: 64 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65  ded to each page
5ca0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74  ..**.** The dest
5cb0: 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61  ructor is not ca
5cc0: 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74  lled as a result
5cd0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f   sqlitepager_clo
5ce0: 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72  se().  .** Destr
5cf0: 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20  uctors are only 
5d00: 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65  called by sqlite
5d10: 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a  pager_unref()..*
5d20: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67  /.void sqlitepag
5d30: 65 72 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f  er_set_destructo
5d40: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
5d50: 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28 76   void (*xDesc)(v
5d60: 6f 69 64 2a 29 29 7b 0a 20 20 70 50 61 67 65 72  oid*)){.  pPager
5d70: 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20  ->xDestructor = 
5d80: 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xDesc;.}../*.** 
5d90: 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
5da0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
5db0: 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
5dc0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
5dd0: 68 0a 2a 2a 20 70 50 61 67 65 72 2e 0a 2a 2f 0a  h.** pPager..*/.
5de0: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
5df0: 70 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  pagecount(Pager 
5e00: 2a 70 50 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f  *pPager){.  off_
5e10: 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t n;.  assert( p
5e20: 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66  Pager!=0 );.  if
5e30: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
5e40: 3e 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  >=0 ){.    retur
5e50: 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  n pPager->dbSize
5e60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
5e70: 74 65 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  teOsFileSize(&pP
5e80: 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53  ager->fd, &n)!=S
5e90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5ea0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
5eb0: 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53  |= PAGER_ERR_DIS
5ec0: 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  K;.    return 0;
5ed0: 0a 20 20 7d 0a 20 20 6e 20 2f 3d 20 53 51 4c 49  .  }.  n /= SQLI
5ee0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  TE_PAGE_SIZE;.  
5ef0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
5f00: 65 21 3d 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b  e!=SQLITE_UNLOCK
5f10: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
5f20: 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d 0a  dbSize = n;.  }.
5f30: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
5f40: 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
5f50: 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
5f60: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
5f70: 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
5f80: 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
5f90: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
5fa0: 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
5fb0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5fc0: 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
5fd0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
5fe0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
5ff0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
6000: 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
6010: 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
6020: 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
6030: 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
6040: 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
6050: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
6060: 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
6070: 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
6080: 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
6090: 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
60a0: 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
60b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67  */.int sqlitepag
60c0: 65 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a  er_close(Pager *
60d0: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
60e0: 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
60f0: 20 73 77 69 74 63 68 28 20 70 50 61 67 65 72 2d   switch( pPager-
6100: 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61  >state ){.    ca
6110: 73 65 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c  se SQLITE_WRITEL
6120: 4f 43 4b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  OCK: {.      sql
6130: 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  itepager_rollbac
6140: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
6150: 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28   sqliteOsUnlock(
6160: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
6170: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
6180: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
6190: 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
61a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
61b0: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43  e SQLITE_READLOC
61c0: 4b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K: {.      sqlit
61d0: 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  eOsUnlock(&pPage
61e0: 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 62 72  r->fd);.      br
61f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
6200: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
6210: 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
6220: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6230: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50    }.  }.  for(pP
6240: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
6250: 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
6260: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67  .    pNext = pPg
6270: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
6280: 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
6290: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73 43  .  }.  sqliteOsC
62a0: 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64  lose(&pPager->fd
62b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
62c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
62d0: 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 54 65 6d 70  ==0 );.  /* Temp
62e0: 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d   files are autom
62f0: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
6300: 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20   by the OS.  ** 
6310: 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
6320: 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73  File ){.  **   s
6330: 71 6c 69 74 65 4f 73 44 65 6c 65 74 65 28 70 50  qliteOsDelete(pP
6340: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
6350: 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 20 20  ;.  ** }.  */.  
6360: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
6370: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
6380: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6390: 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
63a0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
63b0: 67 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e  given page data.
63c0: 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 70  .*/.Pgno sqlitep
63d0: 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28  ager_pagenumber(
63e0: 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
63f0: 50 67 48 64 72 20 2a 70 20 3d 20 44 41 54 41 5f  PgHdr *p = DATA_
6400: 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
6410: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e  .  return p->pgn
6420: 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  o;.}../*.** Incr
6430: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
6440: 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
6450: 70 61 67 65 2e 20 20 49 66 20 74 68 65 20 70 61  page.  If the pa
6460: 67 65 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  ge is.** current
6470: 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
6480: 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63  st (the referenc
6490: 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29  e count is zero)
64a0: 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20   then.** remove 
64b0: 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  it from the free
64c0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
64d0: 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67  void page_ref(Pg
64e0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
64f0: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
6500: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
6510: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e   is currently on
6520: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
6530: 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  Remove it. */.  
6540: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
6550: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
6560: 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
6570: 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
6580: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65  NextFree;.    }e
6590: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
65a0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
65b0: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
65c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
65d0: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
65e0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
65f0: 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
6600: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
6610: 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
6620: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
6630: 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
6640: 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  revFree;.    }. 
6650: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
6660: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50  nRef++;.  }.  pP
6670: 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46  g->nRef++;.  REF
6680: 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  INFO(pPg);.}../*
6690: 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
66a0: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
66b0: 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54  t for a page.  T
66c0: 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72  he input pointer
66d0: 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e   is.** a referen
66e0: 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  ce to the page d
66f0: 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ata..*/.int sqli
6700: 74 65 70 61 67 65 72 5f 72 65 66 28 76 6f 69 64  tepager_ref(void
6710: 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
6720: 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
6730: 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
6740: 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
6750: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6760: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
6770: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  c the journal an
6780: 64 20 74 68 65 6e 20 77 72 69 74 65 20 61 6c 6c  d then write all
6790: 20 66 72 65 65 20 64 69 72 74 79 20 70 61 67 65   free dirty page
67a0: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
67b0: 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  e.** file..**.**
67c0: 20 57 72 69 74 69 6e 67 20 61 6c 6c 20 66 72 65   Writing all fre
67d0: 65 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  e dirty pages to
67e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 66   the database af
67f0: 74 65 72 20 74 68 65 20 73 79 6e 63 20 69 73 20  ter the sync is 
6800: 61 0a 2a 2a 20 6e 6f 6e 2d 6f 62 76 69 6f 75 73  a.** non-obvious
6810: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
6820: 66 73 79 6e 63 28 29 20 69 73 20 61 6e 20 65 78  fsync() is an ex
6830: 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f  pensive operatio
6840: 6e 20 73 6f 20 77 65 0a 2a 2a 20 77 61 6e 74 20  n so we.** want 
6850: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  to minimize the 
6860: 6e 75 6d 62 65 72 20 6f 74 20 74 69 6d 65 73 20  number ot times 
6870: 69 74 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 66  it is called. Af
6880: 74 65 72 20 61 6e 20 66 73 79 6e 63 28 29 20 63  ter an fsync() c
6890: 61 6c 6c 2c 0a 2a 2a 20 77 65 20 61 72 65 20 66  all,.** we are f
68a0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 64 69 72  ree to write dir
68b0: 74 79 20 70 61 67 65 73 20 62 61 63 6b 20 74 6f  ty pages back to
68c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
68d0: 49 74 20 69 73 20 62 65 73 74 0a 2a 2a 20 74 6f  It is best.** to
68e0: 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 77 72   go ahead and wr
68f0: 69 74 65 20 61 73 20 6d 61 6e 79 20 64 69 72 74  ite as many dirt
6900: 79 20 70 61 67 65 73 20 61 73 20 70 6f 73 73 69  y pages as possi
6910: 62 6c 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20  ble to minimize 
6920: 0a 2a 2a 20 74 68 65 20 72 69 73 6b 20 6f 66 20  .** the risk of 
6930: 68 61 76 69 6e 67 20 74 6f 20 64 6f 20 61 6e 6f  having to do ano
6940: 74 68 65 72 20 66 73 79 6e 63 28 29 20 6c 61 74  ther fsync() lat
6950: 65 72 20 6f 6e 2e 20 20 57 72 69 74 69 6e 67 20  er on.  Writing 
6960: 64 69 72 74 79 0a 2a 2a 20 66 72 65 65 20 70 61  dirty.** free pa
6970: 67 65 73 20 69 6e 20 74 68 69 73 20 77 61 79 20  ges in this way 
6980: 77 61 73 20 6f 62 73 65 72 76 65 64 20 74 6f 20  was observed to 
6990: 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 6f 70  make database op
69a0: 65 72 61 74 69 6f 6e 73 20 67 6f 0a 2a 2a 20 75  erations go.** u
69b0: 70 20 74 6f 20 31 30 20 74 69 6d 65 73 20 66 61  p to 10 times fa
69c0: 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  ster..**.** If w
69d0: 65 20 61 72 65 20 77 72 69 74 69 6e 67 20 74 6f  e are writing to
69e0: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
69f0: 61 73 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ase, there is no
6a00: 20 6e 65 65 64 20 74 6f 20 70 72 65 73 65 72 76   need to preserv
6a10: 65 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67 72 69  e.** the integri
6a20: 74 79 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ty of the journa
6a30: 6c 20 66 69 6c 65 2c 20 73 6f 20 77 65 20 63 61  l file, so we ca
6a40: 6e 20 73 61 76 65 20 74 69 6d 65 20 61 6e 64 20  n save time and 
6a50: 73 6b 69 70 20 74 68 65 0a 2a 2a 20 66 73 79 6e  skip the.** fsyn
6a60: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  c()..*/.static i
6a70: 6e 74 20 73 79 6e 63 41 6c 6c 50 61 67 65 73 28  nt syncAllPages(
6a80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
6a90: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
6aa0: 50 67 6e 6f 20 6c 61 73 74 50 67 6e 6f 20 3d 20  Pgno lastPgno = 
6ab0: 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
6ac0: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53  LITE_OK;..  /* S
6ad0: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
6ae0: 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67  before modifying
6af0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
6b00: 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e  se.  ** (assumin
6b10: 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75  g there is a jou
6b20: 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64  rnal and it need
6b30: 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29  s to be synced.)
6b40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
6b50: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  er->needSync ){.
6b60: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
6b70: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
6b80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
6b90: 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66  Sync(&pPager->jf
6ba0: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  d);.      if( rc
6bb0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
6bc0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
6bd0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
6be0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
6bf0: 20 61 6c 6c 20 64 69 72 74 79 20 66 72 65 65 20   all dirty free 
6c00: 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 69 73  pages to the dis
6c10: 6b 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 74  k in the order t
6c20: 68 61 74 20 74 68 65 79 0a 20 20 2a 2a 20 61 70  hat they.  ** ap
6c30: 70 65 61 72 20 6f 6e 20 74 68 65 20 64 69 73 6b  pear on the disk
6c40: 2e 20 20 57 65 20 68 61 76 65 20 65 78 70 65 72  .  We have exper
6c50: 69 6d 65 6e 74 65 64 20 77 69 74 68 20 73 6f 72  imented with sor
6c60: 74 69 6e 67 20 74 68 65 20 70 61 67 65 73 0a 20  ting the pages. 
6c70: 20 2a 2a 20 62 79 20 70 61 67 65 20 6e 75 6d 62   ** by page numb
6c80: 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  ers so that they
6c90: 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 20   are written in 
6ca0: 6f 72 64 65 72 2c 20 62 75 74 20 74 68 61 74 20  order, but that 
6cb0: 64 6f 65 73 0a 20 20 2a 2a 20 6e 6f 74 20 61 70  does.  ** not ap
6cc0: 70 65 61 72 20 74 6f 20 69 6d 70 72 6f 76 65 20  pear to improve 
6cd0: 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 20 20 2a  performance..  *
6ce0: 2f 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  /.  for(pPg=pPag
6cf0: 65 72 2d 3e 70 46 69 72 73 74 3b 20 70 50 67 3b  er->pFirst; pPg;
6d00: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 46   pPg=pPg->pNextF
6d10: 72 65 65 29 7b 0a 20 20 20 20 69 66 28 20 70 50  ree){.    if( pP
6d20: 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
6d30: 20 20 69 66 28 20 6c 61 73 74 50 67 6e 6f 3d 3d    if( lastPgno==
6d40: 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 21 3d  0 || pPg->pgno!=
6d50: 6c 61 73 74 50 67 6e 6f 2b 31 20 29 7b 0a 20 20  lastPgno+1 ){.  
6d60: 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 53 65        sqliteOsSe
6d70: 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ek(&pPager->fd, 
6d80: 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 28 6f  (pPg->pgno-1)*(o
6d90: 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45  ff_t)SQLITE_PAGE
6da0: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 7d 0a  _SIZE);.      }.
6db0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6dc0: 65 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  eOsWrite(&pPager
6dd0: 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
6de0: 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54 45  ATA(pPg), SQLITE
6df0: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
6e00: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
6e10: 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20  E_OK ) break;.  
6e20: 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
6e30: 20 30 3b 0a 20 20 20 20 20 20 6c 61 73 74 50 67   0;.      lastPg
6e40: 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
6e50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6e60: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6e70: 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
6e80: 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
6e90: 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
6ea0: 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
6eb0: 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
6ec0: 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
6ed0: 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
6ee0: 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
6ef0: 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
6f00: 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
6f10: 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73  .** A _get works
6f20: 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75   for any page nu
6f30: 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
6f40: 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74  n 0.  If the dat
6f50: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
6f60: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
6f70: 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
6f80: 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c  , then no actual
6f90: 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63   disk.** read oc
6fa0: 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d  curs and the mem
6fb0: 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
6fc0: 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
6fd0: 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a  ized to.** all z
6fe0: 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61  eros.  The extra
6ff0: 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
7000: 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
7010: 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a  ys initialized.*
7020: 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66  * to zeros the f
7030: 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
7040: 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
7050: 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
7060: 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
7070: 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
7080: 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
7090: 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
70a0: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
70b0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
70c0: 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
70d0: 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
70e0: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
70f0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6c 6f 6f   sqlitepager_loo
7100: 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
7110: 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c  s routine and _l
7120: 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a  ookup() attempt.
7130: 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ** to find a pag
7140: 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e in the in-memo
7150: 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20  ry cache first. 
7160: 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
7170: 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
7180: 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72  n memory, this r
7190: 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64  outine goes to d
71a0: 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69  isk to read it i
71b0: 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75  n whereas _looku
71c0: 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75  p().** just retu
71d0: 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75  rns 0.  This rou
71e0: 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20  tine acquires a 
71f0: 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69  read-lock the fi
7200: 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68  rst time it.** h
7210: 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b  as to go to disk
7220: 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f  , and could also
7230: 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64   playback an old
7240: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65   journal if nece
7250: 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20  ssary..** Since 
7260: 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20  _lookup() never 
7270: 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
7280: 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
7290: 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
72a0: 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
72b0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
72c0: 70 61 67 65 72 5f 67 65 74 28 50 61 67 65 72 20  pager_get(Pager 
72d0: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
72e0: 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67  no, void **ppPag
72f0: 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  e){.  PgHdr *pPg
7300: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  ;.  int rc;..  /
7310: 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
7320: 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
7330: 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
7340: 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 50 61  .  */ .  if( pPa
7350: 67 65 72 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  ger==0 || pgno==
7360: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
7370: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
7380: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
7390: 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45  errMask & ~(PAGE
73a0: 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20  R_ERR_FULL) ){. 
73b0: 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
73c0: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
73d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
73e0: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
73f0: 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74  page accessed, t
7400: 68 65 6e 20 67 65 74 20 61 20 72 65 61 64 20 6c  hen get a read l
7410: 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
7420: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
7430: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
7440: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
7450: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65   rc = sqliteOsRe
7460: 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  adLock(&pPager->
7470: 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  fd);.    if( rc!
7480: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7490: 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
74a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
74b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
74c0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49  er->state = SQLI
74d0: 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 0a 20 20  TE_READLOCK;..  
74e0: 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
74f0: 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74  l file exists, t
7500: 72 79 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61  ry to play it ba
7510: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ck..    */.    i
7520: 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  f( pPager->useJo
7530: 75 72 6e 61 6c 20 26 26 20 73 71 6c 69 74 65 4f  urnal && sqliteO
7540: 73 46 69 6c 65 45 78 69 73 74 73 28 70 50 61 67  sFileExists(pPag
7550: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b  er->zJournal) ){
7560: 0a 20 20 20 20 20 20 20 69 6e 74 20 72 63 2c 20  .       int rc, 
7570: 64 75 6d 6d 79 3b 0a 0a 20 20 20 20 20 20 20 2f  dummy;..       /
7580: 2a 20 47 65 74 20 61 20 77 72 69 74 65 20 6c 6f  * Get a write lo
7590: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
75a0: 73 65 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  se.       */.   
75b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
75c0: 73 57 72 69 74 65 4c 6f 63 6b 28 26 70 50 61 67  sWriteLock(&pPag
75d0: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20  er->fd);.       
75e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
75f0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 69 66  K ){.         if
7600: 28 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b  ( sqliteOsUnlock
7610: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 21 3d 53  (&pPager->fd)!=S
7620: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7630: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73         /* This s
7640: 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
7650: 65 6e 21 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  en! */.         
7660: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e    rc = SQLITE_IN
7670: 54 45 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  TERNAL;.        
7680: 20 7d 0a 20 20 20 20 20 20 20 20 20 2a 70 70 50   }.         *ppP
7690: 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
76a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
76b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61      }.       pPa
76c0: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
76d0: 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a 0a  ITE_WRITELOCK;..
76e0: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74         /* Open t
76f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 65  he journal for e
7700: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 2e  xclusive access.
7710: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
7720: 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 2a  BUSY if.       *
7730: 2a 20 77 65 20 63 61 6e 6e 6f 74 20 67 65 74 20  * we cannot get 
7740: 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
7750: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
7760: 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a  file. .       **
7770: 0a 20 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20  .       ** Even 
7780: 74 68 6f 75 67 68 20 77 65 20 77 69 6c 6c 20 6f  though we will o
7790: 6e 6c 79 20 62 65 20 72 65 61 64 69 6e 67 20 66  nly be reading f
77a0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
77b0: 20 6e 6f 74 20 77 72 69 74 69 6e 67 2c 0a 20 20   not writing,.  
77c0: 20 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20       ** we have 
77d0: 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
77e0: 6e 61 6c 20 66 6f 72 20 77 72 69 74 69 6e 67 20  nal for writing 
77f0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6f 62 74 61  in order to obta
7800: 69 6e 20 61 6e 0a 20 20 20 20 20 20 20 2a 2a 20  in an.       ** 
7810: 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
7820: 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f   lock..       */
7830: 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  .       rc = sql
7840: 69 74 65 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  iteOsOpenReadWri
7850: 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
7860: 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  nal, &pPager->jf
7870: 64 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  d, &dummy);.    
7880: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
7890: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
78a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 55 6e   rc = sqliteOsUn
78b0: 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
78c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65  );.         asse
78d0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
78e0: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 2a 70  K );.         *p
78f0: 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
7900: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7910: 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 7d  E_BUSY;.       }
7920: 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
7930: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
7940: 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  ..       /* Play
7950: 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
7960: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
7970: 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
7980: 77 72 69 74 65 0a 20 20 20 20 20 20 20 2a 2a 20  write.       ** 
7990: 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69  lock and reacqui
79a0: 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  re the read lock
79b0: 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ..       */.    
79c0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
79d0: 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  ayback(pPager);.
79e0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
79f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7a00: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
7a10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20         }.    }. 
7a20: 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65     pPg = 0;.  }e
7a30: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72  lse{.    /* Sear
7a40: 63 68 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63  ch for page in c
7a50: 61 63 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20  ache */.    pPg 
7a60: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
7a70: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
7a80: 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  }.  if( pPg==0 )
7a90: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
7aa0: 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
7ab0: 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  ot in the page c
7ac0: 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  ache. */.    int
7ad0: 20 68 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   h;.    pPager->
7ae0: 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66 28  nMiss++;.    if(
7af0: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70   pPager->nPage<p
7b00: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c  Pager->mxPage ||
7b10: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
7b20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  =0 ){.      /* C
7b30: 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
7b40: 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20   */.      pPg = 
7b50: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
7b60: 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20   sizeof(*pPg) + 
7b70: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
7b80: 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
7b90: 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  a );.      if( p
7ba0: 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Pg==0 ){.       
7bb0: 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
7bc0: 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72        pager_unwr
7bd0: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
7be0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
7bf0: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
7c00: 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20 20  R_ERR_MEM;.     
7c10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7c20: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
7c30: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
7c40: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67  , 0, sizeof(*pPg
7c50: 29 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  ));.      pPg->p
7c60: 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
7c70: 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
7c80: 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41  All = pPager->pA
7c90: 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ll;.      if( pP
7ca0: 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20  ager->pAll ){.  
7cb0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41        pPager->pA
7cc0: 6c 6c 2d 3e 70 50 72 65 76 41 6c 6c 20 3d 20 70  ll->pPrevAll = p
7cd0: 50 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Pg;.      }.    
7ce0: 20 20 70 50 67 2d 3e 70 50 72 65 76 41 6c 6c 20    pPg->pPrevAll 
7cf0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
7d00: 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20  r->pAll = pPg;. 
7d10: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61       pPager->nPa
7d20: 67 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ge++;.    }else{
7d30: 0a 20 20 20 20 20 20 2f 2a 20 52 65 63 79 63 6c  .      /* Recycl
7d40: 65 20 61 6e 20 6f 6c 64 65 72 20 70 61 67 65 2e  e an older page.
7d50: 20 20 46 69 72 73 74 20 6c 6f 63 61 74 65 20 74    First locate t
7d60: 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 72 65  he page to be re
7d70: 63 79 63 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a  cycled..      **
7d80: 20 54 72 79 20 74 6f 20 66 69 6e 64 20 6f 6e 65   Try to find one
7d90: 20 74 68 61 74 20 69 73 20 6e 6f 74 20 64 69 72   that is not dir
7da0: 74 79 20 61 6e 64 20 69 73 20 6e 65 61 72 20 74  ty and is near t
7db0: 68 65 20 68 65 61 64 20 6f 66 0a 20 20 20 20 20  he head of.     
7dc0: 20 2a 2a 20 6f 66 20 74 68 65 20 66 72 65 65 20   ** of the free 
7dd0: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 70 50  list */.      pP
7de0: 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72  g = pPager->pFir
7df0: 73 74 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  st;.      while(
7e00: 20 70 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72   pPg && pPg->dir
7e10: 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ty ){.        pP
7e20: 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  g = pPg->pNextFr
7e30: 65 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ee;.      }..   
7e40: 20 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c     /* If we coul
7e50: 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67  d not find a pag
7e60: 65 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 62  e that has not b
7e70: 65 65 6e 20 75 73 65 64 20 72 65 63 65 6e 74 6c  een used recentl
7e80: 79 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 77  y.      ** and w
7e90: 68 69 63 68 20 69 73 20 6e 6f 74 20 64 69 72 74  hich is not dirt
7ea0: 79 2c 20 74 68 65 6e 20 73 79 6e 63 20 74 68 65  y, then sync the
7eb0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 77 72 69   journal and wri
7ec0: 74 65 20 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  te all.      ** 
7ed0: 64 69 72 74 79 20 66 72 65 65 20 70 61 67 65 73  dirty free pages
7ee0: 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
7ef0: 73 65 20 66 69 6c 65 2c 20 74 68 75 73 20 6d 61  se file, thus ma
7f00: 6b 69 6e 67 20 74 68 65 6d 0a 20 20 20 20 20 20  king them.      
7f10: 2a 2a 20 63 6c 65 61 6e 20 70 61 67 65 73 20 61  ** clean pages a
7f20: 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  nd available for
7f30: 20 72 65 63 79 63 6c 69 6e 67 2e 0a 20 20 20 20   recycling..    
7f40: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 65    **.      ** We
7f50: 20 68 61 76 65 20 74 6f 20 73 79 6e 63 20 74 68   have to sync th
7f60: 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
7f70: 20 77 72 69 74 69 6e 67 20 61 20 70 61 67 65 20   writing a page 
7f80: 74 6f 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20  to the main.    
7f90: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20    ** database.  
7fa0: 42 75 74 20 73 79 6e 63 69 6e 67 20 69 73 20 61  But syncing is a
7fb0: 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61   very slow opera
7fc0: 74 69 6f 6e 2e 20 20 53 6f 20 61 66 74 65 72 20  tion.  So after 
7fd0: 61 0a 20 20 20 20 20 20 2a 2a 20 73 79 6e 63 2c  a.      ** sync,
7fe0: 20 69 74 20 69 73 20 62 65 73 74 20 74 6f 20 77   it is best to w
7ff0: 72 69 74 65 20 65 76 65 72 79 74 68 69 6e 67 20  rite everything 
8000: 77 65 20 63 61 6e 20 62 61 63 6b 20 74 6f 20 74  we can back to t
8010: 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 2a 2a  he main.      **
8020: 20 64 61 74 61 62 61 73 65 20 74 6f 20 6d 69 6e   database to min
8030: 69 6d 69 7a 65 20 74 68 65 20 72 69 73 6b 20 6f  imize the risk o
8040: 66 20 68 61 76 69 6e 67 20 74 6f 20 73 79 6e 63  f having to sync
8050: 20 61 67 61 69 6e 20 69 6e 20 74 68 65 0a 20 20   again in the.  
8060: 20 20 20 20 2a 2a 20 6e 65 61 72 20 66 75 74 75      ** near futu
8070: 72 65 2e 20 20 54 68 61 74 20 69 73 20 77 68 79  re.  That is why
8080: 20 77 65 20 77 72 69 74 65 20 61 6c 6c 20 64 69   we write all di
8090: 72 74 79 20 70 61 67 65 73 20 61 66 74 65 72 20  rty pages after 
80a0: 61 0a 20 20 20 20 20 20 2a 2a 20 73 79 6e 63 2e  a.      ** sync.
80b0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
80c0: 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
80d0: 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73        int rc = s
80e0: 79 6e 63 41 6c 6c 50 61 67 65 73 28 70 50 61 67  yncAllPages(pPag
80f0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
8100: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
8110: 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f      sqlitepager_
8120: 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
8130: 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 50  ;.          *ppP
8140: 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
8150: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8160: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20  _IOERR;.        
8170: 7d 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20  }.        pPg = 
8180: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
8190: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
81a0: 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d  sert( pPg->nRef=
81b0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
81c0: 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d  rt( pPg->dirty==
81d0: 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  0 );..      /* I
81e0: 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  f the page we ar
81f0: 65 20 72 65 63 79 63 6c 79 69 6e 67 20 69 73 20  e recyclying is 
8200: 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
8210: 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20  Rollback, then. 
8220: 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20       ** set the 
8230: 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c  global alwaysRol
8240: 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73  lback flag, thus
8250: 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20   disabling the. 
8260: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64       ** sqlite_d
8270: 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f  ont_rollback() o
8280: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
8290: 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73  the rest of this
82a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
82b0: 20 20 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63      ** It is nec
82c0: 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69  essary to do thi
82d0: 73 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  s because the pa
82e0: 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73  ge marked always
82f0: 52 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a  Rollback.      *
8300: 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61  * might be reloa
8310: 64 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74  ded at a later t
8320: 69 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20  ime but at that 
8330: 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72  point we won't r
8340: 65 6d 65 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a  emember.      **
8350: 20 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72   that is was mar
8360: 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  ked alwaysRollba
8370: 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ck.  This means 
8380: 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d  that all pages m
8390: 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  ust.      ** be 
83a0: 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
83b0: 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65  Rollback from he
83c0: 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 20 20 20  re on out..     
83d0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
83e0: 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
83f0: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  k ){.        pPa
8400: 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
8410: 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ack = 1;.      }
8420: 0a 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 69 6e  ..      /* Unlin
8430: 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66  k the old page f
8440: 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73  rom the free lis
8450: 74 20 61 6e 64 20 74 68 65 20 68 61 73 68 20 74  t and the hash t
8460: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20  able.      */.  
8470: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
8480: 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  evFree ){.      
8490: 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
84a0: 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
84b0: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
84c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
84d0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
84e0: 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29  r->pFirst==pPg )
84f0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
8500: 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e  ->pFirst = pPg->
8510: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20  pNextFree;.     
8520: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
8530: 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20  ->pNextFree ){. 
8540: 20 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78         pPg->pNex
8550: 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
8560: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
8570: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
8580: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8590: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70  pPager->pLast==p
85a0: 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  Pg );.        pP
85b0: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
85c0: 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
85d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
85e0: 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
85f0: 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b  ->pPrevFree = 0;
8600: 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
8610: 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
8620: 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48       pPg->pNextH
8630: 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
8640: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b   pPg->pPrevHash;
8650: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8660: 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  f( pPg->pPrevHas
8670: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  h ){.        pPg
8680: 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65  ->pPrevHash->pNe
8690: 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e  xtHash = pPg->pN
86a0: 65 78 74 48 61 73 68 3b 0a 20 20 20 20 20 20 7d  extHash;.      }
86b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 68 20  else{.        h 
86c0: 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 50 67  = pager_hash(pPg
86d0: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
86e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
86f0: 3e 61 48 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29  >aHash[h]==pPg )
8700: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
8710: 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
8720: 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 20  ->pNextHash;.   
8730: 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e     }.      pPg->
8740: 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
8750: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
8760: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4f        pPager->nO
8770: 76 66 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  vfl++;.    }.   
8780: 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e   pPg->pgno = pgn
8790: 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  o;.    if( pPage
87a0: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26  r->aInJournal &&
87b0: 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67   (int)pgno<=pPag
87c0: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
87d0: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
87e0: 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72  ournal = (pPager
87f0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e  ->aInJournal[pgn
8800: 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f  o/8] & (1<<(pgno
8810: 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 7d 65  &7)))!=0;.    }e
8820: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
8830: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
8840: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
8850: 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 26 26 20  ger->aInCkpt && 
8860: 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
8870: 72 2d 3e 63 6b 70 74 53 69 7a 65 0a 20 20 20 20  r->ckptSize.    
8880: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61           && (pPa
8890: 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70 67 6e  ger->aInCkpt[pgn
88a0: 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f  o/8] & (1<<(pgno
88b0: 26 37 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  &7)))!=0 ){.    
88c0: 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b    page_add_to_ck
88d0: 70 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  pt_list(pPg);.  
88e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
88f0: 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f  age_remove_from_
8900: 63 6b 70 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  ckpt_list(pPg);.
8910: 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64      }.    pPg->d
8920: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  irty = 0;.    pP
8930: 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  g->nRef = 1;.   
8940: 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20   REFINFO(pPg);. 
8950: 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b     pPager->nRef+
8960: 2b 3b 0a 20 20 20 20 68 20 3d 20 70 61 67 65 72  +;.    h = pager
8970: 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20  _hash(pgno);.   
8980: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
8990: 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
89a0: 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  h];.    pPager->
89b0: 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
89c0: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65      if( pPg->pNe
89d0: 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  xtHash ){.      
89e0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
89f0: 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
8a00: 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  h==0 );.      pP
8a10: 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
8a20: 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
8a30: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
8a40: 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 29 20  ger->dbSize<0 ) 
8a50: 73 71 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65  sqlitepager_page
8a60: 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
8a70: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
8a80: 62 53 69 7a 65 3c 28 69 6e 74 29 70 67 6e 6f 20  bSize<(int)pgno 
8a90: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
8aa0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
8ab0: 67 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41  g), 0, SQLITE_PA
8ac0: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 65  GE_SIZE);.    }e
8ad0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  lse{.      int r
8ae0: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f  c;.      sqliteO
8af0: 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66  sSeek(&pPager->f
8b00: 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 6f 66 66  d, (pgno-1)*(off
8b10: 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  _t)SQLITE_PAGE_S
8b20: 49 5a 45 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  IZE);.      rc =
8b30: 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28 26 70   sqliteOsRead(&p
8b40: 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52  Pager->fd, PGHDR
8b50: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53  _TO_DATA(pPg), S
8b60: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
8b70: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
8b80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8b90: 20 20 20 20 20 6f 66 66 5f 74 20 66 69 6c 65 53       off_t fileS
8ba0: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
8bb0: 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a   sqliteOsFileSiz
8bc0: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 26 66  e(&pPager->fd,&f
8bd0: 69 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49 54 45  ileSize)!=SQLITE
8be0: 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20  _OK.            
8bf0: 20 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e 3d     || fileSize>=
8c00: 70 67 6e 6f 2a 53 51 4c 49 54 45 5f 50 41 47 45  pgno*SQLITE_PAGE
8c10: 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
8c20: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
8c30: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8c40: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47         memset(PG
8c50: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
8c60: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  , 0, SQLITE_PAGE
8c70: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20  _SIZE);.        
8c80: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
8c90: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
8ca0: 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20  nExtra>0 ){.    
8cb0: 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
8cc0: 4f 5f 45 58 54 52 41 28 70 50 67 29 2c 20 30 2c  O_EXTRA(pPg), 0,
8cd0: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
8ce0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
8cf0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
8d00: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e  ested page is in
8d10: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
8d20: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
8d30: 6e 48 69 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65  nHit++;.    page
8d40: 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20  _ref(pPg);.  }. 
8d50: 20 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44 52   *ppPage = PGHDR
8d60: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
8d70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8d80: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  K;.}../*.** Acqu
8d90: 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
8da0: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
8db0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
8dc0: 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
8dd0: 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
8de0: 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
8df0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
8e00: 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
8e10: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
8e20: 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  t in cache..**.*
8e30: 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
8e40: 65 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54  epager_get().  T
8e50: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
8e60: 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
8e70: 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
8e80: 70 61 67 65 72 5f 67 65 74 28 29 20 69 73 20 74  pager_get() is t
8e90: 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
8ea0: 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
8eb0: 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
8ec0: 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
8ed0: 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
8ee0: 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
8ef0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
8f00: 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
8f10: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
8f20: 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
8f30: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
8f40: 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
8f50: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ed..*/.void *sql
8f60: 69 74 65 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  itepager_lookup(
8f70: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
8f80: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
8f90: 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 4d  dr *pPg;..  /* M
8fa0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
8fb0: 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69   not hit any cri
8fc0: 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20  tical errors..  
8fd0: 2a 2f 20 0a 20 20 69 66 28 20 70 50 61 67 65 72  */ .  if( pPager
8fe0: 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 29  ==0 || pgno==0 )
8ff0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
9000: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
9010: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41  ->errMask & ~(PA
9020: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b  GER_ERR_FULL) ){
9030: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
9040: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
9050: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
9060: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
9070: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
9080: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
9090: 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  ;.  if( pPg==0 )
90a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 61 67   return 0;.  pag
90b0: 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65  e_ref(pPg);.  re
90c0: 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41  turn PGHDR_TO_DA
90d0: 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  TA(pPg);.}../*.*
90e0: 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
90f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
9100: 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
9110: 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
9120: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
9130: 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
9140: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
9150: 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
9160: 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
9170: 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
9180: 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
9190: 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
91a0: 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
91b0: 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
91c0: 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74   removed..*/.int
91d0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72   sqlitepager_unr
91e0: 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  ef(void *pData){
91f0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
9200: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
9210: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
9220: 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  nt for this page
9230: 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 44 41  .  */.  pPg = DA
9240: 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
9250: 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  a);.  assert( pP
9260: 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  g->nRef>0 );.  p
9270: 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45  Pg->nRef--;.  RE
9280: 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 2f  FINFO(pPg);..  /
9290: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
92a0: 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
92b0: 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68 20  to a page reach 
92c0: 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a  0, call the.  **
92d0: 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20   destructor and 
92e0: 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20  add the page to 
92f0: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20  the freelist..  
9300: 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  */.  if( pPg->nR
9310: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67  ef==0 ){.    Pag
9320: 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20  er *pPager;.    
9330: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
9340: 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70  ager;.    pPg->p
9350: 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20  NextFree = 0;.  
9360: 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
9370: 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74   = pPager->pLast
9380: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c  ;.    pPager->pL
9390: 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69  ast = pPg;.    i
93a0: 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
93b0: 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
93c0: 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
93d0: 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20  Free = pPg;.    
93e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
93f0: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
9400: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
9410: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
9420: 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50  ctor ){.      pP
9430: 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
9440: 72 28 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  r(pData);.    }.
9450: 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61    .    /* When a
9460: 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74  ll pages reach t
9470: 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f  he freelist, dro
9480: 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20  p the read lock 
9490: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
94a0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
94b0: 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
94c0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73  ->nRef--;.    as
94d0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52  sert( pPager->nR
94e0: 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ef>=0 );.    if(
94f0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
9500: 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
9510: 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
9520: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9530: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
9540: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a  /*.** Create a j
9550: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
9560: 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73  pPager.  There s
9570: 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
9580: 20 61 20 77 72 69 74 65 0a 2a 2a 20 6c 6f 63 6b   a write.** lock
9590: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
95a0: 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
95b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
95c0: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
95d0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
95e0: 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e  rything.  Return
95f0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
9600: 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a  nd release the.*
9610: 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20  * write lock if 
9620: 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
9630: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
9640: 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
9650: 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
9660: 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
9670: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9680: 2d 3e 73 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ->state==SQLITE_
9690: 57 52 49 54 45 4c 4f 43 4b 20 29 3b 0a 20 20 61  WRITELOCK );.  a
96a0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
96b0: 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
96c0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
96d0: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
96e0: 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
96f0: 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61  urnal = sqliteMa
9700: 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62  lloc( pPager->db
9710: 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
9720: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  if( pPager->aInJ
9730: 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
9740: 20 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63   sqliteOsReadLoc
9750: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  k(&pPager->fd);.
9760: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
9770: 65 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4c  e = SQLITE_READL
9780: 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
9790: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
97a0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f  }.  rc = sqliteO
97b0: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70  sOpenExclusive(p
97c0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
97d0: 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 70 50   &pPager->jfd,pP
97e0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
97f0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
9800: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
9810: 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
9820: 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
9830: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
9840: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  al = 0;.    sqli
9850: 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70 50  teOsReadLock(&pP
9860: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 70  ager->fd);.    p
9870: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53  Pager->state = S
9880: 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a  QLITE_READLOCK;.
9890: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
98a0: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a  E_CANTOPEN;.  }.
98b0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
98c0: 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61  lOpen = 1;.  pPa
98d0: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
98e0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77  0;.  pPager->alw
98f0: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  aysRollback = 0;
9900: 0a 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70  .  sqlitepager_p
9910: 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
9920: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  ;.  pPager->orig
9930: 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
9940: 3e 64 62 53 69 7a 65 3b 0a 20 20 69 66 28 20 70  >dbSize;.  if( p
9950: 61 67 65 72 5f 6f 6c 64 5f 66 6f 72 6d 61 74 20  ager_old_format 
9960: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
9970: 74 65 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  teOsWrite(&pPage
9980: 72 2d 3e 6a 66 64 2c 20 61 4f 6c 64 4a 6f 75 72  r->jfd, aOldJour
9990: 6e 61 6c 4d 61 67 69 63 2c 0a 20 20 20 20 20 20  nalMagic,.      
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99b0: 20 73 69 7a 65 6f 66 28 61 4f 6c 64 4a 6f 75 72   sizeof(aOldJour
99c0: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 7d 65  nalMagic));.  }e
99d0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
99e0: 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61  liteOsWrite(&pPa
99f0: 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
9a00: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
9a10: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
9a20: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
9a30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9a40: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
9a50: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
9a60: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
9a70: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
9a80: 2d 3e 63 6b 70 74 41 75 74 6f 6f 70 65 6e 20 26  ->ckptAutoopen &
9a90: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
9aa0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
9ab0: 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 62 65 67  tepager_ckpt_beg
9ac0: 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  in(pPager);.  }.
9ad0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9ae0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
9af0: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
9b00: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
9b10: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
9b20: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
9b30: 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
9b40: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
9b50: 63 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  c;  .}../*.** Ac
9b60: 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
9b70: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
9b80: 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73  se.  The lock is
9b90: 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a   removed when.**
9ba0: 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20   the any of the 
9bb0: 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e  following happen
9bc0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  :.**.**   *  sql
9bd0: 69 74 65 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28  itepager_commit(
9be0: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
9bf0: 20 20 2a 20 20 73 71 6c 69 74 65 70 61 67 65 72    *  sqlitepager
9c00: 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63  _rollback() is c
9c10: 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
9c20: 71 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f 73 65  qlitepager_close
9c30: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
9c40: 20 20 20 2a 20 20 73 71 6c 69 74 65 70 61 67 65     *  sqlitepage
9c50: 72 5f 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c  r_unref() is cal
9c60: 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20  led to on every 
9c70: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
9c80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61  ..**.** The para
9c90: 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f  meter to this ro
9ca0: 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74  utine is a point
9cb0: 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70  er to any open p
9cc0: 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  age of the.** da
9cd0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
9ce0: 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62  thing changes ab
9cf0: 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69  out the page - i
9d00: 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79  t is used merely
9d10: 0a 2a 2a 20 74 6f 20 61 63 71 75 69 72 65 20 61  .** to acquire a
9d20: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
9d30: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
9d40: 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61  and as proof tha
9d50: 74 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6c  t there.** is al
9d60: 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
9d70: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
9d80: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e  e..**.** A journ
9d90: 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
9da0: 64 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74  d if this is not
9db0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
9dc0: 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 65 6d 70 6f  e.  For.** tempo
9dd0: 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20  rary files, the 
9de0: 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a  opening of the j
9df0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64  ournal file is d
9e00: 65 66 65 72 72 65 64 20 75 6e 74 69 6c 0a 2a 2a  eferred until.**
9e10: 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 63 74   there is an act
9e20: 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74  ual need to writ
9e30: 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
9e40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
9e50: 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
9e60: 64 79 20 77 72 69 74 65 2d 6c 6f 63 6b 65 64 2c  dy write-locked,
9e70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
9e80: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74   a no-op..*/.int
9e90: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 62 65 67   sqlitepager_beg
9ea0: 69 6e 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  in(void *pData){
9eb0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
9ec0: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
9ed0: 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70  ata);.  Pager *p
9ee0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
9ef0: 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
9f00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
9f10: 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
9f20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9f30: 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c  ager->state!=SQL
9f40: 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  ITE_UNLOCK );.  
9f50: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
9f60: 65 3d 3d 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f  e==SQLITE_READLO
9f70: 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
9f80: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
9f90: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72  rnal==0 );.    r
9fa0: 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74  c = sqliteOsWrit
9fb0: 65 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  eLock(&pPager->f
9fc0: 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
9fd0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9fe0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
9ff0: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
a000: 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 57  state = SQLITE_W
a010: 52 49 54 45 4c 4f 43 4b 3b 0a 20 20 20 20 70 50  RITELOCK;.    pP
a020: 61 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 20  ager->dirtyFile 
a030: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 0;.    if( pPa
a040: 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
a050: 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
a060: 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63  File ){.      rc
a070: 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
a080: 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
a090: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a0a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
a0b0: 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20  ark a data page 
a0c0: 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54  as writeable.  T
a0d0: 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
a0e0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
a0f0: 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73  nal .** if it is
a100: 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
a110: 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  dy.  This routin
a120: 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
a130: 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a   before making.*
a140: 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70  * changes to a p
a150: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  age..**.** The f
a160: 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72  irst time this r
a170: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
a180: 2c 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61  , the pager crea
a190: 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75  tes a new.** jou
a1a0: 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65  rnal and acquire
a1b0: 73 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  s a write lock o
a1c0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
a1d0: 20 49 66 20 74 68 65 20 77 72 69 74 65 0a 2a 2a   If the write.**
a1e0: 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
a1f0: 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69  be acquired, thi
a200: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
a210: 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  s SQLITE_BUSY.  
a220: 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  The.** calling r
a230: 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63  outine must chec
a240: 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72  k for that retur
a250: 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63  n value and be c
a260: 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a  areful not to.**
a270: 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
a280: 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73   data until this
a290: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
a2a0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
a2b0: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
a2c0: 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20   file could not 
a2d0: 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75  be written becau
a2e0: 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66  se the disk is f
a2f0: 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  ull,.** then thi
a300: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
a310: 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e  s SQLITE_FULL an
a320: 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69  d does an immedi
a330: 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ate rollback..**
a340: 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
a350: 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61  write attempts a
a360: 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54  lso return SQLIT
a370: 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65  E_FULL until the
a380: 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20  re.** is a call 
a390: 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63  to sqlitepager_c
a3a0: 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74  ommit() or sqlit
a3b0: 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  epager_rollback(
a3c0: 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a  ) to.** reset..*
a3d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
a3e0: 72 5f 77 72 69 74 65 28 76 6f 69 64 20 2a 70 44  r_write(void *pD
a3f0: 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
a400: 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
a410: 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67  DR(pData);.  Pag
a420: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
a430: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
a440: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
a450: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
a460: 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66  errors.  */.  if
a470: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
a480: 6b 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e  k ){ .    return
a490: 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
a4a0: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
a4b0: 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  ( pPager->readOn
a4c0: 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ly ){.    return
a4d0: 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
a4e0: 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
a4f0: 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20   page as dirty. 
a500: 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73   If the page has
a510: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
a520: 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
a530: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77  e journal then w
a540: 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67  e can return rig
a550: 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
a560: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
a570: 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75    if( pPg->inJou
a580: 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e  rnal && (pPg->in
a590: 43 6b 70 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Ckpt || pPager->
a5a0: 63 6b 70 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b  ckptInUse==0) ){
a5b0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
a5c0: 74 79 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  tyFile = 1;.    
a5d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a5e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
a5f0: 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
a600: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
a610: 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
a620: 62 65 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  be.  ** written 
a630: 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
a640: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68  on journal or th
a650: 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e ckeckpoint jou
a660: 72 6e 61 6c 0a 20 20 2a 2a 20 6f 72 20 62 6f 74  rnal.  ** or bot
a670: 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 69 72  h..  **.  ** Fir
a680: 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  st check to see 
a690: 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
a6a0: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69  tion journal exi
a6b0: 73 74 73 20 61 6e 64 0a 20 20 2a 2a 20 63 72 65  sts and.  ** cre
a6c0: 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65  ate it if it doe
a6d0: 73 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  s not..  */.  as
a6e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
a6f0: 61 74 65 21 3d 53 51 4c 49 54 45 5f 55 4e 4c 4f  ate!=SQLITE_UNLO
a700: 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  CK );.  rc = sql
a710: 69 74 65 70 61 67 65 72 5f 62 65 67 69 6e 28 70  itepager_begin(p
a720: 44 61 74 61 29 3b 0a 20 20 69 66 28 20 72 63 21  Data);.  if( rc!
a730: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a740: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
a750: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
a760: 72 2d 3e 73 74 61 74 65 3d 3d 53 51 4c 49 54 45  r->state==SQLITE
a770: 5f 57 52 49 54 45 4c 4f 43 4b 20 29 3b 0a 20 20  _WRITELOCK );.  
a780: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
a790: 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67  rnalOpen && pPag
a7a0: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
a7b0: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
a7c0: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
a7d0: 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
a7e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
a7f0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
a800: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a810: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21  journalOpen || !
a820: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
a830: 61 6c 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  al );.  pPager->
a840: 64 69 72 74 79 46 69 6c 65 20 3d 20 31 3b 0a 0a  dirtyFile = 1;..
a850: 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
a860: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
a870: 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
a880: 61 76 65 20 61 20 77 72 69 74 65 20 6c 6f 63 6b  ave a write lock
a890: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6d 61 69   on the.  ** mai
a8a0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
a8b0: 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72    Write the curr
a8c0: 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
a8d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
a8e0: 2a 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20  * journal if it 
a8f0: 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
a900: 65 61 64 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  eady..  */.  if(
a910: 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
a920: 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   && pPager->useJ
a930: 6f 75 72 6e 61 6c 20 0a 20 20 20 20 20 20 20 20  ournal .        
a940: 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
a950: 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
a960: 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
a970: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
a980: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
a990: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  Pg->pgno);.    i
a9a0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
a9b0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
a9c0: 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50  qliteOsWrite(&pP
a9d0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61  ager->jfd, pData
a9e0: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
a9f0: 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ZE);.    }.    i
aa00: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
aa10: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
aa20: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
aa30: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50  Pager);.      pP
aa40: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
aa50: 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b   PAGER_ERR_FULL;
aa60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
aa70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
aa80: 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
aa90: 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
aaa0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
aab0: 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  nal[pPg->pgno/8]
aac0: 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
aad0: 6f 26 37 29 3b 0a 20 20 20 20 70 50 61 67 65 72  o&7);.    pPager
aae0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
aaf0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
ab00: 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
ab10: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50   = 1;.    if( pP
ab20: 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20  ager->ckptInUse 
ab30: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
ab40: 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70 67  >aInCkpt[pPg->pg
ab50: 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
ab60: 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
ab70: 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b 70   page_add_to_ckp
ab80: 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
ab90: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
aba0: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a  the checkpoint j
abb0: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
abc0: 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
abd0: 6f 74 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20 74  ot in it,.  ** t
abe0: 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75  hen write the cu
abf0: 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
ac00: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e checkpoint jou
ac10: 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rnal..  */.  if(
ac20: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55   pPager->ckptInU
ac30: 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 43 6b  se && !pPg->inCk
ac40: 70 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  pt && (int)pPg->
ac50: 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 63 6b  pgno<=pPager->ck
ac60: 70 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73  ptSize ){.    as
ac70: 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
ac80: 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
ac90: 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
aca0: 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
acb0: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
acc0: 73 28 26 70 50 61 67 65 72 2d 3e 63 70 66 64 2c  s(&pPager->cpfd,
acd0: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
ace0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
acf0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
ad00: 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26   sqliteOsWrite(&
ad10: 70 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 70 44  pPager->cpfd, pD
ad20: 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  ata, SQLITE_PAGE
ad30: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _SIZE);.    }.  
ad40: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ad50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
ad60: 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  itepager_rollbac
ad70: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
ad80: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
ad90: 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55   |= PAGER_ERR_FU
ada0: 4c 4c 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  LL;.      return
adb0: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   rc;.    }.    a
adc0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
add0: 49 6e 43 6b 70 74 21 3d 30 20 29 3b 0a 20 20 20  InCkpt!=0 );.   
ade0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74   pPager->aInCkpt
adf0: 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
ae00: 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
ae10: 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f  );.    page_add_
ae20: 74 6f 5f 63 6b 70 74 5f 6c 69 73 74 28 70 50 67  to_ckpt_list(pPg
ae30: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  );.  }..  /* Upd
ae40: 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
ae50: 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e   size and return
ae60: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
ae70: 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74  ger->dbSize<(int
ae80: 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  )pPg->pgno ){.  
ae90: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
aea0: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
aeb0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
aec0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
aed0: 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20  RUE if the page 
aee0: 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
aef0: 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f  ument was previo
af00: 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74  usly passed.** t
af10: 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 77 72  o sqlitepager_wr
af20: 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72  ite().  In other
af30: 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
af40: 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a  RUE if it is ok.
af50: 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ** to change the
af60: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
af70: 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  page..*/.int sql
af80: 69 74 65 70 61 67 65 72 5f 69 73 77 72 69 74 65  itepager_iswrite
af90: 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61  able(void *pData
afa0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
afb0: 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
afc0: 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  pData);.  return
afd0: 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a   pPg->dirty;.}..
afe0: 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
aff0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
b000: 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
b010: 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  t it is not nece
b020: 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74  ssary to.** writ
b030: 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  e the informatio
b040: 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f 22  n on page "pgno"
b050: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73   back to the dis
b060: 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a  k, even though.*
b070: 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68  * that page migh
b080: 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  t be marked as d
b090: 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  irty..**.** The 
b0a0: 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61  overlying softwa
b0b0: 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74  re layer calls t
b0c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
b0d0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61   all of the data
b0e0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  .** on the given
b0f0: 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e   page is unused.
b100: 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b    The pager mark
b110: 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  s the page as cl
b120: 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ean so.** that i
b130: 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77  t does not get w
b140: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a  ritten to disk..
b150: 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77  **.** Tests show
b160: 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d   that this optim
b170: 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65  ization, togethe
b180: 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71  r with the.** sq
b190: 6c 69 74 65 70 61 67 65 72 5f 64 6f 6e 74 5f 72  litepager_dont_r
b1a0: 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c  ollback() below,
b1b0: 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c   more than doubl
b1c0: 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f  e the speed.** o
b1d0: 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f  f large INSERT o
b1e0: 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75  perations and qu
b1f0: 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
b200: 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54  d of large DELET
b210: 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  Es..**.** When t
b220: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
b230: 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61  alled, set the a
b240: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
b250: 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53  ag to true..** S
b260: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
b270: 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 64  to sqlitepager_d
b280: 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66  ont_rollback() f
b290: 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  or the same page
b2a0: 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66  .** will thereaf
b2b0: 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20  ter be ignored. 
b2c0: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
b2d0: 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72  ry to avoid a pr
b2e0: 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61  oblem.** where a
b2f0: 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20   page with data 
b300: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
b310: 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20  freelist during 
b320: 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61  one part of.** a
b330: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65   transaction the
b340: 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  n removed from t
b350: 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69  he freelist duri
b360: 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a  ng a later part.
b370: 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74  ** of the same t
b380: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72  ransaction and r
b390: 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f  eused for some o
b3a0: 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57  ther purpose.  W
b3b0: 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72  hen it.** is fir
b3c0: 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  st added to the 
b3d0: 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72  freelist, this r
b3e0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
b3f0: 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a  .  When reused,.
b400: 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c  ** the dont_roll
b410: 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69  back() routine i
b420: 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62  s called.  But b
b430: 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
b440: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74  contains.** crit
b450: 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74  ical data, we st
b460: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ill need to be s
b470: 75 72 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c  ure it gets roll
b480: 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65  ed back in spite
b490: 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f  .** of the dont_
b4a0: 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e  rollback() call.
b4b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70  .*/.void sqlitep
b4c0: 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28  ager_dont_write(
b4d0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
b4e0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
b4f0: 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20  dr *pPg;..  pPg 
b500: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
b510: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
b520: 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
b530: 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  ack = 1;.  if( p
b540: 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79  Pg && pPg->dirty
b550: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
b560: 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74  er->dbSize==(int
b570: 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50  )pPg->pgno && pP
b580: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
b590: 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  <pPager->dbSize 
b5a0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
b5b0: 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65  his pages is the
b5c0: 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68   last page in th
b5d0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
b5e0: 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20  ile has grown.  
b5f0: 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68      ** during th
b600: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
b610: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e  ction, then do N
b620: 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  OT mark the page
b630: 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20   as clean..     
b640: 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74   ** When the dat
b650: 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73  abase file grows
b660: 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73  , we must make s
b670: 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73  ure that the las
b680: 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  t page.      ** 
b690: 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20  gets written at 
b6a0: 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68  least once so th
b6b0: 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  at the disk file
b6c0: 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72   will be the cor
b6d0: 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69  rect.      ** si
b6e0: 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f  ze. If you do no
b6f0: 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67  t write this pag
b700: 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  e and the size o
b710: 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  f the file.     
b720: 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20   ** on the disk 
b730: 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f  ends up being to
b740: 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61  o small, that ca
b750: 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
b760: 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  se.      ** corr
b770: 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68  uption during th
b780: 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69  e next transacti
b790: 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
b7a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
b7b0: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
b7c0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
b7d0: 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
b7e0: 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
b7f0: 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20  e pager that if 
b800: 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
b810: 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  s,.** it is not 
b820: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73  necessary to res
b830: 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e  tore the data on
b840: 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e   the given page.
b850: 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20    This.** means 
b860: 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64  that the pager d
b870: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
b880: 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e  record the given
b890: 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20   page in the.** 
b8a0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
b8b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b8c0: 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  pager_dont_rollb
b8d0: 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ack(void *pData)
b8e0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
b8f0: 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
b900: 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a  Data);.  Pager *
b910: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
b920: 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61  ager;..  if( pPa
b930: 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49  ger->state!=SQLI
b940: 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 7c 7c 20  TE_WRITELOCK || 
b950: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b960: 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pen==0 ) return;
b970: 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
b980: 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50  ysRollback || pP
b990: 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
b9a0: 62 61 63 6b 20 29 20 72 65 74 75 72 6e 3b 0a 20  back ) return;. 
b9b0: 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
b9c0: 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67  rnal && (int)pPg
b9d0: 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
b9e0: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
b9f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
ba00: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->aInJournal!=
ba10: 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
ba20: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d  >aInJournal[pPg-
ba30: 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
ba40: 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
ba50: 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
ba60: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50   = 1;.    if( pP
ba70: 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20  ager->ckptInUse 
ba80: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
ba90: 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70 67  >aInCkpt[pPg->pg
baa0: 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
bab0: 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
bac0: 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b 70   page_add_to_ckp
bad0: 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
bae0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61   }.  }.  if( pPa
baf0: 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 26  ger->ckptInUse &
bb00: 26 20 21 70 50 67 2d 3e 69 6e 43 6b 70 74 20 26  & !pPg->inCkpt &
bb10: 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
bb20: 3c 3d 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69  <=pPager->ckptSi
bb30: 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ze ){.    assert
bb40: 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
bb50: 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
bb60: 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
bb70: 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  bSize );.    ass
bb80: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
bb90: 43 6b 70 74 21 3d 30 20 29 3b 0a 20 20 20 20 70  Ckpt!=0 );.    p
bba0: 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70  Pager->aInCkpt[p
bbb0: 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
bbc0: 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
bbd0: 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f  .    page_add_to
bbe0: 5f 63 6b 70 74 5f 6c 69 73 74 28 70 50 67 29 3b  _ckpt_list(pPg);
bbf0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
bc00: 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73  mmit all changes
bc10: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
bc20: 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
bc30: 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a   write lock..**.
bc40: 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  ** If the commit
bc50: 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
bc60: 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63  eason, a rollbac
bc70: 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  k attempt is mad
bc80: 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  e.** and an erro
bc90: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
bca0: 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  ed.  If the comm
bcb0: 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54  it worked, SQLIT
bcc0: 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
bcd0: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
bce0: 74 65 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50  tepager_commit(P
bcf0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
bd00: 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
bd10: 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50   *pPg;..  if( pP
bd20: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50  ager->errMask==P
bd30: 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b  AGER_ERR_FULL ){
bd40: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
bd50: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
bd60: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
bd70: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
bd80: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
bd90: 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
bda0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
bdb0: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
bdc0: 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20  errMask!=0 ){.  
bdd0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
bde0: 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
bdf0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
be00: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
be10: 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 57 52 49  tate!=SQLITE_WRI
be20: 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  TELOCK ){.    re
be30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
be40: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  R;.  }.  if( pPa
be50: 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 3d 3d  ger->dirtyFile==
be60: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74  0 ){.    /* Exit
be70: 20 65 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20   early (without 
be80: 64 6f 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63  doing the time-c
be90: 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 4f  onsuming sqliteO
bea0: 73 53 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20  sSync() calls). 
beb0: 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68     ** if there h
bec0: 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e  ave been no chan
bed0: 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
bee0: 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
bef0: 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
bf00: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
bf10: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
bf20: 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65  ize = -1;.    re
bf30: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
bf40: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
bf50: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
bf60: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  if( pPager->need
bf70: 53 79 6e 63 20 26 26 20 73 71 6c 69 74 65 4f 73  Sync && sqliteOs
bf80: 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66  Sync(&pPager->jf
bf90: 64 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  d)!=SQLITE_OK ){
bfa0: 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  .    goto commit
bfb0: 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 66 6f  _abort;.  }.  fo
bfc0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
bfd0: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
bfe0: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
bff0: 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 3d   if( pPg->dirty=
c000: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
c010: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
c020: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Seek(&pPager->fd
c030: 2c 20 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a  , (pPg->pgno-1)*
c040: 28 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41  (off_t)SQLITE_PA
c050: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69 66  GE_SIZE);.    if
c060: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c070: 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62  ) goto commit_ab
c080: 6f 72 74 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ort;.    rc = sq
c090: 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61  liteOsWrite(&pPa
c0a0: 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54  ger->fd, PGHDR_T
c0b0: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c  O_DATA(pPg), SQL
c0c0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
c0d0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
c0e0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
c0f0: 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20  mit_abort;.  }. 
c100: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
c110: 53 79 6e 63 20 26 26 20 73 71 6c 69 74 65 4f 73  Sync && sqliteOs
c120: 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 66 64  Sync(&pPager->fd
c130: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
c140: 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f      goto commit_
c150: 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20  abort;.  }.  rc 
c160: 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
c170: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70  ock(pPager);.  p
c180: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
c190: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  -1;.  return rc;
c1a0: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
c1b0: 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
c1c0: 73 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74  s wrong during t
c1d0: 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
c1e0: 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61  s..  */.commit_a
c1f0: 62 6f 72 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c  bort:.  rc = sql
c200: 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  itepager_rollbac
c210: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  k(pPager);.  if(
c220: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c230: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
c240: 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65  E_FULL;.  }.  re
c250: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
c260: 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63  * Rollback all c
c270: 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74  hanges.  The dat
c280: 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b  abase falls back
c290: 20 74 6f 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 6f   to read-only mo
c2a0: 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65  de..** All in-me
c2b0: 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73  mory cache pages
c2c0: 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72   revert to their
c2d0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63   original data c
c2e0: 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20  ontents..** The 
c2f0: 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74  journal is delet
c300: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
c310: 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61  outine cannot fa
c320: 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  il unless some o
c330: 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
c340: 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  not following.**
c350: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63   the correct loc
c360: 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53  king protocol (S
c370: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20  QLITE_PROTOCOL) 
c380: 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  or unless some o
c390: 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
c3a0: 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68  is writing trash
c3b0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
c3c0: 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43  l file (SQLITE_C
c3d0: 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e  ORRUPT) or.** un
c3e0: 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c  less a prior mal
c3f0: 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51  loc() failed (SQ
c400: 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70  LITE_NOMEM).  Ap
c410: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a  propriate error.
c420: 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74  ** codes are ret
c430: 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68  urned for all th
c440: 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20  ese occasions.  
c450: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51  Otherwise,.** SQ
c460: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
c470: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
c480: 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  tepager_rollback
c490: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
c4a0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
c4b0: 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46   !pPager->dirtyF
c4c0: 69 6c 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  ile || !pPager->
c4d0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
c4e0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
c4f0: 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
c500: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
c510: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20  bSize = -1;.    
c520: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
c530: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
c540: 4d 61 73 6b 21 3d 30 20 26 26 20 70 50 61 67 65  Mask!=0 && pPage
c550: 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47 45  r->errMask!=PAGE
c560: 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20  R_ERR_FULL ){.  
c570: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
c580: 61 74 65 3e 3d 53 51 4c 49 54 45 5f 57 52 49 54  ate>=SQLITE_WRIT
c590: 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  ELOCK ){.      p
c5a0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
c5b0: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
c5c0: 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
c5d0: 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
c5e0: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
c5f0: 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 57  >state!=SQLITE_W
c600: 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RITELOCK ){.    
c610: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c620: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61 67  ;.  }.  rc = pag
c630: 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
c640: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
c650: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c660: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
c670: 55 50 54 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  UPT;.    pPager-
c680: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
c690: 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20  R_ERR_CORRUPT;. 
c6a0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53   }.  pPager->dbS
c6b0: 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ize = -1;.  retu
c6c0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c6d0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
c6e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
c6f0: 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d   is opened read-
c700: 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41  only.  Return FA
c710: 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61  LSE.** if the da
c720: 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68  tabase is (in th
c730: 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a  eory) writable..
c740: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67  */.int sqlitepag
c750: 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50 61  er_isreadonly(Pa
c760: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
c770: 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72  return pPager->r
c780: 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  eadOnly;.}../*.*
c790: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
c7a0: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
c7b0: 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
c7c0: 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71  only..*/.int *sq
c7d0: 6c 69 74 65 70 61 67 65 72 5f 73 74 61 74 73 28  litepager_stats(
c7e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
c7f0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 39    static int a[9
c800: 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67  ];.  a[0] = pPag
c810: 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d  er->nRef;.  a[1]
c820: 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65   = pPager->nPage
c830: 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65  ;.  a[2] = pPage
c840: 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33  r->mxPage;.  a[3
c850: 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ] = pPager->dbSi
c860: 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61  ze;.  a[4] = pPa
c870: 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b  ger->state;.  a[
c880: 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  5] = pPager->err
c890: 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20 70  Mask;.  a[6] = p
c8a0: 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61  Pager->nHit;.  a
c8b0: 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d  [7] = pPager->nM
c8c0: 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50  iss;.  a[8] = pP
c8d0: 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72  ager->nOvfl;.  r
c8e0: 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn a;.}../*.*
c8f0: 2a 20 53 65 74 20 74 68 65 20 63 68 65 63 6b 70  * Set the checkp
c900: 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  oint..**.** This
c910: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
c920: 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  be called with t
c930: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
c940: 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a  ournal already.*
c950: 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 63  * open.  A new c
c960: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
c970: 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61  l is created tha
c980: 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
c990: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61   rollback.** cha
c9a0: 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  nges of a single
c9b0: 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74   SQL command wit
c9c0: 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61  hin a larger tra
c9d0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nsaction..*/.int
c9e0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70   sqlitepager_ckp
c9f0: 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70  t_begin(Pager *p
ca00: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
ca10: 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53  ;.  char zTemp[S
ca20: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
ca30: 49 5a 45 5d 3b 0a 20 20 69 66 28 20 21 70 50 61  IZE];.  if( !pPa
ca40: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
ca50: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
ca60: 63 6b 70 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31  ckptAutoopen = 1
ca70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
ca80: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
ca90: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
caa0: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 61  urnalOpen );.  a
cab0: 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
cac0: 63 6b 70 74 49 6e 55 73 65 20 29 3b 0a 20 20 70  ckptInUse );.  p
cad0: 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 3d  Pager->aInCkpt =
cae0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
caf0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
cb00: 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
cb10: 67 65 72 2d 3e 61 49 6e 43 6b 70 74 3d 3d 30 20  ger->aInCkpt==0 
cb20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 52  ){.    sqliteOsR
cb30: 65 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  eadLock(&pPager-
cb40: 3e 66 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >fd);.    return
cb50: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
cb60: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
cb70: 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67  OsFileSize(&pPag
cb80: 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
cb90: 2d 3e 63 6b 70 74 4a 53 69 7a 65 29 3b 0a 20 20  ->ckptJSize);.  
cba0: 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6b  if( rc ) goto ck
cbb0: 70 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b  pt_begin_failed;
cbc0: 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53  .  pPager->ckptS
cbd0: 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
cbe0: 53 69 7a 65 3b 0a 20 20 69 66 28 20 21 70 50 61  Size;.  if( !pPa
cbf0: 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 29 7b  ger->ckptOpen ){
cc00: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
cc10: 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a  pager_opentemp(z
cc20: 54 65 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e 63  Temp, &pPager->c
cc30: 70 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pfd);.    if( rc
cc40: 20 29 20 67 6f 74 6f 20 63 6b 70 74 5f 62 65 67   ) goto ckpt_beg
cc50: 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70  in_failed;.    p
cc60: 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20  Pager->ckptOpen 
cc70: 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 1;.  }.  pPage
cc80: 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 3d 20 31  r->ckptInUse = 1
cc90: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
cca0: 45 5f 4f 4b 3b 0a 20 0a 63 6b 70 74 5f 62 65 67  E_OK;. .ckpt_beg
ccb0: 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  in_failed:.  if(
ccc0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74   pPager->aInCkpt
ccd0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
cce0: 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b  ee(pPager->aInCk
ccf0: 70 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  pt);.    pPager-
cd00: 3e 61 49 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20  >aInCkpt = 0;.  
cd10: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
cd20: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
cd30: 20 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a   checkpoint..*/.
cd40: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
cd50: 63 6b 70 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65  ckpt_commit(Page
cd60: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
cd70: 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e  ( pPager->ckptIn
cd80: 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72  Use ){.    PgHdr
cd90: 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
cda0: 20 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28     sqliteOsSeek(
cdb0: 26 70 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 30  &pPager->cpfd, 0
cdc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 54  );.    sqliteOsT
cdd0: 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d  runcate(&pPager-
cde0: 3e 63 70 66 64 2c 20 30 29 3b 0a 20 20 20 20 70  >cpfd, 0);.    p
cdf0: 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
ce00: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
ce10: 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
ce20: 6e 43 6b 70 74 20 29 3b 0a 20 20 20 20 70 50 61  nCkpt );.    pPa
ce30: 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 3d 20 30  ger->aInCkpt = 0
ce40: 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  ;.    for(pPg=pP
ce50: 61 67 65 72 2d 3e 70 43 6b 70 74 3b 20 70 50 67  ager->pCkpt; pPg
ce60: 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20  ; pPg=pNext){.  
ce70: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d      pNext = pPg-
ce80: 3e 70 4e 65 78 74 43 6b 70 74 3b 0a 20 20 20 20  >pNextCkpt;.    
ce90: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
cea0: 6e 43 6b 70 74 20 29 3b 0a 20 20 20 20 20 20 70  nCkpt );.      p
ceb0: 50 67 2d 3e 69 6e 43 6b 70 74 20 3d 20 30 3b 0a  Pg->inCkpt = 0;.
cec0: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
ced0: 43 6b 70 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Ckpt = pPg->pNex
cee0: 74 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d  tCkpt = 0;.    }
cef0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 43 6b  .    pPager->pCk
cf00: 70 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  pt = 0;.  }.  pP
cf10: 61 67 65 72 2d 3e 63 6b 70 74 41 75 74 6f 6f 70  ager->ckptAutoop
cf20: 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  en = 0;.  return
cf30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
cf40: 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20  *.** Rollback a 
cf50: 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 69  checkpoint..*/.i
cf60: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63  nt sqlitepager_c
cf70: 6b 70 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67  kpt_rollback(Pag
cf80: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
cf90: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61  nt rc;.  if( pPa
cfa0: 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 29  ger->ckptInUse )
cfb0: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
cfc0: 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 28 70  _ckpt_playback(p
cfd0: 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69  Pager);.    sqli
cfe0: 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 63 6f 6d  tepager_ckpt_com
cff0: 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
d000: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
d010: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
d020: 70 50 61 67 65 72 2d 3e 63 6b 70 74 41 75 74 6f  pPager->ckptAuto
d030: 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75  open = 0;.  retu
d040: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
d050: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
d060: 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69  ** Print a listi
d070: 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65  ng of all refere
d080: 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74  nced pages and t
d090: 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a  heir ref count..
d0a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61  */.void sqlitepa
d0b0: 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65  ger_refdump(Page
d0c0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
d0d0: 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28  Hdr *pPg;.  for(
d0e0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
d0f0: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
d100: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
d110: 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20  f( pPg->nRef<=0 
d120: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
d130: 70 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64  printf("PAGE %3d
d140: 20 61 64 64 72 3d 30 78 25 30 38 78 20 6e 52 65   addr=0x%08x nRe
d150: 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  f=%d\n", .      
d160: 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74   pPg->pgno, (int
d170: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
d180: 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b  Pg), pPg->nRef);
d190: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a        .  }.}.#endif.