/ Hex Artifact Content
Login

Artifact e7d05fa23a61f109c2276bb05be7a8d6721980f1:


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 34  : pager.c,v 1.64
0350: 20 32 30 30 33 2f 30 31 2f 30 33 20 30 32 3a 30   2003/01/03 02:0
0360: 34 3a 32 37 20 64 72 68 20 45 78 70 20 24 0a 2a  4:27 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 20   }.  if( nRec < 
3f50: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2b 73  sizeof(aMagic)+s
3f60: 69 7a 65 6f 66 28 50 67 6e 6f 29 20 29 7b 0a 20  izeof(Pgno) ){. 
3f70: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
3f80: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 6e 52 65 63  back;.  }.  nRec
3f90: 20 3d 20 28 6e 52 65 63 20 2d 20 28 73 69 7a 65   = (nRec - (size
3fa0: 6f 66 28 61 4d 61 67 69 63 29 2b 73 69 7a 65 6f  of(aMagic)+sizeo
3fb0: 66 28 50 67 6e 6f 29 29 29 20 2f 20 73 69 7a 65  f(Pgno))) / size
3fc0: 6f 66 28 50 61 67 65 52 65 63 6f 72 64 29 3b 0a  of(PageRecord);.
3fd0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 62  .  /* Read the b
3fe0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
3ff0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 72 75 6e  journal and trun
4000: 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 64 61  cate the.  ** da
4010: 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
4020: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
4030: 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   size..  */.  rc
4040: 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28   = sqliteOsRead(
4050: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  &pPager->jfd, aM
4060: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
4070: 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72 63 21  gic));.  if( rc!
4080: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4090: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52    rc = SQLITE_PR
40a0: 4f 54 4f 43 4f 4c 3b 0a 20 20 20 20 67 6f 74 6f  OTOCOL;.    goto
40b0: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
40c0: 20 7d 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28   }.  if( memcmp(
40d0: 61 4d 61 67 69 63 2c 20 61 4f 6c 64 4a 6f 75 72  aMagic, aOldJour
40e0: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
40f0: 28 61 4d 61 67 69 63 29 29 3d 3d 30 20 29 7b 0a  (aMagic))==0 ){.
4100: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
4110: 6e 61 6c 46 6f 72 6d 61 74 20 3d 20 53 51 4c 49  nalFormat = SQLI
4120: 54 45 5f 4f 4c 44 5f 4a 4f 55 52 4e 41 4c 5f 46  TE_OLD_JOURNAL_F
4130: 4f 52 4d 41 54 3b 0a 20 20 7d 65 6c 73 65 20 69  ORMAT;.  }else i
4140: 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  f( memcmp(aMagic
4150: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
4160: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
4170: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ==0 ){.    pPage
4180: 72 2d 3e 6a 6f 75 72 6e 61 6c 46 6f 72 6d 61 74  r->journalFormat
4190: 20 3d 20 53 51 4c 49 54 45 5f 4e 45 57 5f 4a 4f   = SQLITE_NEW_JO
41a0: 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 3b 0a 20 20  URNAL_FORMAT;.  
41b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
41c0: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b  SQLITE_PROTOCOL;
41d0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
41e0: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72 63  ayback;.  }.  rc
41f0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
4200: 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
4210: 66 64 2c 20 26 6d 78 50 67 29 3b 0a 20 20 69 66  fd, &mxPg);.  if
4220: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4230: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
4240: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
4250: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 54 72 75  rc = sqliteOsTru
4260: 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66  ncate(&pPager->f
4270: 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  d, SQLITE_PAGE_S
4280: 49 5a 45 2a 28 6f 66 66 5f 74 29 6d 78 50 67 29  IZE*(off_t)mxPg)
4290: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
42a0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
42b0: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
42c0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
42d0: 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 0a  Size = mxPg;.  .
42e0: 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
42f0: 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
4300: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
4310: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
4320: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
4330: 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31  /.  for(i=nRec-1
4340: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
4350: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
4360: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
4370: 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
4380: 6a 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  jfd);.    if( rc
4390: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72  !=SQLITE_OK ) br
43a0: 65 61 6b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 70 6c  eak;.  }..end_pl
43b0: 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63  ayback:.  if( rc
43c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
43d0: 20 20 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65     pager_unwrite
43e0: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
43f0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
4400: 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43  k |= PAGER_ERR_C
4410: 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d  ORRUPT;.    rc =
4420: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
4430: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
4440: 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
4450: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
4460: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4470: 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
4480: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
4490: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
44a0: 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74  his is similar t
44b0: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
44c0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
44d0: 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a  ournal but with.
44e0: 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74  ** a few extra t
44f0: 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  wists..**.**    
4500: 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20  (1)  The number 
4510: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
4520: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
4530: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
4540: 20 20 20 20 20 20 20 20 20 74 68 65 20 63 68 65           the che
4550: 63 6b 70 6f 69 6e 74 20 69 73 20 73 74 6f 72 65  ckpoint is store
4560: 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 63 6b 70  d in pPager->ckp
4570: 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68  tSize, not in th
4580: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75  e.**         jou
4590: 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66  rnal file itself
45a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
45b0: 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70  In addition to p
45c0: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
45d0: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
45e0: 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20  al, also.**     
45f0: 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c      playback all
4600: 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72   pages of the tr
4610: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
4620: 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20  l beginning.**  
4630: 20 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74         at offset
4640: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69   pPager->ckptJSi
4650: 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
4660: 74 20 70 61 67 65 72 5f 63 6b 70 74 5f 70 6c 61  t pager_ckpt_pla
4670: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
4680: 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 6e 52  ger){.  off_t nR
4690: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
46a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
46b0: 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69  cords */.  int i
46c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
46d0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
46e0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ter */.  int rc;
46f0: 0a 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20  ..  /* Truncate 
4700: 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63  the database bac
4710: 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
4720: 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72  l size..  */.  r
4730: 63 20 3d 20 73 71 6c 69 74 65 4f 73 54 72 75 6e  c = sqliteOsTrun
4740: 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64  cate(&pPager->fd
4750: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
4760: 5a 45 2a 28 6f 66 66 5f 74 29 70 50 61 67 65 72  ZE*(off_t)pPager
4770: 2d 3e 63 6b 70 74 53 69 7a 65 29 3b 0a 20 20 70  ->ckptSize);.  p
4780: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
4790: 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65  pPager->ckptSize
47a0: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
47b0: 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
47c0: 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 63  rds are in the c
47d0: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
47e0: 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
47f0: 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e  ( pPager->ckptIn
4800: 55 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Use && pPager->j
4810: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
4820: 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50  sqliteOsSeek(&pP
4830: 61 67 65 72 2d 3e 63 70 66 64 2c 20 30 29 3b 0a  ager->cpfd, 0);.
4840: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 46    rc = sqliteOsF
4850: 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
4860: 3e 63 70 66 64 2c 20 26 6e 52 65 63 29 3b 0a 20  >cpfd, &nRec);. 
4870: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
4880: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
4890: 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b  nd_ckpt_playback
48a0: 3b 0a 20 20 7d 0a 20 20 6e 52 65 63 20 2f 3d 20  ;.  }.  nRec /= 
48b0: 73 69 7a 65 6f 66 28 50 61 67 65 52 65 63 6f 72  sizeof(PageRecor
48c0: 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79  d);.  .  /* Copy
48d0: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
48e0: 6f 75 74 20 6f 66 20 74 68 65 20 63 68 65 63 6b  out of the check
48f0: 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  point journal an
4900: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a  d back into the.
4910: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
4920: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
4930: 61 67 65 72 5f 6f 6c 64 5f 66 6f 72 6d 61 74 20  ager_old_format 
4940: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
4950: 6f 75 72 6e 61 6c 46 6f 72 6d 61 74 20 3d 20 53  ournalFormat = S
4960: 51 4c 49 54 45 5f 4f 4c 44 5f 4a 4f 55 52 4e 41  QLITE_OLD_JOURNA
4970: 4c 5f 46 4f 52 4d 41 54 3b 0a 20 20 7d 65 6c 73  L_FORMAT;.  }els
4980: 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  e{.    pPager->j
4990: 6f 75 72 6e 61 6c 46 6f 72 6d 61 74 20 3d 20 53  ournalFormat = S
49a0: 51 4c 49 54 45 5f 4e 45 57 5f 4a 4f 55 52 4e 41  QLITE_NEW_JOURNA
49b0: 4c 5f 46 4f 52 4d 41 54 3b 0a 20 20 7d 0a 20 20  L_FORMAT;.  }.  
49c0: 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e  for(i=nRec-1; i>
49d0: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63  =0; i--){.    rc
49e0: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
49f0: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
4a00: 72 2c 20 26 70 50 61 67 65 72 2d 3e 63 70 66 64  r, &pPager->cpfd
4a10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
4a20: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
4a30: 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63  end_ckpt_playbac
4a40: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  k;.  }..  /* Fig
4a50: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
4a60: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
4a70: 65 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20  e copied out of 
4a80: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
4a90: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20    ** journal..  
4aa0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
4ab0: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
4ac0: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70  jfd, pPager->ckp
4ad0: 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  tJSize);.  if( r
4ae0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
4af0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 6b 70      goto end_ckp
4b00: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
4b10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 46    rc = sqliteOsF
4b20: 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
4b30: 3e 6a 66 64 2c 20 26 6e 52 65 63 29 3b 0a 20 20  >jfd, &nRec);.  
4b40: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4b50: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
4b60: 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3b  d_ckpt_playback;
4b70: 0a 20 20 7d 0a 20 20 6e 52 65 63 20 3d 20 28 6e  .  }.  nRec = (n
4b80: 52 65 63 20 2d 20 70 50 61 67 65 72 2d 3e 63 6b  Rec - pPager->ck
4b90: 70 74 4a 53 69 7a 65 29 2f 73 69 7a 65 6f 66 28  ptJSize)/sizeof(
4ba0: 50 61 67 65 52 65 63 6f 72 64 29 3b 0a 20 20 66  PageRecord);.  f
4bb0: 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d  or(i=nRec-1; i>=
4bc0: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20  0; i--){.    rc 
4bd0: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
4be0: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
4bf0: 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  , &pPager->jfd);
4c00: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
4c10: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
4c20: 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3b  d_ckpt_playback;
4c30: 0a 20 20 7d 0a 20 20 0a 0a 65 6e 64 5f 63 6b 70  .  }.  ..end_ckp
4c40: 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  t_playback:.  if
4c50: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4c60: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
4c70: 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
4c80: 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ERR_CORRUPT;.   
4c90: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
4ca0: 52 55 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RUPT;.  }.  retu
4cb0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4cc0: 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
4cd0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
4ce0: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
4cf0: 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  t are allowed..*
4d00: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
4d10: 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 61   number is the a
4d20: 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66  bsolute value of
4d30: 20 74 68 65 20 6d 78 50 61 67 65 20 70 61 72 61   the mxPage para
4d40: 6d 65 74 65 72 2e 0a 2a 2a 20 49 66 20 6d 78 50  meter..** If mxP
4d50: 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
4d60: 20 74 68 65 20 6e 6f 53 79 6e 63 20 66 6c 61 67   the noSync flag
4d70: 20 69 73 20 61 6c 73 6f 20 73 65 74 2e 20 20 6e   is also set.  n
4d80: 6f 53 79 6e 63 20 62 79 70 61 73 73 65 73 0a 2a  oSync bypasses.*
4d90: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
4da0: 65 4f 73 53 79 6e 63 28 29 2e 20 20 54 68 65 20  eOsSync().  The 
4db0: 70 61 67 65 72 20 72 75 6e 73 20 6d 75 63 68 20  pager runs much 
4dc0: 66 61 73 74 65 72 20 77 69 74 68 20 6e 6f 53 79  faster with noSy
4dd0: 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74 20 69 66  nc on,.** but if
4de0: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
4df0: 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
4e00: 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 62 72   there is an abr
4e10: 75 70 74 20 70 6f 77 65 72 20 0a 2a 2a 20 66 61  upt power .** fa
4e20: 69 6c 75 72 65 2c 20 74 68 65 20 64 61 74 61 62  ilure, the datab
4e30: 61 73 65 20 66 69 6c 65 20 6d 69 67 68 74 20 62  ase file might b
4e40: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
4e50: 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 0a 2a 2a  onsistent and.**
4e60: 20 75 6e 72 65 70 61 69 72 61 62 6c 65 20 73 74   unrepairable st
4e70: 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73  ate.  .*/.void s
4e80: 71 6c 69 74 65 70 61 67 65 72 5f 73 65 74 5f 63  qlitepager_set_c
4e90: 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a  achesize(Pager *
4ea0: 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
4eb0: 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
4ec0: 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67  e>=0 ){.    pPag
4ed0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
4ee0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
4ef0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
4f00: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a  er->noSync = 1;.
4f10: 20 20 20 20 6d 78 50 61 67 65 20 3d 20 2d 6d 78      mxPage = -mx
4f20: 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Page;.  }.  if( 
4f30: 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20  mxPage>10 ){.   
4f40: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
4f50: 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 7d 0a  = mxPage;.  }.}.
4f60: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
4f70: 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 57  mporary file.  W
4f80: 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
4f90: 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a   the file into z
4fa0: 4e 61 6d 65 0a 2a 2a 20 28 7a 4e 61 6d 65 20 6d  Name.** (zName m
4fb0: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
4fc0: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
4fd0: 53 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e  SIZE bytes long.
4fe0: 29 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20  )  Write.** the 
4ff0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
5000: 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72  into *fd.  Retur
5010: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
5020: 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a  uccess or some.*
5030: 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  * other error co
5040: 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a  de if we fail..*
5050: 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c  *.** The OS will
5060: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
5070: 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
5080: 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74  ary file when it
5090: 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a   is.** closed..*
50a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
50b0: 69 74 65 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  itepager_opentem
50c0: 70 28 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f  p(char *zFile, O
50d0: 73 46 69 6c 65 20 2a 66 64 29 7b 0a 20 20 69 6e  sFile *fd){.  in
50e0: 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74  t cnt = 8;.  int
50f0: 20 72 63 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 63   rc;.  do{.    c
5100: 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt--;.    sqlite
5110: 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a  OsTempFileName(z
5120: 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  File);.    rc = 
5130: 73 71 6c 69 74 65 4f 73 4f 70 65 6e 45 78 63 6c  sqliteOsOpenExcl
5140: 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 66 64 2c  usive(zFile, fd,
5150: 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63   1);.  }while( c
5160: 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c 49  nt>0 && rc!=SQLI
5170: 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72  TE_OK );.  retur
5180: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
5190: 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
51a0: 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61   cache and put a
51b0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
51c0: 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70  page cache in *p
51d0: 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66  pPager..** The f
51e0: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
51f0: 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e   need not exist.
5200: 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f    The file is no
5210: 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a  t locked until.*
5220: 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  * the first call
5230: 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f   to sqlitepager_
5240: 67 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c  get() and is onl
5250: 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69  y held open unti
5260: 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61  l the.** last pa
5270: 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75  ge is released u
5280: 73 69 6e 67 20 73 71 6c 69 74 65 70 61 67 65 72  sing sqlitepager
5290: 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20  _unref()..**.** 
52a0: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
52b0: 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
52c0: 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
52d0: 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
52e0: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
52f0: 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
5300: 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20  be cached.  The 
5310: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
5320: 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
5330: 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73  cally when it is
5340: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   closed..*/.int 
5350: 73 71 6c 69 74 65 70 61 67 65 72 5f 6f 70 65 6e  sqlitepager_open
5360: 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  (.  Pager **ppPa
5370: 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
5380: 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
5390: 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
53a0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
53b0: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
53c0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
53d0: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
53e0: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61  en */.  int mxPa
53f0: 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
5400: 20 2f 2a 20 4d 61 78 20 6e 75 6d 62 65 72 20 6f   /* Max number o
5410: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  f in-memory cach
5420: 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  e pages */.  int
5430: 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
5440: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
5450: 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
5460: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
5470: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a  ge */.  int useJ
5480: 6f 75 72 6e 61 6c 20 20 20 20 20 20 20 20 20 20  ournal          
5490: 20 2f 2a 20 54 52 55 45 20 74 6f 20 75 73 65 20   /* TRUE to use 
54a0: 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
54b0: 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  al on this file 
54c0: 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  */.){.  Pager *p
54d0: 50 61 67 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a  Pager;.  char *z
54e0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 3b 0a 20 20  FullPathname;.  
54f0: 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f  int nameLen;.  O
5500: 73 46 69 6c 65 20 66 64 3b 0a 20 20 69 6e 74 20  sFile fd;.  int 
5510: 72 63 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69  rc;.  int tempFi
5520: 6c 65 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e  le;.  int readOn
5530: 6c 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  ly = 0;.  char z
5540: 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50  Temp[SQLITE_TEMP
5550: 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a  NAME_SIZE];..  *
5560: 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69  ppPager = 0;.  i
5570: 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  f( sqlite_malloc
5580: 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  _failed ){.    r
5590: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
55a0: 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46  EM;.  }.  if( zF
55b0: 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ilename ){.    z
55c0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
55d0: 71 6c 69 74 65 4f 73 46 75 6c 6c 50 61 74 68 6e  qliteOsFullPathn
55e0: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
55f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
5600: 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a  sOpenReadWrite(z
5610: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66  FullPathname, &f
5620: 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20  d, &readOnly);. 
5630: 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b     tempFile = 0;
5640: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
5650: 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6f   = sqlitepager_o
5660: 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26  pentemp(zTemp, &
5670: 66 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  fd);.    zFilena
5680: 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  me = zTemp;.    
5690: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
56a0: 73 71 6c 69 74 65 4f 73 46 75 6c 6c 50 61 74 68  sqliteOsFullPath
56b0: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
56c0: 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20  .    tempFile = 
56d0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
56e0: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
56f0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
5700: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5710: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
5720: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
5730: 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74  iteFree(zFullPat
5740: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
5750: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
5760: 45 4e 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c 65  EN;.  }.  nameLe
5770: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c  n = strlen(zFull
5780: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61  Pathname);.  pPa
5790: 67 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ger = sqliteMall
57a0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67  oc( sizeof(*pPag
57b0: 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 32 20  er) + nameLen*2 
57c0: 2b 20 33 30 20 29 3b 0a 20 20 69 66 28 20 70 50  + 30 );.  if( pP
57d0: 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ager==0 ){.    s
57e0: 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26 66 64  qliteOsClose(&fd
57f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
5800: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
5810: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
5820: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
5830: 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
5840: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61  me = (char*)&pPa
5850: 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72  ger[1];.  pPager
5860: 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50  ->zJournal = &pP
5870: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
5880: 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74  nameLen+1];.  st
5890: 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  rcpy(pPager->zFi
58a0: 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  lename, zFullPat
58b0: 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79  hname);.  strcpy
58c0: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
58d0: 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  l, zFullPathname
58e0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
58f0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
5900: 20 20 73 74 72 63 70 79 28 26 70 50 61 67 65 72    strcpy(&pPager
5910: 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c  ->zJournal[nameL
5920: 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29  en], "-journal")
5930: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
5940: 20 66 64 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a   fd;.  pPager->j
5950: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
5960: 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
5970: 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61  rnal = useJourna
5980: 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  l;.  pPager->ckp
5990: 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61  tOpen = 0;.  pPa
59a0: 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 3d  ger->ckptInUse =
59b0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
59c0: 65 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ef = 0;.  pPager
59d0: 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
59e0: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a   pPager->ckptSiz
59f0: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
5a00: 3e 63 6b 70 74 4a 53 69 7a 65 20 3d 20 30 3b 0a  >ckptJSize = 0;.
5a10: 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20    pPager->nPage 
5a20: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  = 0;.  pPager->m
5a30: 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3e 35  xPage = mxPage>5
5a40: 20 3f 20 6d 78 50 61 67 65 20 3a 20 31 30 3b 0a   ? mxPage : 10;.
5a50: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
5a60: 3d 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b  = SQLITE_UNLOCK;
5a70: 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  .  pPager->errMa
5a80: 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  sk = 0;.  pPager
5a90: 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d  ->tempFile = tem
5aa0: 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
5ab0: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64  >readOnly = read
5ac0: 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Only;.  pPager->
5ad0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
5ae0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
5af0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
5b00: 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c  e || !useJournal
5b10: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
5b20: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
5b30: 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70  ->pLast = 0;.  p
5b40: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
5b50: 6e 45 78 74 72 61 3b 0a 20 20 6d 65 6d 73 65 74  nExtra;.  memset
5b60: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
5b70: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
5b80: 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 2a 70 70  ->aHash));.  *pp
5b90: 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
5ba0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5bb0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
5bc0: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
5bd0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
5be0: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
5bf0: 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
5c00: 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74  called.** when t
5c10: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
5c20: 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  nt on each page 
5c30: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54  reaches zero.  T
5c40: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61  he destructor ca
5c50: 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20  n.** be used to 
5c60: 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61  clean up informa
5c70: 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72  tion in the extr
5c80: 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64  a segment append
5c90: 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e  ed to each page.
5ca0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72  .**.** The destr
5cb0: 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c  uctor is not cal
5cc0: 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20  led as a result 
5cd0: 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f 73  sqlitepager_clos
5ce0: 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75  e().  .** Destru
5cf0: 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63  ctors are only c
5d00: 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 70  alled by sqlitep
5d10: 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f  ager_unref()..*/
5d20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67 65  .void sqlitepage
5d30: 72 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72  r_set_destructor
5d40: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
5d50: 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f  void (*xDesc)(vo
5d60: 69 64 2a 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  id*)){.  pPager-
5d70: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
5d80: 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Desc;.}../*.** R
5d90: 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
5da0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
5db0: 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
5dc0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
5dd0: 0a 2a 2a 20 70 50 61 67 65 72 2e 0a 2a 2f 0a 69  .** pPager..*/.i
5de0: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70  nt sqlitepager_p
5df0: 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
5e00: 70 50 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74  pPager){.  off_t
5e10: 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   n;.  assert( pP
5e20: 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28  ager!=0 );.  if(
5e30: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
5e40: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
5e50: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
5e60: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
5e70: 65 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61  eOsFileSize(&pPa
5e80: 67 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51  ger->fd, &n)!=SQ
5e90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
5ea0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
5eb0: 3d 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b  = PAGER_ERR_DISK
5ec0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
5ed0: 20 20 7d 0a 20 20 6e 20 2f 3d 20 53 51 4c 49 54    }.  n /= SQLIT
5ee0: 45 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 69  E_PAGE_SIZE;.  i
5ef0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
5f00: 21 3d 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20  !=SQLITE_UNLOCK 
5f10: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
5f20: 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20  bSize = n;.  }. 
5f30: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
5f40: 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
5f50: 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
5f60: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
5f70: 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
5f80: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
5f90: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
5fa0: 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
5fb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5fc0: 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
5fd0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
5fe0: 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
5ff0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
6000: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
6010: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
6020: 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
6030: 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
6040: 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
6050: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
6060: 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
6070: 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
6080: 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
6090: 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
60a0: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
60b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
60c0: 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  r_close(Pager *p
60d0: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
60e0: 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
60f0: 73 77 69 74 63 68 28 20 70 50 61 67 65 72 2d 3e  switch( pPager->
6100: 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73  state ){.    cas
6110: 65 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  e SQLITE_WRITELO
6120: 43 4b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  CK: {.      sqli
6130: 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  tepager_rollback
6140: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
6150: 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 26  sqliteOsUnlock(&
6160: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
6170: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
6180: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
6190: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
61a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
61b0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b   SQLITE_READLOCK
61c0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
61d0: 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72  OsUnlock(&pPager
61e0: 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 62 72 65  ->fd);.      bre
61f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
6200: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
6210: 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
6220: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6230: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50 67   }.  }.  for(pPg
6240: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
6250: 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a  Pg; pPg=pNext){.
6260: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d      pNext = pPg-
6270: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73  >pNextAll;.    s
6280: 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
6290: 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73 43 6c    }.  sqliteOsCl
62a0: 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ose(&pPager->fd)
62b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
62c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
62d0: 3d 30 20 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20  =0 );.  /* Temp 
62e0: 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61  files are automa
62f0: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
6300: 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69  by the OS.  ** i
6310: 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
6320: 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71  ile ){.  **   sq
6330: 6c 69 74 65 4f 73 44 65 6c 65 74 65 28 70 50 61  liteOsDelete(pPa
6340: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ger->zFilename);
6350: 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 20 20 73  .  ** }.  */.  s
6360: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
6370: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
6380: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6390: 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
63a0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67  number for the g
63b0: 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a  iven page data..
63c0: 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 70 61  */.Pgno sqlitepa
63d0: 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 76  ger_pagenumber(v
63e0: 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
63f0: 67 48 64 72 20 2a 70 20 3d 20 44 41 54 41 5f 54  gHdr *p = DATA_T
6400: 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
6410: 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f    return p->pgno
6420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  ;.}../*.** Incre
6430: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
6440: 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
6450: 61 67 65 2e 20 20 49 66 20 74 68 65 20 70 61 67  age.  If the pag
6460: 65 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  e is.** currentl
6470: 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  y on the freelis
6480: 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65  t (the reference
6490: 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20   count is zero) 
64a0: 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69  then.** remove i
64b0: 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  t from the freel
64c0: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
64d0: 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48  oid page_ref(PgH
64e0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
64f0: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
6500: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
6510: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20  is currently on 
6520: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
6530: 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20  emove it. */.   
6540: 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
6550: 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ree ){.      pPg
6560: 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65  ->pPrevFree->pNe
6570: 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e  xtFree = pPg->pN
6580: 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c  extFree;.    }el
6590: 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  se{.      pPg->p
65a0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
65b0: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
65c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
65d0: 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a  g->pNextFree ){.
65e0: 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
65f0: 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20  Free->pPrevFree 
6600: 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
6610: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6620: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
6630: 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72  pLast = pPg->pPr
6640: 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20  evFree;.    }.  
6650: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e    pPg->pPager->n
6660: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67  Ref++;.  }.  pPg
6670: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49  ->nRef++;.  REFI
6680: 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  NFO(pPg);.}../*.
6690: 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
66a0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
66b0: 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68   for a page.  Th
66c0: 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20  e input pointer 
66d0: 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  is.** a referenc
66e0: 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 61  e to the page da
66f0: 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ta..*/.int sqlit
6700: 65 70 61 67 65 72 5f 72 65 66 28 76 6f 69 64 20  epager_ref(void 
6710: 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
6720: 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
6730: 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
6740: 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
6750: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6760: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  K;.}../*.** Sync
6770: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
6780: 20 74 68 65 6e 20 77 72 69 74 65 20 61 6c 6c 20   then write all 
6790: 66 72 65 65 20 64 69 72 74 79 20 70 61 67 65 73  free dirty pages
67a0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
67b0: 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  .** file..**.** 
67c0: 57 72 69 74 69 6e 67 20 61 6c 6c 20 66 72 65 65  Writing all free
67d0: 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
67e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 66 74  the database aft
67f0: 65 72 20 74 68 65 20 73 79 6e 63 20 69 73 20 61  er the sync is a
6800: 0a 2a 2a 20 6e 6f 6e 2d 6f 62 76 69 6f 75 73 20  .** non-obvious 
6810: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 66  optimization.  f
6820: 73 79 6e 63 28 29 20 69 73 20 61 6e 20 65 78 70  sync() is an exp
6830: 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  ensive operation
6840: 20 73 6f 20 77 65 0a 2a 2a 20 77 61 6e 74 20 74   so we.** want t
6850: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 6e  o minimize the n
6860: 75 6d 62 65 72 20 6f 74 20 74 69 6d 65 73 20 69  umber ot times i
6870: 74 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 66 74  t is called. Aft
6880: 65 72 20 61 6e 20 66 73 79 6e 63 28 29 20 63 61  er an fsync() ca
6890: 6c 6c 2c 0a 2a 2a 20 77 65 20 61 72 65 20 66 72  ll,.** we are fr
68a0: 65 65 20 74 6f 20 77 72 69 74 65 20 64 69 72 74  ee to write dirt
68b0: 79 20 70 61 67 65 73 20 62 61 63 6b 20 74 6f 20  y pages back to 
68c0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
68d0: 74 20 69 73 20 62 65 73 74 0a 2a 2a 20 74 6f 20  t is best.** to 
68e0: 67 6f 20 61 68 65 61 64 20 61 6e 64 20 77 72 69  go ahead and wri
68f0: 74 65 20 61 73 20 6d 61 6e 79 20 64 69 72 74 79  te as many dirty
6900: 20 70 61 67 65 73 20 61 73 20 70 6f 73 73 69 62   pages as possib
6910: 6c 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 0a  le to minimize .
6920: 2a 2a 20 74 68 65 20 72 69 73 6b 20 6f 66 20 68  ** the risk of h
6930: 61 76 69 6e 67 20 74 6f 20 64 6f 20 61 6e 6f 74  aving to do anot
6940: 68 65 72 20 66 73 79 6e 63 28 29 20 6c 61 74 65  her fsync() late
6950: 72 20 6f 6e 2e 20 20 57 72 69 74 69 6e 67 20 64  r on.  Writing d
6960: 69 72 74 79 0a 2a 2a 20 66 72 65 65 20 70 61 67  irty.** free pag
6970: 65 73 20 69 6e 20 74 68 69 73 20 77 61 79 20 77  es in this way w
6980: 61 73 20 6f 62 73 65 72 76 65 64 20 74 6f 20 6d  as observed to m
6990: 61 6b 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  ake database ope
69a0: 72 61 74 69 6f 6e 73 20 67 6f 0a 2a 2a 20 75 70  rations go.** up
69b0: 20 74 6f 20 31 30 20 74 69 6d 65 73 20 66 61 73   to 10 times fas
69c0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65  ter..**.** If we
69d0: 20 61 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20   are writing to 
69e0: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
69f0: 73 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  se, there is no 
6a00: 6e 65 65 64 20 74 6f 20 70 72 65 73 65 72 76 65  need to preserve
6a10: 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67 72 69 74  .** the integrit
6a20: 79 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y of the journal
6a30: 20 66 69 6c 65 2c 20 73 6f 20 77 65 20 63 61 6e   file, so we can
6a40: 20 73 61 76 65 20 74 69 6d 65 20 61 6e 64 20 73   save time and s
6a50: 6b 69 70 20 74 68 65 0a 2a 2a 20 66 73 79 6e 63  kip the.** fsync
6a60: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
6a70: 74 20 73 79 6e 63 41 6c 6c 50 61 67 65 73 28 50  t syncAllPages(P
6a80: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
6a90: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50   PgHdr *pPg;.  P
6aa0: 67 6e 6f 20 6c 61 73 74 50 67 6e 6f 20 3d 20 30  gno lastPgno = 0
6ab0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
6ac0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79  ITE_OK;..  /* Sy
6ad0: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  nc the journal b
6ae0: 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20  efore modifying 
6af0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
6b00: 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67  e.  ** (assuming
6b10: 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72   there is a jour
6b20: 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73  nal and it needs
6b30: 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a   to be synced.).
6b40: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
6b50: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  r->needSync ){. 
6b60: 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
6b70: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
6b80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 53    rc = sqliteOsS
6b90: 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ync(&pPager->jfd
6ba0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
6bb0: 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
6bc0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
6bd0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
6be0: 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
6bf0: 61 6c 6c 20 64 69 72 74 79 20 66 72 65 65 20 70  all dirty free p
6c00: 61 67 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b  ages to the disk
6c10: 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 74 68   in the order th
6c20: 61 74 20 74 68 65 79 0a 20 20 2a 2a 20 61 70 70  at they.  ** app
6c30: 65 61 72 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ear on the disk.
6c40: 20 20 57 65 20 68 61 76 65 20 65 78 70 65 72 69    We have experi
6c50: 6d 65 6e 74 65 64 20 77 69 74 68 20 73 6f 72 74  mented with sort
6c60: 69 6e 67 20 74 68 65 20 70 61 67 65 73 0a 20 20  ing the pages.  
6c70: 2a 2a 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65  ** by page numbe
6c80: 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  rs so that they 
6c90: 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 20 6f  are written in o
6ca0: 72 64 65 72 2c 20 62 75 74 20 74 68 61 74 20 64  rder, but that d
6cb0: 6f 65 73 0a 20 20 2a 2a 20 6e 6f 74 20 61 70 70  oes.  ** not app
6cc0: 65 61 72 20 74 6f 20 69 6d 70 72 6f 76 65 20 70  ear to improve p
6cd0: 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 20 20 2a 2f  erformance..  */
6ce0: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
6cf0: 72 2d 3e 70 46 69 72 73 74 3b 20 70 50 67 3b 20  r->pFirst; pPg; 
6d00: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 46 72  pPg=pPg->pNextFr
6d10: 65 65 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  ee){.    if( pPg
6d20: 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20  ->dirty ){.     
6d30: 20 69 66 28 20 6c 61 73 74 50 67 6e 6f 3d 3d 30   if( lastPgno==0
6d40: 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 6c   || pPg->pgno!=l
6d50: 61 73 74 50 67 6e 6f 2b 31 20 29 7b 0a 20 20 20  astPgno+1 ){.   
6d60: 20 20 20 20 20 73 71 6c 69 74 65 4f 73 53 65 65       sqliteOsSee
6d70: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  k(&pPager->fd, (
6d80: 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 28 6f 66  pPg->pgno-1)*(of
6d90: 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45 5f  f_t)SQLITE_PAGE_
6da0: 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20  SIZE);.      }. 
6db0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6dc0: 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
6dd0: 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  >fd, PGHDR_TO_DA
6de0: 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54 45 5f  TA(pPg), SQLITE_
6df0: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
6e00: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6e10: 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  _OK ) break;.   
6e20: 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
6e30: 30 3b 0a 20 20 20 20 20 20 6c 61 73 74 50 67 6e  0;.      lastPgn
6e40: 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
6e50: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6e60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
6e70: 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a  cquire a page..*
6e80: 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b  *.** A read lock
6e90: 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   on the disk fil
6ea0: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68  e is obtained wh
6eb0: 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67  en the first pag
6ec0: 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a  e is acquired. .
6ed0: 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63  ** This read loc
6ee0: 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65  k is dropped whe
6ef0: 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  n the last page 
6f00: 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  is released..**.
6f10: 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20  ** A _get works 
6f20: 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d  for any page num
6f30: 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
6f40: 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61   0.  If the data
6f50: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20  base.** file is 
6f60: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
6f70: 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c   requested page,
6f80: 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20   then no actual 
6f90: 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63  disk.** read occ
6fa0: 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f  urs and the memo
6fb0: 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
6fc0: 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
6fd0: 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65  zed to.** all ze
6fe0: 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20  ros.  The extra 
6ff0: 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
7000: 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
7010: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a  s initialized.**
7020: 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69   to zeros the fi
7030: 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
7040: 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
7050: 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
7060: 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
7070: 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
7080: 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
7090: 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
70a0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
70b0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
70c0: 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
70d0: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
70e0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
70f0: 73 71 6c 69 74 65 70 61 67 65 72 5f 6c 6f 6f 6b  sqlitepager_look
7100: 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
7110: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f   routine and _lo
7120: 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
7130: 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
7140: 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
7150: 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
7160: 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
7170: 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
7180: 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
7190: 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
71a0: 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
71b0: 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70   whereas _lookup
71c0: 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
71d0: 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
71e0: 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
71f0: 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
7200: 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
7210: 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
7220: 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
7230: 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
7240: 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
7250: 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f  sary..** Since _
7260: 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  lookup() never g
7270: 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
7280: 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
7290: 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
72a0: 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
72b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70  ..*/.int sqlitep
72c0: 61 67 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a  ager_get(Pager *
72d0: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
72e0: 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65  o, void **ppPage
72f0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
7300: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
7310: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
7320: 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63  ve not hit any c
7330: 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a  ritical errors..
7340: 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 50 61 67    */ .  if( pPag
7350: 65 72 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 30  er==0 || pgno==0
7360: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
7370: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
7380: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
7390: 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52  rrMask & ~(PAGER
73a0: 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20  _ERR_FULL) ){.  
73b0: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
73c0: 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
73d0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
73e0: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70  s is the first p
73f0: 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68  age accessed, th
7400: 65 6e 20 67 65 74 20 61 20 72 65 61 64 20 6c 6f  en get a read lo
7410: 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ck.  ** on the d
7420: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
7430: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
7440: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
7450: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61  rc = sqliteOsRea
7460: 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  dLock(&pPager->f
7470: 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
7480: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7490: 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
74a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
74b0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
74c0: 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54  r->state = SQLIT
74d0: 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 0a 20 20 20  E_READLOCK;..   
74e0: 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
74f0: 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 72   file exists, tr
7500: 79 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63  y to play it bac
7510: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  k..    */.    if
7520: 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
7530: 72 6e 61 6c 20 26 26 20 73 71 6c 69 74 65 4f 73  rnal && sqliteOs
7540: 46 69 6c 65 45 78 69 73 74 73 28 70 50 61 67 65  FileExists(pPage
7550: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a  r->zJournal) ){.
7560: 20 20 20 20 20 20 20 69 6e 74 20 72 63 2c 20 64         int rc, d
7570: 75 6d 6d 79 3b 0a 0a 20 20 20 20 20 20 20 2f 2a  ummy;..       /*
7580: 20 47 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63   Get a write loc
7590: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
75a0: 65 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e.       */.    
75b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
75c0: 57 72 69 74 65 4c 6f 63 6b 28 26 70 50 61 67 65  WriteLock(&pPage
75d0: 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 69  r->fd);.       i
75e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
75f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 69 66 28   ){.         if(
7600: 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28   sqliteOsUnlock(
7610: 26 70 50 61 67 65 72 2d 3e 66 64 29 21 3d 53 51  &pPager->fd)!=SQ
7620: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
7630: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68        /* This sh
7640: 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65  ould never happe
7650: 6e 21 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  n! */.          
7660: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54   rc = SQLITE_INT
7670: 45 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  ERNAL;.         
7680: 7d 0a 20 20 20 20 20 20 20 20 20 2a 70 70 50 61  }.         *ppPa
7690: 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
76a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
76b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67     }.       pPag
76c0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49  er->state = SQLI
76d0: 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a 0a 20  TE_WRITELOCK;.. 
76e0: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
76f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 65 78  e journal for ex
7700: 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 2e 20  clusive access. 
7710: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   Return SQLITE_B
7720: 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 2a 2a  USY if.       **
7730: 20 77 65 20 63 61 6e 6e 6f 74 20 67 65 74 20 65   we cannot get e
7740: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
7750: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
7760: 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a  ile. .       **.
7770: 20 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 74         ** Even t
7780: 68 6f 75 67 68 20 77 65 20 77 69 6c 6c 20 6f 6e  hough we will on
7790: 6c 79 20 62 65 20 72 65 61 64 69 6e 67 20 66 72  ly be reading fr
77a0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
77b0: 6e 6f 74 20 77 72 69 74 69 6e 67 2c 0a 20 20 20  not writing,.   
77c0: 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74      ** we have t
77d0: 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
77e0: 61 6c 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69  al for writing i
77f0: 6e 20 6f 72 64 65 72 20 74 6f 20 6f 62 74 61 69  n order to obtai
7800: 6e 20 61 6e 0a 20 20 20 20 20 20 20 2a 2a 20 65  n an.       ** e
7810: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
7820: 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  lock..       */.
7830: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
7840: 74 65 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  teOsOpenReadWrit
7850: 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
7860: 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
7870: 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20  , &dummy);.     
7880: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7890: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
78a0: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 55 6e 6c  rc = sqliteOsUnl
78b0: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ock(&pPager->fd)
78c0: 3b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65 72  ;.         asser
78d0: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
78e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 2a 70 70   );.         *pp
78f0: 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
7900: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7910: 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a  _BUSY;.       }.
7920: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
7930: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
7940: 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62  .       /* Playb
7950: 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ack and delete t
7960: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f  he journal.  Dro
7970: 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  p the database w
7980: 72 69 74 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c  rite.       ** l
7990: 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
79a0: 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
79b0: 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
79c0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
79d0: 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
79e0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
79f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
7a00: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
7a10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7a20: 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c    pPg = 0;.  }el
7a30: 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63  se{.    /* Searc
7a40: 68 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61  h for page in ca
7a50: 63 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d  che */.    pPg =
7a60: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
7a70: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  ager, pgno);.  }
7a80: 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b  .  if( pPg==0 ){
7a90: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
7aa0: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
7ab0: 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  t in the page ca
7ac0: 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  che. */.    int 
7ad0: 68 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  h;.    pPager->n
7ae0: 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Miss++;.    if( 
7af0: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50  pPager->nPage<pP
7b00: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20  ager->mxPage || 
7b10: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
7b20: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72  0 ){.      /* Cr
7b30: 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
7b40: 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73  */.      pPg = s
7b50: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
7b60: 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 53  sizeof(*pPg) + S
7b70: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20  QLITE_PAGE_SIZE 
7b80: 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  + pPager->nExtra
7b90: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   );.      if( pP
7ba0: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
7bb0: 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
7bc0: 20 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72 69       pager_unwri
7bd0: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
7be0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
7bf0: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
7c00: 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20 20 20  _ERR_MEM;.      
7c10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7c20: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
7c30: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c       memset(pPg,
7c40: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29   0, sizeof(*pPg)
7c50: 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  );.      pPg->pP
7c60: 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
7c70: 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41       pPg->pNextA
7c80: 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c  ll = pPager->pAl
7c90: 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  l;.      if( pPa
7ca0: 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20  ger->pAll ){.   
7cb0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c       pPager->pAl
7cc0: 6c 2d 3e 70 50 72 65 76 41 6c 6c 20 3d 20 70 50  l->pPrevAll = pP
7cd0: 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  g;.      }.     
7ce0: 20 70 50 67 2d 3e 70 50 72 65 76 41 6c 6c 20 3d   pPg->pPrevAll =
7cf0: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
7d00: 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20  ->pAll = pPg;.  
7d10: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
7d20: 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e++;.    }else{.
7d30: 20 20 20 20 20 20 2f 2a 20 52 65 63 79 63 6c 65        /* Recycle
7d40: 20 61 6e 20 6f 6c 64 65 72 20 70 61 67 65 2e 20   an older page. 
7d50: 20 46 69 72 73 74 20 6c 6f 63 61 74 65 20 74 68   First locate th
7d60: 65 20 70 61 67 65 20 74 6f 20 62 65 20 72 65 63  e page to be rec
7d70: 79 63 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  ycled..      ** 
7d80: 54 72 79 20 74 6f 20 66 69 6e 64 20 6f 6e 65 20  Try to find one 
7d90: 74 68 61 74 20 69 73 20 6e 6f 74 20 64 69 72 74  that is not dirt
7da0: 79 20 61 6e 64 20 69 73 20 6e 65 61 72 20 74 68  y and is near th
7db0: 65 20 68 65 61 64 20 6f 66 0a 20 20 20 20 20 20  e head of.      
7dc0: 2a 2a 20 6f 66 20 74 68 65 20 66 72 65 65 20 6c  ** of the free l
7dd0: 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 70 50 67  ist */.      pPg
7de0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
7df0: 74 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  t;.      while( 
7e00: 70 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74  pPg && pPg->dirt
7e10: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  y ){.        pPg
7e20: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
7e30: 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
7e40: 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64    /* If we could
7e50: 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65   not find a page
7e60: 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 62 65   that has not be
7e70: 65 6e 20 75 73 65 64 20 72 65 63 65 6e 74 6c 79  en used recently
7e80: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 77 68  .      ** and wh
7e90: 69 63 68 20 69 73 20 6e 6f 74 20 64 69 72 74 79  ich is not dirty
7ea0: 2c 20 74 68 65 6e 20 73 79 6e 63 20 74 68 65 20  , then sync the 
7eb0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 77 72 69 74  journal and writ
7ec0: 65 20 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 64  e all.      ** d
7ed0: 69 72 74 79 20 66 72 65 65 20 70 61 67 65 73 20  irty free pages 
7ee0: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
7ef0: 65 20 66 69 6c 65 2c 20 74 68 75 73 20 6d 61 6b  e file, thus mak
7f00: 69 6e 67 20 74 68 65 6d 0a 20 20 20 20 20 20 2a  ing them.      *
7f10: 2a 20 63 6c 65 61 6e 20 70 61 67 65 73 20 61 6e  * clean pages an
7f20: 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
7f30: 72 65 63 79 63 6c 69 6e 67 2e 0a 20 20 20 20 20  recycling..     
7f40: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 65 20   **.      ** We 
7f50: 68 61 76 65 20 74 6f 20 73 79 6e 63 20 74 68 65  have to sync the
7f60: 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
7f70: 77 72 69 74 69 6e 67 20 61 20 70 61 67 65 20 74  writing a page t
7f80: 6f 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20  o the main.     
7f90: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20 42   ** database.  B
7fa0: 75 74 20 73 79 6e 63 69 6e 67 20 69 73 20 61 20  ut syncing is a 
7fb0: 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74  very slow operat
7fc0: 69 6f 6e 2e 20 20 53 6f 20 61 66 74 65 72 20 61  ion.  So after a
7fd0: 0a 20 20 20 20 20 20 2a 2a 20 73 79 6e 63 2c 20  .      ** sync, 
7fe0: 69 74 20 69 73 20 62 65 73 74 20 74 6f 20 77 72  it is best to wr
7ff0: 69 74 65 20 65 76 65 72 79 74 68 69 6e 67 20 77  ite everything w
8000: 65 20 63 61 6e 20 62 61 63 6b 20 74 6f 20 74 68  e can back to th
8010: 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20  e main.      ** 
8020: 64 61 74 61 62 61 73 65 20 74 6f 20 6d 69 6e 69  database to mini
8030: 6d 69 7a 65 20 74 68 65 20 72 69 73 6b 20 6f 66  mize the risk of
8040: 20 68 61 76 69 6e 67 20 74 6f 20 73 79 6e 63 20   having to sync 
8050: 61 67 61 69 6e 20 69 6e 20 74 68 65 0a 20 20 20  again in the.   
8060: 20 20 20 2a 2a 20 6e 65 61 72 20 66 75 74 75 72     ** near futur
8070: 65 2e 20 20 54 68 61 74 20 69 73 20 77 68 79 20  e.  That is why 
8080: 77 65 20 77 72 69 74 65 20 61 6c 6c 20 64 69 72  we write all dir
8090: 74 79 20 70 61 67 65 73 20 61 66 74 65 72 20 61  ty pages after a
80a0: 0a 20 20 20 20 20 20 2a 2a 20 73 79 6e 63 2e 0a  .      ** sync..
80b0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
80c0: 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
80d0: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79       int rc = sy
80e0: 6e 63 41 6c 6c 50 61 67 65 73 28 70 50 61 67 65  ncAllPages(pPage
80f0: 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
8100: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
8110: 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72     sqlitepager_r
8120: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
8130: 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 50 61  .          *ppPa
8140: 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
8150: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8160: 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d  IOERR;.        }
8170: 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 70  .        pPg = p
8180: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20  Pager->pFirst;. 
8190: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
81a0: 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d  ert( pPg->nRef==
81b0: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
81c0: 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30  t( pPg->dirty==0
81d0: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
81e0: 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
81f0: 20 72 65 63 79 63 6c 79 69 6e 67 20 69 73 20 6d   recyclying is m
8200: 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
8210: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20  ollback, then.  
8220: 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67      ** set the g
8230: 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c  lobal alwaysRoll
8240: 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20  back flag, thus 
8250: 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20  disabling the.  
8260: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f      ** sqlite_do
8270: 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70  nt_rollback() op
8280: 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
8290: 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20  he rest of this 
82a0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
82b0: 20 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65     ** It is nece
82c0: 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73  ssary to do this
82d0: 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
82e0: 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  e marked alwaysR
82f0: 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a  ollback.      **
8300: 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64   might be reload
8310: 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69  ed at a later ti
8320: 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70  me but at that p
8330: 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65  oint we won't re
8340: 6d 65 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20  member.      ** 
8350: 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b  that is was mark
8360: 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ed alwaysRollbac
8370: 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74  k.  This means t
8380: 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75  hat all pages mu
8390: 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 6d  st.      ** be m
83a0: 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
83b0: 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72  ollback from her
83c0: 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 20 20 20 20  e on out..      
83d0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  */.      if( pPg
83e0: 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
83f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
8400: 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
8410: 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ck = 1;.      }.
8420: 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b  .      /* Unlink
8430: 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72   the old page fr
8440: 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  om the free list
8450: 20 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61   and the hash ta
8460: 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ble.      */.   
8470: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
8480: 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20  vFree ){.       
8490: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
84a0: 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
84b0: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
84c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
84d0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
84e0: 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b  ->pFirst==pPg );
84f0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
8500: 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70  >pFirst = pPg->p
8510: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20  NextFree;.      
8520: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  }.      if( pPg-
8530: 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20  >pNextFree ){.  
8540: 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
8550: 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20  Free->pPrevFree 
8560: 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
8570: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8580: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
8590: 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50  Pager->pLast==pP
85a0: 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  g );.        pPa
85b0: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67  ger->pLast = pPg
85c0: 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20  ->pPrevFree;.   
85d0: 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e     }.      pPg->
85e0: 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
85f0: 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a  >pPrevFree = 0;.
8600: 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70        if( pPg->p
8610: 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
8620: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
8630: 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  sh->pPrevHash = 
8640: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a  pPg->pPrevHash;.
8650: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8660: 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  ( pPg->pPrevHash
8670: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   ){.        pPg-
8680: 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78  >pPrevHash->pNex
8690: 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65  tHash = pPg->pNe
86a0: 78 74 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 65  xtHash;.      }e
86b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 68 20 3d  lse{.        h =
86c0: 20 70 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d   pager_hash(pPg-
86d0: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
86e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
86f0: 61 48 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b  aHash[h]==pPg );
8700: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
8710: 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d  >aHash[h] = pPg-
8720: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 20 20  >pNextHash;.    
8730: 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70    }.      pPg->p
8740: 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
8750: 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 20  pPrevHash = 0;. 
8760: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4f 76       pPager->nOv
8770: 66 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fl++;.    }.    
8780: 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  pPg->pgno = pgno
8790: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
87a0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  ->aInJournal && 
87b0: 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
87c0: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
87d0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
87e0: 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d  urnal = (pPager-
87f0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f  >aInJournal[pgno
8800: 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26  /8] & (1<<(pgno&
8810: 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 7d 65 6c  7)))!=0;.    }el
8820: 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69  se{.      pPg->i
8830: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
8840: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
8850: 65 72 2d 3e 61 49 6e 43 6b 70 74 20 26 26 20 28  er->aInCkpt && (
8860: 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72  int)pgno<=pPager
8870: 2d 3e 63 6b 70 74 53 69 7a 65 0a 20 20 20 20 20  ->ckptSize.     
8880: 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61 67          && (pPag
8890: 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70 67 6e 6f  er->aInCkpt[pgno
88a0: 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26  /8] & (1<<(pgno&
88b0: 37 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  7)))!=0 ){.     
88c0: 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b 70   page_add_to_ckp
88d0: 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
88e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61   }else{.      pa
88f0: 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 63  ge_remove_from_c
8900: 6b 70 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  kpt_list(pPg);. 
8910: 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69     }.    pPg->di
8920: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 67  rty = 0;.    pPg
8930: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
8940: 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20  REFINFO(pPg);.  
8950: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b    pPager->nRef++
8960: 3b 0a 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f  ;.    h = pager_
8970: 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20 20  hash(pgno);.    
8980: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
8990: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
89a0: 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  ];.    pPager->a
89b0: 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
89c0: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
89d0: 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61  tHash ){.      a
89e0: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
89f0: 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
8a00: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67  ==0 );.      pPg
8a10: 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
8a20: 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
8a30: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
8a40: 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 29 20 73  er->dbSize<0 ) s
8a50: 71 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65 63  qlitepager_pagec
8a60: 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
8a70: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
8a80: 53 69 7a 65 3c 28 69 6e 74 29 70 67 6e 6f 20 29  Size<(int)pgno )
8a90: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
8aa0: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
8ab0: 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47  ), 0, SQLITE_PAG
8ac0: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 65 6c  E_SIZE);.    }el
8ad0: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  se{.      int rc
8ae0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73  ;.      sqliteOs
8af0: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Seek(&pPager->fd
8b00: 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f  , (pgno-1)*(off_
8b10: 74 29 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  t)SQLITE_PAGE_SI
8b20: 5a 45 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ZE);.      rc = 
8b30: 73 71 6c 69 74 65 4f 73 52 65 61 64 28 26 70 50  sqliteOsRead(&pP
8b40: 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
8b50: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53 51  TO_DATA(pPg), SQ
8b60: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
8b70: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
8b80: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8b90: 20 20 20 20 6f 66 66 5f 74 20 66 69 6c 65 53 69      off_t fileSi
8ba0: 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
8bb0: 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a 65  sqliteOsFileSize
8bc0: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 26 66 69  (&pPager->fd,&fi
8bd0: 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49 54 45 5f  leSize)!=SQLITE_
8be0: 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  OK.             
8bf0: 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e 3d 70    || fileSize>=p
8c00: 67 6e 6f 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f  gno*SQLITE_PAGE_
8c10: 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
8c20: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
8c30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8c40: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
8c50: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
8c60: 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f   0, SQLITE_PAGE_
8c70: 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 7d  SIZE);.        }
8c80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8c90: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
8ca0: 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20  Extra>0 ){.     
8cb0: 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
8cc0: 5f 45 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20  _EXTRA(pPg), 0, 
8cd0: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
8ce0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
8cf0: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
8d00: 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20  sted page is in 
8d10: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
8d20: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
8d30: 48 69 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65 5f  Hit++;.    page_
8d40: 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ref(pPg);.  }.  
8d50: 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f  *ppPage = PGHDR_
8d60: 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
8d70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8d80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
8d90: 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
8da0: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
8db0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
8dc0: 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
8dd0: 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
8de0: 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
8df0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
8e00: 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
8e10: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
8e20: 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a   in cache..**.**
8e30: 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
8e40: 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68  pager_get().  Th
8e50: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
8e60: 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
8e70: 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 70  e.** and sqlitep
8e80: 61 67 65 72 5f 67 65 74 28 29 20 69 73 20 74 68  ager_get() is th
8e90: 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
8ea0: 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
8eb0: 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
8ec0: 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
8ed0: 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
8ee0: 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
8ef0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
8f00: 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
8f10: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
8f20: 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
8f30: 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
8f40: 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
8f50: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  d..*/.void *sqli
8f60: 74 65 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50  tepager_lookup(P
8f70: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
8f80: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
8f90: 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 4d 61  r *pPg;..  /* Ma
8fa0: 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
8fb0: 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69 74  not hit any crit
8fc0: 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a  ical errors..  *
8fd0: 2f 20 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d  / .  if( pPager=
8fe0: 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 29 7b  =0 || pgno==0 ){
8ff0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
9000: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
9010: 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47  >errMask & ~(PAG
9020: 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a  ER_ERR_FULL) ){.
9030: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
9040: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
9050: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 72  nRef==0 ){.    r
9060: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
9070: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
9080: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
9090: 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20  .  if( pPg==0 ) 
90a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 61 67 65  return 0;.  page
90b0: 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74  _ref(pPg);.  ret
90c0: 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  urn PGHDR_TO_DAT
90d0: 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  A(pPg);.}../*.**
90e0: 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e   Release a page.
90f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
9100: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
9110: 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
9120: 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
9130: 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
9140: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
9150: 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
9160: 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
9170: 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
9180: 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
9190: 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
91a0: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
91b0: 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
91c0: 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20  removed..*/.int 
91d0: 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65  sqlitepager_unre
91e0: 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  f(void *pData){.
91f0: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
9200: 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
9210: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
9220: 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a  t for this page.
9230: 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 44 41 54    */.  pPg = DAT
9240: 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
9250: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
9260: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50  ->nRef>0 );.  pP
9270: 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46  g->nRef--;.  REF
9280: 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  INFO(pPg);..  /*
9290: 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   When the number
92a0: 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
92b0: 6f 20 61 20 70 61 67 65 20 72 65 61 63 68 20 30  o a page reach 0
92c0: 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20  , call the.  ** 
92d0: 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61  destructor and a
92e0: 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  dd the page to t
92f0: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a  he freelist..  *
9300: 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  /.  if( pPg->nRe
9310: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65  f==0 ){.    Page
9320: 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70  r *pPager;.    p
9330: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
9340: 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  ger;.    pPg->pN
9350: 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  extFree = 0;.   
9360: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
9370: 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b  = pPager->pLast;
9380: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  .    pPager->pLa
9390: 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66  st = pPg;.    if
93a0: 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
93b0: 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
93c0: 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
93d0: 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ree = pPg;.    }
93e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
93f0: 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
9400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9410: 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
9420: 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  tor ){.      pPa
9430: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
9440: 28 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  (pData);.    }. 
9450: 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c   .    /* When al
9460: 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74 68  l pages reach th
9470: 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70  e freelist, drop
9480: 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66   the read lock f
9490: 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  rom.    ** the d
94a0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
94b0: 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
94c0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73  >nRef--;.    ass
94d0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
94e0: 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  f>=0 );.    if( 
94f0: 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
9500: 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  ){.      pager_r
9510: 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
9520: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
9530: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
9540: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f  *.** Create a jo
9550: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
9560: 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68  Pager.  There sh
9570: 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
9580: 61 20 77 72 69 74 65 0a 2a 2a 20 6c 6f 63 6b 20  a write.** lock 
9590: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
95a0: 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
95b0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
95c0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
95d0: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
95e0: 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20  ything.  Return 
95f0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
9600: 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a  d release the.**
9610: 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61   write lock if a
9620: 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
9630: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
9640: 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
9650: 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
9660: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
9670: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9680: 3e 73 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 57  >state==SQLITE_W
9690: 52 49 54 45 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RITELOCK );.  as
96a0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
96b0: 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
96c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
96d0: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
96e0: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
96f0: 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  rnal = sqliteMal
9700: 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53  loc( pPager->dbS
9710: 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69  ize/8 + 1 );.  i
9720: 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
9730: 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
9740: 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b  sqliteOsReadLock
9750: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
9760: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
9770: 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f   = SQLITE_READLO
9780: 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  CK;.    return S
9790: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
97a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73  .  rc = sqliteOs
97b0: 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50  OpenExclusive(pP
97c0: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
97d0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 70 50 61  &pPager->jfd,pPa
97e0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
97f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9800: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
9810: 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  eFree(pPager->aI
9820: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
9830: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
9840: 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  l = 0;.    sqlit
9850: 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70 50 61  eOsReadLock(&pPa
9860: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 70 50  ger->fd);.    pP
9870: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51  ager->state = SQ
9880: 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20  LITE_READLOCK;. 
9890: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
98a0: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20  _CANTOPEN;.  }. 
98b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
98c0: 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67  Open = 1;.  pPag
98d0: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
98e0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61  ;.  pPager->alwa
98f0: 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ysRollback = 0;.
9900: 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70 61    sqlitepager_pa
9910: 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
9920: 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
9930: 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
9940: 64 62 53 69 7a 65 3b 0a 20 20 69 66 28 20 70 61  dbSize;.  if( pa
9950: 67 65 72 5f 6f 6c 64 5f 66 6f 72 6d 61 74 20 29  ger_old_format )
9960: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
9970: 65 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  eOsWrite(&pPager
9980: 2d 3e 6a 66 64 2c 20 61 4f 6c 64 4a 6f 75 72 6e  ->jfd, aOldJourn
9990: 61 6c 4d 61 67 69 63 2c 0a 20 20 20 20 20 20 20  alMagic,.       
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99b0: 73 69 7a 65 6f 66 28 61 4f 6c 64 4a 6f 75 72 6e  sizeof(aOldJourn
99c0: 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 7d 65 6c  alMagic));.  }el
99d0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
99e0: 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61 67  iteOsWrite(&pPag
99f0: 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
9a00: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
9a10: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
9a20: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
9a30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
9a40: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
9a50: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
9a60: 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
9a70: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
9a80: 3e 63 6b 70 74 41 75 74 6f 6f 70 65 6e 20 26 26  >ckptAutoopen &&
9a90: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
9aa0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
9ab0: 65 70 61 67 65 72 5f 63 6b 70 74 5f 62 65 67 69  epager_ckpt_begi
9ac0: 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  n(pPager);.  }. 
9ad0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9ae0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
9af0: 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
9b00: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
9b10: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
9b20: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
9b30: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
9b40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
9b50: 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  ;  .}../*.** Acq
9b60: 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
9b70: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
9b80: 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20  e.  The lock is 
9b90: 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20  removed when.** 
9ba0: 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66  the any of the f
9bb0: 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a  ollowing happen:
9bc0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  .**.**   *  sqli
9bd0: 74 65 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29  tepager_commit()
9be0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
9bf0: 20 2a 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f   *  sqlitepager_
9c00: 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61  rollback() is ca
9c10: 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
9c20: 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f 73 65 28  litepager_close(
9c30: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
9c40: 20 20 2a 20 20 73 71 6c 69 74 65 70 61 67 65 72    *  sqlitepager
9c50: 5f 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c  _unref() is call
9c60: 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f  ed to on every o
9c70: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e  utstanding page.
9c80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d  .**.** The param
9c90: 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75  eter to this rou
9ca0: 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65  tine is a pointe
9cb0: 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61  r to any open pa
9cc0: 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ge of the.** dat
9cd0: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
9ce0: 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f  hing changes abo
9cf0: 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74  ut the page - it
9d00: 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 0a   is used merely.
9d10: 2a 2a 20 74 6f 20 61 63 71 75 69 72 65 20 61 20  ** to acquire a 
9d20: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
9d30: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
9d40: 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74  nd as proof that
9d50: 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6c 72   there.** is alr
9d60: 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
9d70: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
9d80: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61  ..**.** A journa
9d90: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
9da0: 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
9db0: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
9dc0: 2e 20 20 46 6f 72 0a 2a 2a 20 74 65 6d 70 6f 72  .  For.** tempor
9dd0: 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 6f  ary files, the o
9de0: 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  pening of the jo
9df0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
9e00: 66 65 72 72 65 64 20 75 6e 74 69 6c 0a 2a 2a 20  ferred until.** 
9e10: 74 68 65 72 65 20 69 73 20 61 6e 20 61 63 74 75  there is an actu
9e20: 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  al need to write
9e30: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
9e40: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
9e50: 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
9e60: 79 20 77 72 69 74 65 2d 6c 6f 63 6b 65 64 2c 20  y write-locked, 
9e70: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
9e80: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
9e90: 73 71 6c 69 74 65 70 61 67 65 72 5f 62 65 67 69  sqlitepager_begi
9ea0: 6e 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  n(void *pData){.
9eb0: 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
9ec0: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
9ed0: 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ta);.  Pager *pP
9ee0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
9ef0: 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
9f00: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
9f10: 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
9f20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9f30: 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49  ger->state!=SQLI
9f40: 54 45 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69  TE_UNLOCK );.  i
9f50: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
9f60: 3d 3d 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43  ==SQLITE_READLOC
9f70: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
9f80: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
9f90: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  nal==0 );.    rc
9fa0: 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65   = sqliteOsWrite
9fb0: 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
9fc0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
9fd0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9fe0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
9ff0: 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73   }.    pPager->s
a000: 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 57 52  tate = SQLITE_WR
a010: 49 54 45 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61  ITELOCK;.    pPa
a020: 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 20 3d  ger->dirtyFile =
a030: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
a040: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26  er->useJournal &
a050: 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
a060: 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ile ){.      rc 
a070: 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
a080: 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
a090: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
a0a0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
a0b0: 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
a0c0: 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68  s writeable.  Th
a0d0: 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
a0e0: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
a0f0: 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  al .** if it is 
a100: 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
a110: 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
a120: 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
a130: 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a  before making.**
a140: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61   changes to a pa
a150: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
a160: 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f  rst time this ro
a170: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
a180: 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74   the pager creat
a190: 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72  es a new.** jour
a1a0: 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73  nal and acquires
a1b0: 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e   a write lock on
a1c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
a1d0: 49 66 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20  If the write.** 
a1e0: 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62  lock could not b
a1f0: 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73  e acquired, this
a200: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
a210: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54   SQLITE_BUSY.  T
a220: 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
a230: 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b  utine must check
a240: 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e   for that return
a250: 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61   value and be ca
a260: 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20  reful not to.** 
a270: 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
a280: 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20  data until this 
a290: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
a2a0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
a2b0: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
a2c0: 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  file could not b
a2d0: 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73  e written becaus
a2e0: 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75  e the disk is fu
a2f0: 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  ll,.** then this
a300: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
a310: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64   SQLITE_FULL and
a320: 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61   does an immedia
a330: 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20  te rollback..** 
a340: 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77  All subsequent w
a350: 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c  rite attempts al
a360: 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  so return SQLITE
a370: 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72  _FULL until ther
a380: 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74  e.** is a call t
a390: 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6f  o sqlitepager_co
a3a0: 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65  mmit() or sqlite
a3b0: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29  pager_rollback()
a3c0: 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f   to.** reset..*/
a3d0: 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72  .int sqlitepager
a3e0: 5f 77 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61  _write(void *pDa
a3f0: 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
a400: 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
a410: 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
a420: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
a430: 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
a440: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
a450: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65    /* Check for e
a460: 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28  rrors.  */.  if(
a470: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
a480: 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
a490: 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
a4a0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
a4b0: 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
a4c0: 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
a4d0: 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d  SQLITE_PERM;.  }
a4e0: 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
a4f0: 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
a500: 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
a510: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
a520: 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
a530: 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
a540: 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
a550: 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70  t away..  */.  p
a560: 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20  Pg->dirty = 1;. 
a570: 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72   if( pPg->inJour
a580: 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 43  nal && (pPg->inC
a590: 6b 70 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63  kpt || pPager->c
a5a0: 6b 70 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a  kptInUse==0) ){.
a5b0: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
a5c0: 79 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 72  yFile = 1;.    r
a5d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a5e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
a5f0: 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
a600: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
a610: 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
a620: 65 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74  e.  ** written t
a630: 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
a640: 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65  n journal or the
a650: 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   ckeckpoint jour
a660: 6e 61 6c 0a 20 20 2a 2a 20 6f 72 20 62 6f 74 68  nal.  ** or both
a670: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 69 72 73  ..  **.  ** Firs
a680: 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  t check to see t
a690: 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
a6a0: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ion journal exis
a6b0: 74 73 20 61 6e 64 0a 20 20 2a 2a 20 63 72 65 61  ts and.  ** crea
a6c0: 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73  te it if it does
a6d0: 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   not..  */.  ass
a6e0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
a6f0: 74 65 21 3d 53 51 4c 49 54 45 5f 55 4e 4c 4f 43  te!=SQLITE_UNLOC
a700: 4b 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  K );.  rc = sqli
a710: 74 65 70 61 67 65 72 5f 62 65 67 69 6e 28 70 44  tepager_begin(pD
a720: 61 74 61 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ata);.  if( rc!=
a730: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a740: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
a750: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a760: 2d 3e 73 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ->state==SQLITE_
a770: 57 52 49 54 45 4c 4f 43 4b 20 29 3b 0a 20 20 69  WRITELOCK );.  i
a780: 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
a790: 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
a7a0: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  r->useJournal ){
a7b0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
a7c0: 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
a7d0: 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
a7e0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
a7f0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
a800: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
a810: 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70  ournalOpen || !p
a820: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
a830: 6c 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  l );.  pPager->d
a840: 69 72 74 79 46 69 6c 65 20 3d 20 31 3b 0a 0a 20  irtyFile = 1;.. 
a850: 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
a860: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20  ion journal now 
a870: 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61  exists and we ha
a880: 76 65 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  ve a write lock 
a890: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6d 61 69 6e  on the.  ** main
a8a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
a8b0: 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
a8c0: 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 74  nt page to the t
a8d0: 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
a8e0: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
a8f0: 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
a900: 61 64 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ady..  */.  if( 
a910: 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
a920: 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
a930: 75 72 6e 61 6c 20 0a 20 20 20 20 20 20 20 20 20  urnal .         
a940: 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
a950: 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
a960: 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  gDbSize ){.    r
a970: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
a980: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
a990: 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  g->pgno);.    if
a9a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
a9b0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
a9c0: 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61  liteOsWrite(&pPa
a9d0: 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 2c  ger->jfd, pData,
a9e0: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
a9f0: 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  E);.    }.    if
aa00: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
aa10: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 70  ){.      sqlitep
aa20: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
aa30: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61  ager);.      pPa
aa40: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
aa50: 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a  PAGER_ERR_FULL;.
aa60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
aa70: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
aa80: 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
aa90: 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
aaa0: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
aab0: 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
aac0: 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
aad0: 26 37 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  &7);.    pPager-
aae0: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
aaf0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20  ger->noSync;.   
ab00: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
ab10: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 1;.    if( pPa
ab20: 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 29  ger->ckptInUse )
ab30: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
ab40: 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70 67 6e  aInCkpt[pPg->pgn
ab50: 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
ab60: 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
ab70: 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b 70 74  page_add_to_ckpt
ab80: 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
ab90: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
aba0: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
abb0: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
abc0: 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
abd0: 74 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20 74 68  t in it,.  ** th
abe0: 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
abf0: 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
ac00: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
ac10: 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nal..  */.  if( 
ac20: 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73  pPager->ckptInUs
ac30: 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 43 6b 70  e && !pPg->inCkp
ac40: 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  t && (int)pPg->p
ac50: 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 63 6b 70  gno<=pPager->ckp
ac60: 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73  tSize ){.    ass
ac70: 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
ac80: 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d  nal || (int)pPg-
ac90: 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  >pgno>pPager->or
aca0: 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
acb0: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
acc0: 28 26 70 50 61 67 65 72 2d 3e 63 70 66 64 2c 20  (&pPager->cpfd, 
acd0: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
ace0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
acf0: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
ad00: 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70  sqliteOsWrite(&p
ad10: 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 70 44 61  Pager->cpfd, pDa
ad20: 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  ta, SQLITE_PAGE_
ad30: 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20  SIZE);.    }.   
ad40: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ad50: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
ad60: 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  tepager_rollback
ad70: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
ad80: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
ad90: 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  |= PAGER_ERR_FUL
ada0: 4c 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  L;.      return 
adb0: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
adc0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
add0: 6e 43 6b 70 74 21 3d 30 20 29 3b 0a 20 20 20 20  nCkpt!=0 );.    
ade0: 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b  pPager->aInCkpt[
adf0: 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
ae00: 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
ae10: 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74  ;.    page_add_t
ae20: 6f 5f 63 6b 70 74 5f 6c 69 73 74 28 70 50 67 29  o_ckpt_list(pPg)
ae30: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  ;.  }..  /* Upda
ae40: 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
ae50: 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
ae60: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
ae70: 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29  er->dbSize<(int)
ae80: 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
ae90: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
aea0: 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d  = pPg->pgno;.  }
aeb0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
aec0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
aed0: 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67  UE if the page g
aee0: 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
aef0: 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75  ment was previou
af00: 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f  sly passed.** to
af10: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 77 72 69   sqlitepager_wri
af20: 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20  te().  In other 
af30: 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
af40: 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a  UE if it is ok.*
af50: 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
af60: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
af70: 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  age..*/.int sqli
af80: 74 65 70 61 67 65 72 5f 69 73 77 72 69 74 65 61  tepager_iswritea
af90: 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ble(void *pData)
afa0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
afb0: 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
afc0: 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
afd0: 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a 2f  pPg->dirty;.}../
afe0: 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
aff0: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
b000: 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
b010: 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
b020: 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65  sary to.** write
b030: 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
b040: 20 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f 22 20   on page "pgno" 
b050: 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b  back to the disk
b060: 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a  , even though.**
b070: 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74   that page might
b080: 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
b090: 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  rty..**.** The o
b0a0: 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72  verlying softwar
b0b0: 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68  e layer calls th
b0c0: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
b0d0: 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a  all of the data.
b0e0: 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ** on the given 
b0f0: 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20  page is unused. 
b100: 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73   The pager marks
b110: 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
b120: 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  an so.** that it
b130: 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72   does not get wr
b140: 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a  itten to disk..*
b150: 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20  *.** Tests show 
b160: 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69  that this optimi
b170: 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72  zation, together
b180: 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c   with the.** sql
b190: 69 74 65 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f  itepager_dont_ro
b1a0: 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20  llback() below, 
b1b0: 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65  more than double
b1c0: 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66   the speed.** of
b1d0: 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70   large INSERT op
b1e0: 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61  erations and qua
b1f0: 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64  druple the speed
b200: 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45   of large DELETE
b210: 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  s..**.** When th
b220: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
b230: 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c  lled, set the al
b240: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
b250: 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75  g to true..** Su
b260: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
b270: 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 64 6f  o sqlitepager_do
b280: 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  nt_rollback() fo
b290: 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a  r the same page.
b2a0: 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74  ** will thereaft
b2b0: 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20  er be ignored.  
b2c0: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
b2d0: 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f  y to avoid a pro
b2e0: 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20  blem.** where a 
b2f0: 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69  page with data i
b300: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  s added to the f
b310: 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f  reelist during o
b320: 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20  ne part of.** a 
b330: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e  transaction then
b340: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
b350: 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
b360: 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a  g a later part.*
b370: 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72  * of the same tr
b380: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65  ansaction and re
b390: 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74  used for some ot
b3a0: 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68  her purpose.  Wh
b3b0: 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73  en it.** is firs
b3c0: 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  t added to the f
b3d0: 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f  reelist, this ro
b3e0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
b3f0: 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a    When reused,.*
b400: 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62  * the dont_rollb
b410: 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73  ack() routine is
b420: 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65   called.  But be
b430: 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 63  cause the page c
b440: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69  ontains.** criti
b450: 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69  cal data, we sti
b460: 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75  ll need to be su
b470: 72 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c 65  re it gets rolle
b480: 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 0a  d back in spite.
b490: 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72  ** of the dont_r
b4a0: 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a  ollback() call..
b4b0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61  */.void sqlitepa
b4c0: 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50  ger_dont_write(P
b4d0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
b4e0: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
b4f0: 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d  r *pPg;..  pPg =
b500: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
b510: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70  ager, pgno);.  p
b520: 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
b530: 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50  ck = 1;.  if( pP
b540: 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79 20  g && pPg->dirty 
b550: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
b560: 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29  r->dbSize==(int)
b570: 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61  pPg->pgno && pPa
b580: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c  ger->origDbSize<
b590: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
b5a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
b5b0: 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20  is pages is the 
b5c0: 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  last page in the
b5d0: 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
b5e0: 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20  le has grown.   
b5f0: 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65     ** during the
b600: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
b610: 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f  tion, then do NO
b620: 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  T mark the page 
b630: 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20  as clean..      
b640: 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61  ** When the data
b650: 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c  base file grows,
b660: 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75   we must make su
b670: 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  re that the last
b680: 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67   page.      ** g
b690: 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c  ets written at l
b6a0: 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61  east once so tha
b6b0: 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  t the disk file 
b6c0: 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72  will be the corr
b6d0: 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a  ect.      ** siz
b6e0: 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74  e. If you do not
b6f0: 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65   write this page
b700: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
b710: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20   the file.      
b720: 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65  ** on the disk e
b730: 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f  nds up being too
b740: 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e   small, that can
b750: 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
b760: 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75  e.      ** corru
b770: 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65  ption during the
b780: 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f   next transactio
b790: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
b7a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
b7b0: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
b7c0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
b7d0: 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
b7e0: 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
b7f0: 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61   pager that if a
b800: 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
b810: 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e  ,.** it is not n
b820: 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74  ecessary to rest
b830: 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20  ore the data on 
b840: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20  the given page. 
b850: 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74   This.** means t
b860: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f  hat the pager do
b870: 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72  es not have to r
b880: 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20  ecord the given 
b890: 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72  page in the.** r
b8a0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
b8b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70  .*/.void sqlitep
b8c0: 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  ager_dont_rollba
b8d0: 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  ck(void *pData){
b8e0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
b8f0: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
b900: 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70  ata);.  Pager *p
b910: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
b920: 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  ger;..  if( pPag
b930: 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54  er->state!=SQLIT
b940: 45 5f 57 52 49 54 45 4c 4f 43 4b 20 7c 7c 20 70  E_WRITELOCK || p
b950: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
b960: 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  en==0 ) return;.
b970: 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
b980: 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61  sRollback || pPa
b990: 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
b9a0: 61 63 6b 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ack ) return;.  
b9b0: 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  if( !pPg->inJour
b9c0: 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d  nal && (int)pPg-
b9d0: 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
b9e0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
b9f0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
ba00: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->aInJournal!=0
ba10: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
ba20: 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e  aInJournal[pPg->
ba30: 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
ba40: 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
ba50: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
ba60: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 1;.    if( pPa
ba70: 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 29  ger->ckptInUse )
ba80: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
ba90: 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70 67 6e  aInCkpt[pPg->pgn
baa0: 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
bab0: 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
bac0: 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b 70 74  page_add_to_ckpt
bad0: 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
bae0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  }.  }.  if( pPag
baf0: 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 26 26  er->ckptInUse &&
bb00: 20 21 70 50 67 2d 3e 69 6e 43 6b 70 74 20 26 26   !pPg->inCkpt &&
bb10: 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
bb20: 3d 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a  =pPager->ckptSiz
bb30: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
bb40: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
bb50: 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
bb60: 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
bb70: 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
bb80: 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43  rt( pPager->aInC
bb90: 6b 70 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  kpt!=0 );.    pP
bba0: 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70 50  ager->aInCkpt[pP
bbb0: 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
bbc0: 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
bbd0: 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
bbe0: 63 6b 70 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  ckpt_list(pPg);.
bbf0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d    }.}../*.** Com
bc00: 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20  mit all changes 
bc10: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
bc20: 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20  and release the 
bc30: 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  write lock..**.*
bc40: 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  * If the commit 
bc50: 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
bc60: 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ason, a rollback
bc70: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
bc80: 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
bc90: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
bca0: 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  d.  If the commi
bcb0: 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45  t worked, SQLITE
bcc0: 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
bcd0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
bce0: 65 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61  epager_commit(Pa
bcf0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
bd00: 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
bd10: 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61  *pPg;..  if( pPa
bd20: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41  ger->errMask==PA
bd30: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a  GER_ERR_FULL ){.
bd40: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70      rc = sqlitep
bd50: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
bd60: 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
bd70: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
bd80: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
bd90: 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
bda0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
bdb0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
bdc0: 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20  rrMask!=0 ){.   
bdd0: 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63   rc = pager_errc
bde0: 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ode(pPager);.   
bdf0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
be00: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
be10: 61 74 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54  ate!=SQLITE_WRIT
be20: 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  ELOCK ){.    ret
be30: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
be40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
be50: 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 3d 3d 30  er->dirtyFile==0
be60: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20   ){.    /* Exit 
be70: 65 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64  early (without d
be80: 6f 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f  oing the time-co
be90: 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 4f 73  nsuming sqliteOs
bea0: 53 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20  Sync() calls).  
beb0: 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61    ** if there ha
bec0: 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67  ve been no chang
bed0: 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
bee0: 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
bef0: 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
bf00: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
bf10: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
bf20: 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74  ze = -1;.    ret
bf30: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
bf40: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
bf50: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 69  urnalOpen );.  i
bf60: 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  f( pPager->needS
bf70: 79 6e 63 20 26 26 20 73 71 6c 69 74 65 4f 73 53  ync && sqliteOsS
bf80: 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ync(&pPager->jfd
bf90: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
bfa0: 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f      goto commit_
bfb0: 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 66 6f 72  abort;.  }.  for
bfc0: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
bfd0: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
bfe0: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
bff0: 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d  if( pPg->dirty==
c000: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
c010: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 53    rc = sqliteOsS
c020: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  eek(&pPager->fd,
c030: 20 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 28   (pPg->pgno-1)*(
c040: 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47  off_t)SQLITE_PAG
c050: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28  E_SIZE);.    if(
c060: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c070: 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f   goto commit_abo
c080: 72 74 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rt;.    rc = sql
c090: 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61 67  iteOsWrite(&pPag
c0a0: 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f  er->fd, PGHDR_TO
c0b0: 5f 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49  _DATA(pPg), SQLI
c0c0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
c0d0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c0e0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
c0f0: 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  it_abort;.  }.  
c100: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
c110: 79 6e 63 20 26 26 20 73 71 6c 69 74 65 4f 73 53  ync && sqliteOsS
c120: 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ync(&pPager->fd)
c130: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
c140: 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61     goto commit_a
c150: 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  bort;.  }.  rc =
c160: 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
c170: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  ck(pPager);.  pP
c180: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
c190: 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  1;.  return rc;.
c1a0: 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
c1b0: 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
c1c0: 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74 68   wrong during th
c1d0: 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  e commit process
c1e0: 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62  ..  */.commit_ab
c1f0: 6f 72 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69  ort:.  rc = sqli
c200: 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  tepager_rollback
c210: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
c220: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c230: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
c240: 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74  _FULL;.  }.  ret
c250: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
c260: 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   Rollback all ch
c270: 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61  anges.  The data
c280: 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20  base falls back 
c290: 74 6f 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 6f 64  to read-only mod
c2a0: 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d  e..** All in-mem
c2b0: 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
c2c0: 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20  revert to their 
c2d0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f  original data co
c2e0: 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a  ntents..** The j
c2f0: 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65  ournal is delete
c300: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
c310: 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
c320: 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  l unless some ot
c330: 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e  her process is n
c340: 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  ot following.** 
c350: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
c360: 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51  ing protocol (SQ
c370: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f  LITE_PROTOCOL) o
c380: 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  r unless some ot
c390: 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  her.** process i
c3a0: 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20  s writing trash 
c3b0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
c3c0: 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f   file (SQLITE_CO
c3d0: 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c  RRUPT) or.** unl
c3e0: 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c  ess a prior mall
c3f0: 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c  oc() failed (SQL
c400: 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70  ITE_NOMEM).  App
c410: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a  ropriate error.*
c420: 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75  * codes are retu
c430: 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65  rned for all the
c440: 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f  se occasions.  O
c450: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c  therwise,.** SQL
c460: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
c470: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
c480: 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  epager_rollback(
c490: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
c4a0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
c4b0: 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69  !pPager->dirtyFi
c4c0: 6c 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a  le || !pPager->j
c4d0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
c4e0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
c4f0: 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
c500: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
c510: 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72  Size = -1;.    r
c520: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
c530: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
c540: 61 73 6b 21 3d 30 20 26 26 20 70 50 61 67 65 72  ask!=0 && pPager
c550: 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47 45 52  ->errMask!=PAGER
c560: 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  _ERR_FULL ){.   
c570: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
c580: 74 65 3e 3d 53 51 4c 49 54 45 5f 57 52 49 54 45  te>=SQLITE_WRITE
c590: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 61  LOCK ){.      pa
c5a0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
c5b0: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
c5c0: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
c5d0: 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
c5e0: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
c5f0: 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 57 52  state!=SQLITE_WR
c600: 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ITELOCK ){.    r
c610: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c620: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61 67 65  .  }.  rc = page
c630: 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
c640: 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
c650: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
c660: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
c670: 50 54 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  PT;.    pPager->
c680: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
c690: 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20  _ERR_CORRUPT;.  
c6a0: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  }.  pPager->dbSi
c6b0: 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  ze = -1;.  retur
c6c0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
c6d0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
c6e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c6f0: 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f  is opened read-o
c700: 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  nly.  Return FAL
c710: 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74  SE.** if the dat
c720: 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65  abase is (in the
c730: 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a  ory) writable..*
c740: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
c750: 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  r_isreadonly(Pag
c760: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
c770: 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
c780: 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
c790: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
c7a0: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
c7b0: 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
c7c0: 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c  nly..*/.int *sql
c7d0: 69 74 65 70 61 67 65 72 5f 73 74 61 74 73 28 50  itepager_stats(P
c7e0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
c7f0: 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 39 5d   static int a[9]
c800: 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65  ;.  a[0] = pPage
c810: 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20  r->nRef;.  a[1] 
c820: 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b  = pPager->nPage;
c830: 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72  .  a[2] = pPager
c840: 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d  ->mxPage;.  a[3]
c850: 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
c860: 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67  e;.  a[4] = pPag
c870: 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35  er->state;.  a[5
c880: 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  ] = pPager->errM
c890: 61 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50  ask;.  a[6] = pP
c8a0: 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b  ager->nHit;.  a[
c8b0: 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69  7] = pPager->nMi
c8c0: 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61  ss;.  a[8] = pPa
c8d0: 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72 65  ger->nOvfl;.  re
c8e0: 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn a;.}../*.**
c8f0: 20 53 65 74 20 74 68 65 20 63 68 65 63 6b 70 6f   Set the checkpo
c900: 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  int..**.** This 
c910: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62  routine should b
c920: 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  e called with th
c930: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
c940: 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a  urnal already.**
c950: 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 63 68   open.  A new ch
c960: 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
c970: 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74   is created that
c980: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
c990: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e  rollback.** chan
c9a0: 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ges of a single 
c9b0: 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68  SQL command with
c9c0: 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e  in a larger tran
c9d0: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
c9e0: 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74  sqlitepager_ckpt
c9f0: 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  _begin(Pager *pP
ca00: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
ca10: 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51  .  char zTemp[SQ
ca20: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
ca30: 5a 45 5d 3b 0a 20 20 69 66 28 20 21 70 50 61 67  ZE];.  if( !pPag
ca40: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
ca50: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  ){.    pPager->c
ca60: 6b 70 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b  kptAutoopen = 1;
ca70: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ca80: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
ca90: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
caa0: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 61 73  rnalOpen );.  as
cab0: 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 63  sert( !pPager->c
cac0: 6b 70 74 49 6e 55 73 65 20 29 3b 0a 20 20 70 50  kptInUse );.  pP
cad0: 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 3d 20  ager->aInCkpt = 
cae0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
caf0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
cb00: 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67   1 );.  if( pPag
cb10: 65 72 2d 3e 61 49 6e 43 6b 70 74 3d 3d 30 20 29  er->aInCkpt==0 )
cb20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 52 65  {.    sqliteOsRe
cb30: 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  adLock(&pPager->
cb40: 66 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  fd);.    return 
cb50: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
cb60: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f  }.  rc = sqliteO
cb70: 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65  sFileSize(&pPage
cb80: 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
cb90: 3e 63 6b 70 74 4a 53 69 7a 65 29 3b 0a 20 20 69  >ckptJSize);.  i
cba0: 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6b 70  f( rc ) goto ckp
cbb0: 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
cbc0: 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69    pPager->ckptSi
cbd0: 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
cbe0: 69 7a 65 3b 0a 20 20 69 66 28 20 21 70 50 61 67  ize;.  if( !pPag
cbf0: 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 29 7b 0a  er->ckptOpen ){.
cc00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70      rc = sqlitep
cc10: 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54  ager_opentemp(zT
cc20: 65 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e 63 70  emp, &pPager->cp
cc30: 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  fd);.    if( rc 
cc40: 29 20 67 6f 74 6f 20 63 6b 70 74 5f 62 65 67 69  ) goto ckpt_begi
cc50: 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50  n_failed;.    pP
cc60: 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 3d  ager->ckptOpen =
cc70: 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   1;.  }.  pPager
cc80: 2d 3e 63 6b 70 74 49 6e 55 73 65 20 3d 20 31 3b  ->ckptInUse = 1;
cc90: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
cca0: 5f 4f 4b 3b 0a 20 0a 63 6b 70 74 5f 62 65 67 69  _OK;. .ckpt_begi
ccb0: 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  n_failed:.  if( 
ccc0: 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20  pPager->aInCkpt 
ccd0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
cce0: 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70  e(pPager->aInCkp
ccf0: 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  t);.    pPager->
cd00: 61 49 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 7d  aInCkpt = 0;.  }
cd10: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
cd20: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
cd30: 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 69  checkpoint..*/.i
cd40: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63  nt sqlitepager_c
cd50: 6b 70 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72  kpt_commit(Pager
cd60: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
cd70: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55   pPager->ckptInU
cd80: 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  se ){.    PgHdr 
cd90: 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
cda0: 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26    sqliteOsSeek(&
cdb0: 70 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 30 29  pPager->cpfd, 0)
cdc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 54 72  ;.    sqliteOsTr
cdd0: 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e  uncate(&pPager->
cde0: 63 70 66 64 2c 20 30 29 3b 0a 20 20 20 20 70 50  cpfd, 0);.    pP
cdf0: 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20  ager->ckptInUse 
ce00: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  = 0;.    sqliteF
ce10: 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ree( pPager->aIn
ce20: 43 6b 70 74 20 29 3b 0a 20 20 20 20 70 50 61 67  Ckpt );.    pPag
ce30: 65 72 2d 3e 61 49 6e 43 6b 70 74 20 3d 20 30 3b  er->aInCkpt = 0;
ce40: 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
ce50: 67 65 72 2d 3e 70 43 6b 70 74 3b 20 70 50 67 3b  ger->pCkpt; pPg;
ce60: 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20   pPg=pNext){.   
ce70: 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
ce80: 70 4e 65 78 74 43 6b 70 74 3b 0a 20 20 20 20 20  pNextCkpt;.     
ce90: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
cea0: 43 6b 70 74 20 29 3b 0a 20 20 20 20 20 20 70 50  Ckpt );.      pP
ceb0: 67 2d 3e 69 6e 43 6b 70 74 20 3d 20 30 3b 0a 20  g->inCkpt = 0;. 
cec0: 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 43       pPg->pPrevC
ced0: 6b 70 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  kpt = pPg->pNext
cee0: 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Ckpt = 0;.    }.
cef0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 43 6b 70      pPager->pCkp
cf00: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 0;.  }.  pPa
cf10: 67 65 72 2d 3e 63 6b 70 74 41 75 74 6f 6f 70 65  ger->ckptAutoope
cf20: 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
cf30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
cf40: 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 63  .** Rollback a c
cf50: 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e  heckpoint..*/.in
cf60: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b  t sqlitepager_ck
cf70: 70 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65  pt_rollback(Page
cf80: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
cf90: 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67  t rc;.  if( pPag
cfa0: 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 29 7b  er->ckptInUse ){
cfb0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
cfc0: 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 28 70 50  ckpt_playback(pP
cfd0: 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  ager);.    sqlit
cfe0: 65 70 61 67 65 72 5f 63 6b 70 74 5f 63 6f 6d 6d  epager_ckpt_comm
cff0: 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  it(pPager);.  }e
d000: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
d010: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
d020: 50 61 67 65 72 2d 3e 63 6b 70 74 41 75 74 6f 6f  Pager->ckptAutoo
d030: 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  pen = 0;.  retur
d040: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
d050: 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
d060: 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e  * Print a listin
d070: 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e  g of all referen
d080: 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68  ced pages and th
d090: 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a  eir ref count..*
d0a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67  /.void sqlitepag
d0b0: 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72  er_refdump(Pager
d0c0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
d0d0: 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70  dr *pPg;.  for(p
d0e0: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
d0f0: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
d100: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66  NextAll){.    if
d110: 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pPg->nRef<=0 )
d120: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
d130: 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20  rintf("PAGE %3d 
d140: 61 64 64 72 3d 30 78 25 30 38 78 20 6e 52 65 66  addr=0x%08x nRef
d150: 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  =%d\n", .       
d160: 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29  pPg->pgno, (int)
d170: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
d180: 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a  g), pPg->nRef);.
d190: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a             }.}.#endif.